Pular para o conteúdo principal

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.

Python
# 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.

Python
from unitycatalog.ai.core.databricks import DatabricksFunctionClient

client = DatabricksFunctionClient()

Defina a lógica da ferramenta

As ferramentas do Unity Catalog são, na verdade, apenas funções definidas pelo usuário (UDFs) do Unity Catalog sob o capô. Quando o senhor define uma ferramenta Unity Catalog, está registrando uma função em Unity Catalog. Para saber mais sobre as UDFs do Unity Catalog, consulte Funções definidas pelo usuário (UDFs) no Unity Catalog.

O senhor pode criar funções do Unity Catalog 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. Consulte Criar funções Python.

Use a API create_python_function para criar a função.

Para tornar um chamável Python reconhecível no modelo de dados de funções do Unity Catalog, sua função deve atender aos seguintes requisitos:

  • 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. Consulte Tipos de dados compatíveis com o Spark.

  • 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.
  • Importações de dependência : biblioteca deve ser importada dentro do corpo da função. As importações fora da função não serão resolvidas ao executar a ferramenta.

Os trechos de código a seguir usam o create_python_function para registrar o Python chamável add_numbers:

Python

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 verificar se ela funciona conforme o esperado. Especifique um nome de função totalmente qualificado no endereço execute_function API para executar a função:

Python
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 em diferentes gerações AI biblioteca e adiciona recursos úteis, como o rastreamento automático para recuperadores.

Python
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.

Python
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?"})

Melhore a chamada de ferramentas com documentação clara

Uma boa documentação ajuda seus agentes a saber quando e como usar cada ferramenta. Siga estas práticas recomendadas para documentar suas ferramentas:

  • Para as funções do Unity Catalog, use a cláusula COMMENT para descrever a funcionalidade e os parâmetros da ferramenta.
  • Defina claramente as entradas e saídas esperadas.
  • Escreva descrições significativas para facilitar o uso das ferramentas por agentes e humanos.

Exemplo: documentação eficaz da ferramenta

O exemplo a seguir mostra claramente COMMENT strings para uma ferramenta que consulta uma tabela estruturada.

SQL
CREATE OR REPLACE FUNCTION main.default.lookup_customer_info(
customer_name STRING COMMENT 'Name of the customer whose info to look up.'
)
RETURNS STRING
COMMENT 'Returns metadata about a specific customer including their email and ID.'
RETURN SELECT CONCAT(
'Customer ID: ', customer_id, ', ',
'Customer Email: ', customer_email
)
FROM main.default.customer_data
WHERE customer_name = customer_name
LIMIT 1;

Exemplo: documentação ineficaz da ferramenta

O exemplo a seguir carece de detalhes importantes, dificultando o uso eficaz da ferramenta pelos agentes:

SQL
CREATE OR REPLACE FUNCTION main.default.lookup_customer_info(
customer_name STRING COMMENT 'Name of the customer.'
)
RETURNS STRING
COMMENT 'Returns info about a customer.'
RETURN SELECT CONCAT(
'Customer ID: ', customer_id, ', ',
'Customer Email: ', customer_email
)
FROM main.default.customer_data
WHERE customer_name = customer_name
LIMIT 1;

Executar funções usando serverless ou o modo local

Quando um serviço de geração AI determina que uma chamada de ferramenta é necessária, o pacote de integração (instânciasUCFunctionToolkit ) executa o DatabricksFunctionClient.execute_function API.

A chamada execute_function pode executar funções em dois modos de execução: serverless ou local. Esse modo determina qual recurso executará a função.

modo sem servidor para produção

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.

Python
# 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:

  1. 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.
  2. O DatabricksFunctionClient extrai a definição da função e valida os nomes e tipos dos parâmetros.
  3. O DatabricksFunctionClient envia a execução como um UDF para uma instância serverless.

Modo local para desenvolvimento

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:

  1. 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.
  2. Extrai a definição do chamável Python, armazena em cache o chamável localmente e valida os nomes e os tipos dos parâmetros.
  3. Invoca o callable com os parâmetros especificados em um subprocesso restrito com proteção de tempo limite.
Python
# 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

EXECUTOR_MAX_CPU_TIME_LIMIT

10 Segundos

Tempo máximo permitido de execução da CPU (somente no modo local).

EXECUTOR_MAX_MEMORY_LIMIT

100 MB

Alocação máxima permitida de memória virtual para o processo (somente no modo local).

EXECUTOR_TIMEOUT

20 Segundos

Tempo máximo total do relógio de parede (somente no modo local).

UCAI_DATABRICKS_SESSION_RETRY_MAX_ATTEMPTS

5

O número máximo de tentativas para tentar atualizar novamente o cliente de sessão em caso de expiração dos tokens.

UCAI_DATABRICKS_SERVERLESS_EXECUTION_RESULT_ROW_LIMIT

100

O número máximo de linhas a serem retornadas ao executar funções usando serverless compute e databricks-connect.

Próximas etapas