Criar ferramentas personalizadas do agente AI com funções Unity Catalog
Use as funções Unity Catalog para criar ferramentas de agente AI que executam lógica personalizada e realizam tarefas específicas que ampliam os recursos dos LLMs além da geração de linguagem.
Requisitos
- Uma conexão serverless compute para criar funções Unity Catalog escritas usando instruções de função de criação de corpo SQL. Python As funções não requerem serverless compute.
- Use o Databricks Runtime 15.0 e o acima.
Crie uma ferramenta de agente
Neste exemplo, o senhor cria uma ferramenta do Unity Catalog, testa sua funcionalidade e a adiciona a um agente. Execute o seguinte código em um Notebook Databricks.
Instalar dependências
Instale o pacote Unity Catalog AI com o extra [databricks]
e instale o pacote de integração Databricks-LangChain.
Este exemplo usa o site LangChain, mas uma abordagem semelhante pode ser aplicada a outras bibliotecas. Consulte Integrar ferramentas Unity Catalog com estruturas geradoras de AI de terceiros.
# Install Unity Catalog AI integration packages with the Databricks extra
%pip install unitycatalog-ai[databricks]
%pip install unitycatalog-langchain[databricks]
# Install the Databricks LangChain integration package
%pip install databricks-langchain
dbutils.library.restartPython()
Inicializar o cliente da função Databricks
Inicialize o Databricks Function Client, que é uma interface especializada para criar, gerenciar e executar funções do Unity Catalog no Databricks.
from unitycatalog.ai.core.databricks import DatabricksFunctionClient
client = DatabricksFunctionClient()
Defina a lógica da ferramenta
Crie uma função do Unity Catalog que contenha a lógica da ferramenta.
O senhor pode criar funções Python usando uma das duas APIs:
create_python_function
aceita um chamável Python.create_function
aceita uma instrução de função de criação de corpo SQL.
Use a API create_python_function
para criar a função. Lembre-se de que há alguns requisitos para o uso bem-sucedido dessa API:
- Dicas de tipo: A assinatura da função deve definir dicas de tipo Python válidas. Tanto os argumentos nomeados quanto o valor de retorno devem ter seus tipos definidos.
- Não use argumentos variáveis: argumentos variáveis como
*args
e**kwargs
não são suportados. Todos os argumentos devem ser definidos explicitamente. - Compatibilidade de tipos: Nem todos os tipos Python são compatíveis com o SQL.
- Docstrings descritivos: O kit de ferramentas das funções Unity Catalog lê, analisa e extrai informações importantes de sua docstring.
- As docstrings devem ser formatadas de acordo com a sintaxe docstring do Google.
- Escreva descrições claras para sua função e seus argumentos para ajudar o LLM a entender como e quando usar a função.
Para obter mais informações, consulte a documentaçãoUnity Catalog - Creating functions from Python callables.
CATALOG = "my_catalog"
SCHEMA = "my_schema"
def add_numbers(number_1: float, number_2: float) -> float:
"""
A function that accepts two floating point numbers adds them,
and returns the resulting sum as a float.
Args:
number_1 (float): The first of the two numbers to add.
number_2 (float): The second of the two numbers to add.
Returns:
float: The sum of the two input numbers.
"""
return number_1 + number_2
function_info = client.create_python_function(
func=add_numbers,
catalog=CATALOG,
schema=SCHEMA,
replace=True
)
Teste a função
Teste sua função para garantir que ela funcione conforme o esperado:
result = client.execute_function(
function_name=f"{CATALOG}.{SCHEMA}.add_numbers",
parameters={"number_1": 36939.0, "number_2": 8922.4}
)
result.value # OUTPUT: '45861.4'
Envolva a função usando o UCFunctionToolkit
Envolva a função usando o endereço UCFunctionToolkit
para torná-la acessível à biblioteca de autoria do agente. O kit de ferramentas garante a consistência entre diferentes bibliotecas e acrescenta recursos úteis, como o rastreamento automático para recuperadores.
from databricks_langchain import UCFunctionToolkit
# Create a toolkit with the Unity Catalog function
func_name = f"{CATALOG}.{SCHEMA}.add_numbers"
toolkit = UCFunctionToolkit(function_names=[func_name])
tools = toolkit.tools
Use a ferramenta em um agente
Adicione a ferramenta a um agente LangChain usando a propriedade tools
de UCFunctionToolkit
.
Este exemplo cria um agente simples usando a API AgentExecutor
da LangChain para simplificar. Para cargas de trabalho de produção, use o fluxo de trabalho de criação de agentes visto nos exemplos do siteChatAgent
.
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain.prompts import ChatPromptTemplate
from databricks_langchain import (
ChatDatabricks,
UCFunctionToolkit,
)
import mlflow
# Initialize the LLM (optional: replace with your LLM of choice)
LLM_ENDPOINT_NAME = "databricks-meta-llama-3-3-70b-instruct"
llm = ChatDatabricks(endpoint=LLM_ENDPOINT_NAME, temperature=0.1)
# Define the prompt
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You are a helpful assistant. Make sure to use tools for additional functionality.",
),
("placeholder", "{chat_history}"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
]
)
# Enable automatic tracing
mlflow.langchain.autolog()
# Define the agent, specifying the tools from the toolkit above
agent = create_tool_calling_agent(llm, tools, prompt)
# Create the agent executor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke({"input": "What is 36939.0 + 8922.4?"})
gerenciar Unity Catalog funções
Use o Databricks Function Client para gerenciar as funções do Unity Catalog. O Databricks Function Client é baseado no Unity Catalog Function Client de código aberto, mas oferece vários aprimoramentos exclusivos da Databricks.
Esta página documenta a funcionalidade específica do Databricks Function Client. Para obter informações gerais sobre o gerenciamento das funções do Unity Catalog, consulte a documentação doUnity Catalog - Function client.
Executar funções usando serverless ou o modo local
O senhor pode executar funções com o DatabricksFunctionClient
em dois modos: modo serverless e modo local.
Especifique um nome de função totalmente qualificado no endereço execute_function
API para executar a função. Quando um serviço gen AI determina que uma chamada de ferramenta é necessária para atender a uma solicitação, o pacote de integração (instâncias do kit de ferramentas) chama automaticamente esse API para executar a função.
modo sem servidor
O modo sem servidor é a opção default e recomendada para casos de uso de produção. Ele executa funções remotamente usando um SQL serverless endpoint, garantindo que o processo do seu agente permaneça seguro e livre dos riscos de execução de código arbitrário localmente.
# Defaults to serverless if `execution_mode` is not specified
client = DatabricksFunctionClient(execution_mode="serverless")
Quando seu agente solicita a execução de uma ferramenta no modo serverless acontece o seguinte:
- O site
DatabricksFunctionClient
envia uma solicitação ao Unity Catalog para recuperar a definição da função, caso a definição não tenha sido armazenada em cache localmente. - O
DatabricksFunctionClient
extrai a definição da função e valida os nomes e tipos dos parâmetros. - O
DatabricksFunctionClient
envia a execução como um UDF para uma instância serverless.
Modo local
O modo local foi projetado para desenvolvimento e depuração. Ele executa funções em um subprocesso local em vez de fazer solicitações a um servidor sem servidor SQL endpoint. Isso permite que você solucione problemas de chamadas de ferramentas com mais eficiência, fornecendo rastreamentos de pilha locais.
Quando seu agente solicita a execução de uma ferramenta no modo local , o DatabricksFunctionClient
faz o seguinte:
- Envia uma solicitação ao Unity Catalog para recuperar a definição da função se a definição não tiver sido armazenada em cache localmente.
- Extrai a definição do chamável Python e armazena em cache o chamável localmente, além de validar os nomes e tipos de parâmetros.
- Invoca o callable com os parâmetros especificados em um subprocesso restrito com proteção de tempo limite.
# Defaults to serverless if `execution_mode` is not specified
client = DatabricksFunctionClient(execution_mode="local")
A execução no modo"local"
oferece o seguinte recurso:
-
Limite de tempo de CPU: restringe o tempo de execução total da CPU para execução que pode ser chamada para evitar cargas computacionais excessivas.
O limite de tempo da CPU é baseado no uso real da CPU, não no tempo do relógio de parede. Devido aos processos de programar e concorrente do sistema, o tempo da CPU pode exceder o tempo do relógio de parede em cenários reais.
-
Limite de memória: restringe a memória virtual alocada ao processo.
-
Proteção de tempo limite: impõe um tempo limite total do relógio de parede para executar funções.
Personalize esses limites usando a variável de ambiente (leia mais).
variável de ambiente
Configure a execução das funções no site DatabricksFunctionClient
usando as seguintes variáveis de ambiente:
Variável de ambiente | Valor padrão | Descrição |
---|---|---|
|
| Tempo máximo permitido de execução da CPU (somente no modo local). |
|
| Alocação máxima permitida de memória virtual para o processo (somente no modo local). |
|
| Tempo máximo total do relógio de parede (somente no modo local). |
|
| Número máximo de tentativas para atualizar novamente o cliente de sessão em caso de expiração de tokens. |
|
| Número máximo de linhas ao executar funções usando serverless compute com |