reasoning_engines.LangchainAgent
) para desarrollar una aplicación. En esta sección, explicaremos los pasos para personalizar tu
propia plantilla de aplicación. Esto puede ser útil si tienes necesidades que van
más allá de lo que proporciona la plantilla compilada previamente.
Una plantilla de aplicación en Reasoning Engine se define como una clase de Python. Para
dar un ejemplo, el siguiente código de Python es un ejemplo de una aplicación
LangChain que se puede implementar en Vertex AI (puedes asignar
a la variable CLASS_NAME
un valor como MyAgent
):
from typing import Callable, Sequence
class CLASS_NAME:
def __init__(
self,
model: str,
tools: Sequence[Callable],
project: str,
location: str,
):
self.model_name = model
self.tools = tools
self.project = project
self.location = location
def set_up(self):
"""All unpickle-able logic should go here.
The .set_up() method should not be called for an object that is being
prepared for deployment.
"""
import vertexai
from langchain_google_vertexai import ChatVertexAI
from langchain.agents import AgentExecutor
from langchain.agents.format_scratchpad.tools import format_to_tool_messages
from langchain.agents.output_parsers.tools import ToolsAgentOutputParser
from langchain.tools.base import StructuredTool
from langchain_core import prompts
vertexai.init(project=self.project, location=self.location)
prompt = {
"input": lambda x: x["input"],
"agent_scratchpad": (
lambda x: format_to_tool_messages(x["intermediate_steps"])
),
} | prompts.ChatPromptTemplate.from_messages([
("user", "{input}"),
prompts.MessagesPlaceholder(variable_name="agent_scratchpad"),
])
llm = ChatVertexAI(model_name=self.model_name)
if self.tools:
llm = llm.bind_tools(tools=self.tools)
self.agent_executor = AgentExecutor(
agent=prompt | llm | ToolsAgentOutputParser(),
tools=[StructuredTool.from_function(tool) for tool in self.tools],
)
def query(self, input: str):
"""Query the application.
Args:
input: The user prompt.
Returns:
The output of querying the application with the given input.
"""
return self.agent_executor.invoke(input={"input": input})
Cuando escribes tu clase de Python, los siguientes tres métodos son importantes para el motor de razonamiento:
__init__()
:- Usa este método solo para los parámetros de configuración de la aplicación. Por ejemplo, puedes usar este método para recopilar los parámetros del modelo y los atributos de seguridad como argumentos de entrada de tus usuarios. También puedes usar este método para recopilar parámetros, como el ID del proyecto, la región, las credenciales de la aplicación y las claves de API.
- El constructor muestra un objeto que debe ser "pickle" para
que se pueda implementar en el motor de razonamiento. Por lo tanto, debes inicializar los clientes de servicio
y establecer conexiones con las bases de datos en el método
.set_up
, en lugar de hacerlo en el método__init__
. - Este método es opcional. Si no se especifica, Vertex AI usa el constructor de Python predeterminado para la clase.
set_up()
:- Debes usar este método para definir la lógica de inicialización de la aplicación. Por ejemplo, usa este método para establecer conexiones con bases de datos o servicios dependientes, importar paquetes dependientes o datos de procesamiento previo que se usan para entregar consultas.
- Este método es opcional. Si no se especifica, Vertex AI supone
que la aplicación no necesita llamar a un método
.set_up
antes de entregar consultas de los usuarios.
query()
:- Debes usar este método para definir la lógica del entorno de ejecución que entrega las consultas de los usuarios. Por ejemplo, puedes usar este método para generar contenido con modelos de IA generativa o recuperar datos en tiempo real de APIs externas.
- Este método es obligatorio. Si no se especifica, el servicio
ReasoningEngine
muestra un error cuando intentas crear una instancia remota de la aplicación. - Debes proporcionar a este método una docstring clara que defina lo que hace,
documenta sus atributos y proporciona anotaciones de tipo para sus entradas.
Evita los argumentos variables en el método
query
.
Prueba la aplicación de forma local
Crea una instancia de la aplicación en la memoria local con el siguiente código:
agent = CLASS_NAME(
model=model, # Required.
tools=[get_exchange_rate], # Optional.
project=PROJECT_ID,
location=LOCATION,
)
agent.set_up()
Puedes probar la aplicación si envías consultas de prueba a la instancia local:
response = agent.query(
input="What is the exchange rate from US dollars to Swedish currency?"
)
La respuesta es un diccionario similar al siguiente:
{"input": "What is the exchange rate from US dollars to Swedish currency?",
# ...
"output": "For 1 US dollar you will get 10.7345 Swedish Krona."}