Autor AI agentes em código
Esta página mostra como criar um agente AI em Python usando o Mosaic AI Agent Framework e uma biblioteca popular de autoria de agentes, como LangGraph, PyFunc e OpenAI.
Requisitos
A Databricks recomenda instalar a versão mais recente do cliente MLflow Python ao desenvolver agentes.
Para criar e implantar agentes usando a abordagem desta página, instale o seguinte:
databricks-agents
0.16.0 ou acimamlflow
2.20.2 ou acima- Python 3,10 ou acima.
- Para atender a esse requisito, o senhor pode usar serverless compute ou Databricks Runtime 13.3 LTS ou acima.
%pip install -U -qqqq databricks-agents>=0.16.0 mlflow>=2.20.2
Databricks também recomenda a instalação do pacote de integração Databricks AI Bridge ao criar agentes. Esses pacotes de integração (como databricks-langchain
, databricks-openai
) fornecem uma camada compartilhada de APIs para interagir com Databricks AI recurso, como Databricks AI/BI Genie e Vector Search, em estruturas de criação de agentes e SDKs.
- LangChain/LangGraph
- OpenAI
- Pure Python agents
%pip install -U -qqqq databricks-langchain
%pip install -U -qqqq databricks-openai
%pip install -U -qqqq databricks-ai-bridge
Use ChatAgent
para criar agentes
A Databricks recomenda a interface MLflow ChatAgent
para criar agentes de nível de produção. Essa especificação do esquema de bate-papo é semelhante, mas não estritamente compatível com, o esquema OpenAI ChatCompletion
.
ChatAgent
oferece os seguintes benefícios:
-
Capacidades avançadas de agente
- Suporte multiagente
- transmissão de saída : Possibilite experiências interativas para o usuário por meio da transmissão da saída em partes menores.
- Histórico abrangente de mensagens de tool-calling : Retorna várias mensagens, inclusive mensagens intermediárias de chamadas de ferramentas, para melhorar a qualidade e o gerenciamento de conversas.
- Suporte para confirmação de chamadas de ferramentas
-
Desenvolvimento, implantação e monitoramento simplificados
- Crie seu agente usando qualquer estrutura : Envolva qualquer agente existente usando a interface
ChatAgent
para obter compatibilidade imediata com AI Playground, Avaliação de agentes e Monitoramento de agentes. - Interfaces de criação digitadas : Escreva o código do agente usando classes Python digitadas, beneficiando-se do preenchimento automático do IDE e do Notebook.
- Inferência automática de assinaturas : O MLflow infere automaticamente assinaturas
ChatAgent
ao registrar o agente, simplificando o registro e a implantação. Consulte Inferir assinatura do modelo durante o registro. - AI Tabelas de inferência aprimoradas pelo gateway : AI As tabelas de inferência do gateway são ativadas automaticamente para agentes implantados, fornecendo acesso a solicitações detalhadas log metadados.
- Crie seu agente usando qualquer estrutura : Envolva qualquer agente existente usando a interface
Para saber como criar um ChatAgent
, consulte os exemplos na seção a seguir e a documentação do MLflow - O que é a interface do ChatAgent.
E se eu já tiver um agente?
Se o senhor já tiver um agente criado com LangChain, LangGraph ou uma estrutura semelhante, não precisará reescrever o agente para usá-lo no Databricks. Em vez disso, basta envolver seu agente existente com a interface ChatAgent
do MLflow:
-
Escreva uma classe envolvente em Python que herda de
mlflow.pyfunc.ChatAgent
.Dentro da classe wrapper, mantenha seu agente existente como um atributo
self.agent = your_existing_agent
. -
A classe
ChatAgent
exige que o senhor implemente um métodopredict
para lidar com solicitações que não sejam de transmissão.predict
deve aceitar:-
messages: list[ChatAgentMessage]
, que é uma lista deChatAgentMessage
, cada um com uma função (como " user " ou " assistant "), o prompt e um ID. -
(Opcional)
context: Optional[ChatContext]
ecustom_inputs: Optional[dict]
para dados extras.
Pythonimport uuid
# input example
[
ChatAgentMessage(
id=str(uuid.uuid4()), # Generate a unique ID for each message
role="user",
content="What's the weather in Paris?"
)
]predict
deve retornar umChatAgentResponse
.Pythonimport uuid
# output example
ChatAgentResponse(
messages=[
ChatAgentMessage(
id=str(uuid.uuid4()), # Generate a unique ID for each message
role="assistant",
content="It's sunny in Paris."
)
]
) -
-
Converter entre formatos
Em
predict
, converta as mensagens recebidas delist[ChatAgentMessage]
no formato de entrada que seu agente espera.Depois que seu agente gerar uma resposta, converta sua saída em um ou mais objetos
ChatAgentMessage
e envolva-os emChatAgentResponse
.
Converta automaticamente a saída LangChain
Se o senhor estiver usando um agente LangChain, poderá usar o mlflow.langchain.output_parsers.ChatAgentOutputParser
para converter automaticamente as saídas do LangChain no esquema do MLflow ChatAgentMessage
e ChatAgentResponse
.
A seguir, um padrão simplificado para a conversão de seu agente:
from mlflow.pyfunc import ChatAgent
from mlflow.types.agent import ChatAgentMessage, ChatAgentResponse, ChatAgentChunk
import uuid
class MyWrappedAgent(ChatAgent):
def __init__(self, agent):
self.agent = agent
def predict(self, messages, context=None, custom_inputs=None):
# Convert messages to your agent's format
agent_input = ... # build from messages
agent_output = self.agent.invoke(agent_input)
# Convert output to ChatAgentMessage
return ChatAgentResponse(
messages=[ChatAgentMessage(role="assistant", content=agent_output, id=str(uuid.uuid4()),)]
)
def predict_stream(self, messages, context=None, custom_inputs=None):
# If your agent supports streaming
for chunk in self.agent.stream(...):
yield ChatAgentChunk(delta=ChatAgentMessage(role="assistant", content=chunk, id=str(uuid.uuid4())))
Para obter exemplos completos, consulte o Notebook na seção a seguir.
Exemplos deChatAgent
O seguinte Notebook mostra como criar transmissão e não-transmissão ChatAgents
usando a popular biblioteca OpenAI, LangGraph e AutoGen.
- LangGraph
- OpenAI
- AutoGen
- DSPy
Se o senhor estiver usando um agente LangChain, poderá usar o mlflow.langchain.output_parsers.ChatAgentOutputParser
para converter automaticamente as saídas do LangChain no esquema do MLflow ChatAgentMessage
e ChatAgentResponse
.
Agente de chamada de ferramentas LangGraph
Agente de chamada de ferramentas OpenAI
Ferramenta da API de respostas da OpenAI - agente de chamadas
Agente somente de bate-papo OpenAI
Para saber como expandir os recursos desses agentes adicionando ferramentas, consulte AI agent tools.
Exemplo de multiagente
Para saber como criar um sistema multiagentes usando o Genie, consulte Usar o Genie em sistemas multiagentes.
agentes de transmissão de saída
Os agentes de transmissão fornecem respostas em uma transmissão contínua de partes menores e incrementais. A transmissão reduz a latência percebida e melhora a experiência do usuário para agentes de conversação.
Para criar uma transmissão ChatAgent
, defina um método predict_stream
que retorne um gerador que produza objetos ChatAgentChunk
- cada ChatAgentChunk
contém uma parte da resposta. Leia mais sobre o comportamento ideal da transmissão ChatAgent
nos documentosMLflow.
O código a seguir mostra um exemplo de função predict_stream
. Para obter exemplos completos de agentes de transmissão, consulte Exemplos de ChatAgent:
def predict_stream(
self,
messages: list[ChatAgentMessage],
context: Optional[ChatContext] = None,
custom_inputs: Optional[dict[str, Any]] = None,
) -> Generator[ChatAgentChunk, None, None]:
# Convert messages to a format suitable for your agent
request = {"messages": self._convert_messages_to_dict(messages)}
# Stream the response from your agent
for event in self.agent.stream(request, stream_mode="updates"):
for node_data in event.values():
# Yield each chunk of the response
yield from (
ChatAgentChunk(**{"delta": msg}) for msg in node_data["messages"]
)
Author deployment-ready ChatAgent
s for Databricks servindo modelo
Databricks implantado ChatAgent
s em um ambiente distribuído em Databricks servindo modelo, o que significa que, durante uma conversa com vários turnos, a mesma réplica de serviço pode não atender a todas as solicitações. Preste atenção às seguintes implicações para gerenciar o estado do agente:
-
Evite o armazenamento em cache local : ao implantar um
ChatAgent
, não presuma que a mesma réplica atenderá a todas as solicitações em uma conversa com vários turnos. Reconstrua o estado interno usando um esquemaChatAgentRequest
do dicionário para cada turno. -
Estado de thread-safe: projete o estado do agente para que seja seguro para thread-safe, evitando conflitos em ambientes com vários segmentos.
-
Inicializar estado na função
predict
: Inicialize o estado sempre que a funçãopredict
for chamada, não durante a inicializaçãoChatAgent
. O armazenamento de estado no nívelChatAgent
poderia vazar informações entre as conversas e causar conflitos, pois uma única réplicaChatAgent
poderia lidar com solicitações de várias conversas.
Entradas e saídas personalizadas
Alguns cenários podem exigir entradas adicionais do agente, como client_type
e session_id
, ou saídas como links de fontes de recuperação que não devem ser incluídos no histórico do chat para interações futuras.
Para esses cenários, o MLflow ChatAgent
suporta nativamente os campos custom_inputs
e custom_outputs
.
Atualmente, o aplicativo Agent Evaluation Review não oferece suporte à renderização de rastreamentos para agentes com campos de entrada adicionais.
Consulte o Notebook a seguir para saber como definir entradas e saídas personalizadas.
Agente de esquema personalizado OpenAI + PyFunc Notebook
Agente de esquema personalizado LangGraph Notebook
Fornecer custom_inputs
no AI Playground e no aplicativo de avaliação de agentes
Se o seu agente aceitar entradas adicionais usando o campo custom_inputs
, o senhor poderá fornecer manualmente essas entradas no AI Playground e no aplicativo de avaliação do agente.
-
No AI Playground ou no aplicativo Agent Review, selecione o ícone de engrenagem
.
-
Habilite custom_inputs .
-
Forneça um objeto JSON que corresponda ao esquema de entrada definido pelo seu agente.
Especifique esquemas de recuperação personalizados
AI Os agentes geralmente usam recuperadores para localizar e consultar dados não estruturados de índices de pesquisa de vetores. Por exemplo, ferramentas de recuperação, consulte Criar e rastrear ferramentas de recuperação para dados não estruturados.
Rastreie esses recuperadores dentro de seu agente com MLflow RETRIEVER spans para permitir Databricks produto recurso, incluindo:
- Exibição automática de links para documentos de origem recuperados na interface do usuário do AI Playground
- Executando automaticamente juízes de fundamentação e relevância de recuperação na Avaliação de Agentes
Databricks recomenda o uso de ferramentas retriever fornecidas por Databricks AI Bridge pacote como databricks_langchain.VectorSearchRetrieverTool
e databricks_openai.VectorSearchRetrieverTool
porque elas já estão em conformidade com o esquema retriever MLflow. Consulte Desenvolver localmente ferramentas de recuperação do Vector Search com o AI Bridge.
Se seu agente incluir extensões de retriever com um esquema personalizado, chame mlflow.models.set_retriever_schema quando você define seu agente em código. Isso mapeia as colunas de saída do seu retriever para os campos esperados do MLflow (primary_key
, text_column
, doc_uri
).
import mlflow
# Define the retriever's schema by providing your column names
# For example, the following call specifies the schema of a retriever that returns a list of objects like
# [
# {
# 'document_id': '9a8292da3a9d4005a988bf0bfdd0024c',
# 'chunk_text': 'MLflow is an open-source platform, purpose-built to assist machine learning practitioners...',
# 'doc_uri': 'https://mlflow.org/docs/latest/index.html',
# 'title': 'MLflow: A Tool for Managing the Machine Learning Lifecycle'
# },
# {
# 'document_id': '7537fe93c97f4fdb9867412e9c1f9e5b',
# 'chunk_text': 'A great way to get started with MLflow is to use the autologging feature. Autologging automatically logs your model...',
# 'doc_uri': 'https://mlflow.org/docs/latest/getting-started/',
# 'title': 'Getting Started with MLflow'
# },
# ...
# ]
mlflow.models.set_retriever_schema(
# Specify the name of your retriever span
name="mlflow_docs_vector_search",
# Specify the output column name to treat as the primary key (ID) of each retrieved document
primary_key="document_id",
# Specify the output column name to treat as the text content (page content) of each retrieved document
text_column="chunk_text",
# Specify the output column name to treat as the document URI of each retrieved document
doc_uri="doc_uri",
# Specify any other columns returned by the retriever
other_columns=["title"],
)
A coluna doc_uri
é especialmente importante ao avaliar o desempenho do retriever. doc_uri
é o identificador principal dos documentos retornados pelo recuperador, permitindo compará-los com os conjuntos de avaliação da verdade básica. Consulte Conjuntos de avaliação (legados).
Parametrize o código do agente para implantação em todos os ambientes
Você pode parametrizar o código do agente para reutilizar o mesmo código do agente em diferentes ambientes.
Os parâmetros são pares chave-valor que você define em um dicionário no Python ou em um arquivo .yaml
.
Para configurar o código, crie um ModelConfig
usando um dicionário Python ou um arquivo .yaml
. ModelConfig
é um conjunto de parâmetros key-value que permite o gerenciamento flexível da configuração. Por exemplo, o senhor pode usar um dicionário durante o desenvolvimento e, em seguida, convertê-lo em um arquivo .yaml
para implantação de produção e CI/CD.
Para obter detalhes sobre ModelConfig
, consulte a documentação do MLflow.
Um exemplo ModelConfig
é mostrado abaixo:
llm_parameters:
max_tokens: 500
temperature: 0.01
model_serving_endpoint: databricks-meta-llama-3-3-70b-instruct
vector_search_index: ml.docs.databricks_docs_index
prompt_template: 'You are a hello world bot. Respond with a reply to the user''s
question that indicates your prompt template came from a YAML file. Your response
must use the word "YAML" somewhere. User''s question: {question}'
prompt_template_input_vars:
- question
No código do agente, o senhor pode fazer referência a uma configuração default (desenvolvimento) do arquivo ou dicionário .yaml
:
import mlflow
# Example for loading from a .yml file
config_file = "configs/hello_world_config.yml"
model_config = mlflow.models.ModelConfig(development_config=config_file)
# Example of using a dictionary
config_dict = {
"prompt_template": "You are a hello world bot. Respond with a reply to the user's question that is fun and interesting to the user. User's question: {question}",
"prompt_template_input_vars": ["question"],
"model_serving_endpoint": "databricks-meta-llama-3-3-70b-instruct",
"llm_parameters": {"temperature": 0.01, "max_tokens": 500},
}
model_config = mlflow.models.ModelConfig(development_config=config_dict)
# Use model_config.get() to retrieve a parameter value
# You can also use model_config.to_dict() to convert the loaded config object
# into a dictionary
value = model_config.get('sample_param')
Em seguida, ao registrar o agente, especifique o parâmetro model_config
como log_model
para
especificar um conjunto personalizado de parâmetros a serem usados ao carregar o agente de registros. Consulte
Documentação do MLflow - ModelConfig.
transmissão propagação de erros
Mosaic AI propagação de quaisquer erros encontrados durante a transmissão com os últimos tokens em databricks_output.error
. Cabe ao cliente chamador tratar e revelar adequadamente esse erro.
{
"delta": …,
"databricks_output": {
"trace": {...},
"error": {
"error_code": BAD_REQUEST,
"message": "TimeoutException: Tool XYZ failed to execute."
}
}
}