Crie um agente de AI e implante-o no Model Serving
Para novos casos de uso, a Databricks recomenda implantar agentes em Databricks Apps para controle total sobre o código do agente, a configuração do servidor e o fluxo de trabalho de implantação. Consulte Criar um agente de AI e implantá-lo em Databricks Apps. Para migrar um agente existente, consulte Migrar um agente de Model Serving para Databricks Apps.
Esta página mostra como criar um agente de AI em Python usando Custom Agents e bibliotecas populares de criação de agentes como LangGraph e OpenAI.
Requisitos
A Databricks recomenda instalar a versão mais recente do cliente MLflow Python ao desenvolver agentes.
Para desenvolver e implantar agentes usando a abordagem nesta página, instale o seguinte:
databricks-agents1.2.0 ou acimamlflow3,1,3 ou acima- Python 3.10 ou acima.
- Use compute Serverless ou Databricks Runtime 13.3 LTS ou acima para atender a este requisito.
%pip install -U -qqqq databricks-agents mlflow
A Databricks também recomenda a instalação de pacotes de integração Databricks AI Bridge para criar agentes. Esses pacotes de integração fornecem uma camada compartilhada de APIs que interagem com os recursos de Databricks AI, como Genie Agents e AI Search, em todas as estruturas de autoria de agentes e SDKs.
- OpenAI
- LangChain/LangGraph
- DSPy
- Pure Python agents
%pip install -U -qqqq databricks-openai
%pip install -U -qqqq databricks-langchain
%pip install -U -qqqq databricks-dspy
%pip install -U -qqqq databricks-ai-bridge
Use ResponsesAgent para criar agentes
A Databricks recomenda a interface MLflow ResponsesAgent para criar agentes com qualidade de produção. ResponsesAgent permite que você crie agentes com qualquer framework de terceiros e, em seguida, os integre com os recursos de Databricks AI para capacidades robustas de registro, rastreamento, avaliação, implantação e monitoramento.
O esquema ResponsesAgent é compatível com o esquema Responses do OpenAI. Para saber mais sobre o OpenAI Responses, consulte OpenAI: Respostas vs. ChatCompletion.
A interface ChatAgent mais antiga ainda é suportada na Databricks. No entanto, para novos agentes, a Databricks recomenda usar a versão mais recente do MLflow e a interface ResponsesAgent.
Consulte esquema de agente de entrada e saída legado (Model Serving).
ResponsesAgent oferece os seguintes benefícios:
-
Capacidades avançadas do agente
- Suporte multiagente
- Saída de transmissão : Transmita a saída em blocos menores.
- **Histórico abrangente de mensagens de chamada de ferramenta**: Retorne várias mensagens, incluindo mensagens intermediárias de chamada de ferramenta, para melhor qualidade e gerenciamento de conversas.
- Suporte à confirmação de chamada de ferramenta
- Suporte a ferramentas de longa duração
-
Desenvolvimento, implantação e monitoramento otimizados
- Crie agentes usando qualquer estrutura : encapsule qualquer agente existente usando a interface
ResponsesAgentpara obter compatibilidade pronta para uso com o AI Playground, Agent Evaluation e Monitoramento de Agentes. - Interfaces de Autoria Tipadas: escrever código de agente usando classes Python tipadas, beneficiando-se de IDE e preenchimento automático de notebook.
- **Inferência automática de assinatura**: o MLflow infere automaticamente
ResponsesAgentassinaturas ao registrar um agente, simplificando o registro e a implantação. Consulte Inferir assinatura do modelo durante o registro. - Rastreamento automático: O MLflow rastreia automaticamente
predictpredict_streamas suas funções e, agregando as respostas de transmissão para facilitar a avaliação e a exibição. - Tabelas de inferência aprimoradas do AI Gateway : as tabelas de inferência do AI Gateway são habilitadas automaticamente para agentes implantados, fornecendo acesso a metadados detalhados de log de solicitação.
- Crie agentes usando qualquer estrutura : encapsule qualquer agente existente usando a interface
Para saber como criar um ResponsesAgent, consulte os exemplos na seção a seguir e a documentação do MLflow - ResponsesAgent para Model Serving.
ResponsesAgent exemplos
Os Notebooks a seguir mostram como criar ResponsesAgent de transmissão e não transmissão usando bibliotecas populares. Para saber como expandir os recursos desses agentes, consulte Conectar agentes a ferramentas.
- OpenAI
- LangGraph
- DSPy
Agente de chat simples da OpenAI usando modelos hospedados no Databricks
Agente de chamada de ferramenta OpenAI MCP
Agente de chamada de ferramenta OpenAI usando modelos hospedados pelo Databricks
Agente de chamada de ferramenta OpenAI usando modelos hospedados pela OpenAI
Agente de chamada de ferramentas LangGraph MCP
Agente de chamada de ferramenta de turno único do DSPy
Exemplo de multiagente
Para aprender a criar um sistema multiagente, consulte Usar o Genie em sistemas multiagentes (Model Serving).
Exemplo de agente com estado
Para aprender a criar agentes com estado e memória de curto e longo prazo usando o Lakebase como armazenamento de memória, consulte Memória do agente de AI (Model Serving).
Exemplo de agente não-conversacional
Ao contrário dos agentes conversacionais que gerenciam diálogos de várias etapas, os agentes não conversacionais se concentram em executar tarefas bem definidas de forma eficiente. Essa arquitetura otimizada permite um throughput maior para solicitações independentes.
Para aprender a criar um agente não conversacional, consulte Agentes de AI não conversacionais usando MLflow.
E se eu já tiver um agente?
Se você já tem um agente construído com LangChain, LangGraph ou um framework similar, você não precisa reescrever seu agente para usá-lo no Databricks. Em vez disso, basta envolver seu agente existente com a interface ResponsesAgent do MLflow:
-
Escreva uma classe wrapper Python que herda de
mlflow.pyfunc.ResponsesAgent.Dentro da classe wrapper, faça referência ao agente existente como um atributo
self.agent = your_existing_agent. -
A classe
ResponsesAgentrequer a implementação de um métodopredictque retorna umResponsesAgentResponsepara lidar com solicitações sem transmissão. A seguir está um exemplo do esquemaResponsesAgentResponses:Pythonimport uuid
# input as a dict
{"input": [{"role": "user", "content": "What did the data scientist say when their Spark job finally completed?"}]}
# output example
ResponsesAgentResponse(
output=[
{
"type": "message",
"id": str(uuid.uuid4()),
"content": [{"type": "output_text", "text": "Well, that really sparked joy!"}],
"role": "assistant",
},
]
) -
Na função
predict, converta as mensagens recebidas deResponsesAgentRequestpara o formato que o agente espera. Após o agente gerar uma resposta, converta sua saída para um objetoResponsesAgentResponse.
Consulte os exemplos de código a seguir para ver como converter agentes existentes para ResponsesAgent:
- Basic conversion
- Streaming with code re-use
- Migrate from ChatCompletions
Para agentes sem transmissão, converta as entradas e saídas na função predict.
from uuid import uuid4
from mlflow.pyfunc import ResponsesAgent
from mlflow.types.responses import (
ResponsesAgentRequest,
ResponsesAgentResponse,
)
class MyWrappedAgent(ResponsesAgent):
def __init__(self, agent):
# Reference your existing agent
self.agent = agent
def predict(self, request: ResponsesAgentRequest) -> ResponsesAgentResponse:
# Convert incoming messages to your agent's format
# prep_msgs_for_llm is a function you write to convert the incoming messages
messages = self.prep_msgs_for_llm([i.model_dump() for i in request.input])
# Call your existing agent (non-streaming)
agent_response = self.agent.invoke(messages)
# Convert your agent's output to ResponsesAgent format, assuming agent_response is a str
output_item = (self.create_text_output_item(text=agent_response, id=str(uuid4())),)
# Return the response
return ResponsesAgentResponse(output=[output_item])
Para agentes de transmissão, você pode ser inteligente e reutilizar a lógica para evitar duplicar o código que converte mensagens:
from typing import Generator
from uuid import uuid4
from mlflow.pyfunc import ResponsesAgent
from mlflow.types.responses import (
ResponsesAgentRequest,
ResponsesAgentResponse,
ResponsesAgentStreamEvent,
)
class MyWrappedStreamingAgent(ResponsesAgent):
def __init__(self, agent):
# Reference your existing agent
self.agent = agent
def predict(self, request: ResponsesAgentRequest) -> ResponsesAgentResponse:
"""Non-streaming predict: collects all streaming chunks into a single response."""
# Reuse the streaming logic and collect all output items
output_items = []
for stream_event in self.predict_stream(request):
if stream_event.type == "response.output_item.done":
output_items.append(stream_event.item)
# Return all collected items as a single response
return ResponsesAgentResponse(output=output_items)
def predict_stream(
self, request: ResponsesAgentRequest
) -> Generator[ResponsesAgentStreamEvent, None, None]:
"""Streaming predict: the core logic that both methods use."""
# Convert incoming messages to your agent's format
# prep_msgs_for_llm is a function you write to convert the incoming messages, included in full examples linked below
messages = self.prep_msgs_for_llm([i.model_dump() for i in request.input])
# Stream from your existing agent
item_id = str(uuid4())
aggregated_stream = ""
for chunk in self.agent.stream(messages):
# Convert each chunk to ResponsesAgent format
yield self.create_text_delta(delta=chunk, item_id=item_id)
aggregated_stream += chunk
# Emit an aggregated output_item for all the text deltas with id=item_id
yield ResponsesAgentStreamEvent(
type="response.output_item.done",
item=self.create_text_output_item(text=aggregated_stream, id=item_id),
)
Se o seu agente existente usar a API OpenAI ChatCompletions, você poderá migrá-lo para ResponsesAgent sem reescrever sua lógica principal. Adicionar um wrapper que:
- Converte mensagens
ResponsesAgentRequestrecebidas para o formatoChatCompletionsque seu agente espera. - Traduz as saídas
ChatCompletionspara o esquemaResponsesAgentResponse. - Opcionalmente, oferece suporte à transmissão mapeando deltas incrementais de
ChatCompletionsem objetosResponsesAgentStreamEvent.
from typing import Generator
from uuid import uuid4
from databricks.sdk import WorkspaceClient
from mlflow.pyfunc import ResponsesAgent
from mlflow.types.responses import (
ResponsesAgentRequest,
ResponsesAgentResponse,
ResponsesAgentStreamEvent,
)
# Legacy agent that outputs ChatCompletions objects
class LegacyAgent:
def __init__(self):
self.w = WorkspaceClient()
self.OpenAI = self.w.serving_endpoints.get_open_ai_client()
def stream(self, messages):
for chunk in self.OpenAI.chat.completions.create(
model="databricks-claude-sonnet-4-5",
messages=messages,
stream=True,
):
yield chunk.to_dict()
# Wrapper that converts the legacy agent to a ResponsesAgent
class MyWrappedStreamingAgent(ResponsesAgent):
def __init__(self, agent):
# `agent` is your existing ChatCompletions agent
self.agent = agent
def prep_msgs_for_llm(self, messages):
# dummy example of prep_msgs_for_llm
# real example of prep_msgs_for_llm included in full examples linked below
return [{"role": "user", "content": "Hello, how are you?"}]
def predict(self, request: ResponsesAgentRequest) -> ResponsesAgentResponse:
"""Non-streaming predict: collects all streaming chunks into a single response."""
# Reuse the streaming logic and collect all output items
output_items = []
for stream_event in self.predict_stream(request):
if stream_event.type == "response.output_item.done":
output_items.append(stream_event.item)
# Return all collected items as a single response
return ResponsesAgentResponse(output=output_items)
def predict_stream(
self, request: ResponsesAgentRequest
) -> Generator[ResponsesAgentStreamEvent, None, None]:
"""Streaming predict: the core logic that both methods use."""
# Convert incoming messages to your agent's format
messages = self.prep_msgs_for_llm([i.model_dump() for i in request.input])
# process the ChatCompletion output stream
agent_content = ""
tool_calls = []
msg_id = None
for chunk in self.agent.stream(messages): # call the underlying agent's stream method
delta = chunk["choices"][0]["delta"]
msg_id = chunk.get("id", None)
content = delta.get("content", None)
if tc := delta.get("tool_calls"):
if not tool_calls: # only accommodate for single tool call right now
tool_calls = tc
else:
tool_calls[0]["function"]["arguments"] += tc[0]["function"]["arguments"]
elif content is not None:
agent_content += content
yield ResponsesAgentStreamEvent(**self.create_text_delta(content, item_id=msg_id))
# aggregate the streamed text content
yield ResponsesAgentStreamEvent(
type="response.output_item.done",
item=self.create_text_output_item(agent_content, msg_id),
)
for tool_call in tool_calls:
yield ResponsesAgentStreamEvent(
type="response.output_item.done",
item=self.create_function_call_item(
str(uuid4()),
tool_call["id"],
tool_call["function"]["name"],
tool_call["function"]["arguments"],
),
)
agent = MyWrappedStreamingAgent(LegacyAgent())
for chunk in agent.predict_stream(
ResponsesAgentRequest(input=[{"role": "user", "content": "Hello, how are you?"}])
):
print(chunk)
Para exemplos completos, consulte exemplos deResponsesAgent.
Respostas por transmissão
A transmissão permite que os agentes enviem respostas em blocos em tempo real, em vez de esperar pela resposta completa. Para implementar transmissão com ResponsesAgent, emita uma série de eventos delta seguidos por um evento de conclusão final:
- Emitir eventos delta : Envie vários eventos
output_text.deltacom o mesmoitem_idpara transmitir blocos de texto em tempo real. - **Finalizar com evento concluído**: Envie um
response.output_item.doneevento final com o mesmoitem_idque os eventos delta contendo o texto de saída final completo.
Cada evento delta transmite em transmissão um pedaço de texto para o cliente. O evento 'concluído' final contém o texto de resposta completo e sinaliza ao Databricks para fazer o seguinte:
- Rastreie a saída do seu agente com o rastreamento do MLflow
- Agrupar respostas transmitidas em tabelas de inferência do AI Gateway
- Mostrar a saída completa na UI do AI Playground
Propagação de erros de transmissão
O Databricks propaga quaisquer erros encontrados durante a transmissão com o último token em databricks_output.error. Cabe ao cliente chamador tratar e expor adequadamente este erro.
{
"delta": …,
"databricks_output": {
"trace": {...},
"error": {
"error_code": BAD_REQUEST,
"message": "TimeoutException: Tool XYZ failed to execute."
}
}
}
Recursos avançados
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 origem 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 ResponsesAgent suporta nativamente os campos custom_inputs e custom_outputs. É possível acessar as entradas personalizadas via request.custom_inputs em todos os exemplos vinculados acima em ResponsesAgent Examples.
O aplicativo de revisão do Agent Evaluation não oferece suporte para renderização de rastreamentos para agentes com campos de entrada adicionais.
Consulte os notebooks a seguir para saber como definir entradas e saídas personalizadas.
Forneça custom_inputs no AI Playground e revise o aplicativo
Se seu agente aceitar entradas adicionais usando o campo custom_inputs, você poderá fornecer essas entradas manualmente no AI Playground e no aplicativo de revisão.
-
No AI Playground ou no Aplicativo de Revisão de Agentes, selecione o ícone de engrenagem
.
-
Ativar **custom_inputs**.
-
Forneça um objeto JSON que corresponda ao esquema de entrada definido do seu agente.

Especificar esquemas de recuperador personalizados
Agentes de AI comumente usam recuperadores para encontrar e fazer query de dados não estruturados de índices de Pesquisa de AI. Para ver exemplos de ferramentas de recuperador, consulte Conectar agentes a dados não estruturados.
Rastreie estes recuperadores dentro do seu agente com intervalos MLflow RETRIEVER para ativar os recursos do produto Databricks, incluindo:
- Exibindo automaticamente links para documentos de origem recuperados na interface do usuário do AI Playground
- Execução automática de juízes de fundamentação de recuperação e relevância em Agent Evaluation
A Databricks recomenda o uso de ferramentas retriever fornecidas por pacotes da Databricks AI Bridge como databricks_langchain.VectorSearchRetrieverTool e databricks_openai.VectorSearchRetrieverTool, porque elas já estão em conformidade com o esquema de retriever do MLflow. Consulte Desenvolva um retriever localmente usando a AI Bridge.
Se o seu agente incluir intervalos de recuperador com um esquema personalizado, chame mlflow.models.set_retriever_schema ao definir seu agente no código. Isso mapeia as colunas de saída do seu recuperador 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 the largest open source AI engineering platform for agents, LLMs, and ML models...',
# 'doc_uri': 'https://mlflow.org/docs/latest/index.html',
# 'title': 'MLflow: The Largest Open Source AI Engineering Platform'
# },
# {
# '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 recuperador. doc_uri é o principal identificador para documentos retornados pelo recuperador, permitindo compará-los com conjuntos de avaliação de ground truth. Consulte Conjuntos de avaliação (MLflow 2).
Considerações de implantação
Preparar para o Databricks Model Serving
A Databricks implanta ResponsesAgentsem um ambiente distribuído no Databricks Model Serving. Isso significa que, durante uma conversa em várias etapas, a mesma réplica de serviço pode não lidar com todas as solicitações. Observe as seguintes implicações para gerenciar o estado do agente:
-
Evite o cache local: Ao implantar
ResponsesAgentum, não presuma que a mesma réplica lida com todas as solicitações em uma conversa de várias etapas. Reconstrua o estado interno usando um esquema de dicionárioResponsesAgentRequestpara cada turno. -
Estado seguro para threads : projete o estado do agente para ser seguro para threads, evitando conflitos em ambientes com vários threads.
-
**Inicializar o estado na
predictfunção **: Inicialize o estado cada vez que apredictfunção for chamada, não duranteResponsesAgenta inicialização. Armazenar o estado no nívelResponsesAgentpode vazar informações entre conversas e causar conflitos porque uma única réplicaResponsesAgentpode lidar com solicitações de várias conversas.
Parametrizar código para implantação em diferentes ambientes
Parametrize 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 utilizando um dicionário Python ou um arquivo .yaml. ModelConfig é um conjunto de parâmetros chave-valor que permite o gerenciamento flexível da configuração. Por exemplo, você 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.
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
Em seu código de agente, você pode referenciar uma configuração default (de 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 seu agente, especifique o parâmetro model_config em log_model para especificar um conjunto personalizado de parâmetros a ser usado ao carregar o agente registrado. Consulte
documentação do MLflow - ModelConfig.
Use código síncrono ou padrões de retorno de chamada
Para garantir estabilidade e compatibilidade, use código síncrono ou padrões baseados em callback na sua implementação de agente.
A Databricks gerencia automaticamente a comunicação assíncrona para fornecer simultaneidade e desempenho ideais quando um agente é implantado. A introdução de loops de eventos personalizados ou frameworks assíncronos pode levar a erros como RuntimeError: This event loop is already running and caused unpredictable behavior.
O Databricks recomenda evitar a programação assíncrona, como usar asyncio ou criar loops de eventos personalizados, ao desenvolver agentes.