reasoning_engines.LangchainAgent
) zum Entwickeln einer Anwendung verwendet. In diesem Abschnitt werden die Schritte beschrieben, mit denen Sie Ihre eigene Anwendungsvorlage anpassen können. Dies kann hilfreich sein, wenn Sie Anforderungen haben, die über die vordefinierten Vorlagen hinausgehen.
Eine Anwendungsvorlage in der Reasoning Engine wird als Python-Klasse definiert. Der folgende Python-Code ist beispielsweise eine LangChain-Anwendung, die auf Vertex AI bereitgestellt werden kann (Sie können der Variable CLASS_NAME
einen Wert wie MyAgent
zuweisen):
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})
Beim Schreiben Ihrer Python-Klasse sind die folgenden drei Methoden für die Reasoning-Engine wichtig:
__init__()
:- Verwenden Sie diese Methode nur für Parameter der Anwendungskonfiguration. Sie können diese Methode beispielsweise verwenden, um die Modellparameter und Sicherheitsattribute als Eingabeargumente von Ihren Nutzern zu erfassen. Sie können diese Methode auch verwenden, um Parameter wie die Projekt-ID, die Region, die Anmeldedaten für die Anwendung und die API-Schlüssel zu erfassen.
- Der Konstruktor gibt ein Objekt zurück, das "pickle-fähig" sein muss, damit es für die Reasoning-Engine bereitgestellt werden kann. Daher sollten Sie Dienstclients initialisieren und Verbindungen zu Datenbanken in der Methode
.set_up
und nicht in der Methode__init__
herstellen. - Diese Methode ist optional. Wenn er nicht angegeben ist, verwendet Vertex AI den Standard-Python-Konstruktor für die Klasse.
set_up()
:- Sie müssen diese Methode verwenden, um die Logik für die Anwendungsinitialisierung zu definieren. Sie können mit dieser Methode beispielsweise Verbindungen zu Datenbanken oder abhängigen Diensten herstellen, abhängige Pakete importieren oder Daten vorausberechnen, die zur Verarbeitung von Abfragen verwendet werden.
- Diese Methode ist optional. Wenn sie nicht angegeben ist, geht Vertex AI davon aus, dass die Anwendung keine
.set_up
-Methode aufrufen muss, bevor Nutzerabfragen bereitgestellt werden.
query()
:- Sie müssen diese Methode verwenden, um eine Laufzeitlogik zu definieren, die Nutzerabfragen verarbeitet. Sie können diese Methode beispielsweise verwenden, um Inhalte mit generativen KI-Modellen zu generieren oder Echtzeitdaten von externen APIs abzurufen.
- Diese Methode ist erforderlich. Wenn sie nicht angegeben ist, gibt der
ReasoningEngine
-Dienst einen Fehler zurück, wenn Sie versuchen, eine Remoteinstanz der Anwendung zu erstellen. - Sie sollten dieser Methode einen eindeutigen Docstring zuweisen, der ihre Funktion definiert, ihre Attribute dokumentiert und Typenannotationen für ihre Eingaben bereitstellt.
Vermeiden Sie Variablenargumente in der
query
-Methode.
Anwendung lokal testen
Instanziieren Sie die Anwendung im lokalen Speicher mit dem folgenden Code:
agent = CLASS_NAME(
model=model, # Required.
tools=[get_exchange_rate], # Optional.
project=PROJECT_ID,
location=LOCATION,
)
agent.set_up()
Sie können die Anwendung testen, indem Sie Testabfragen an die lokale Instanz senden:
response = agent.query(
input="What is the exchange rate from US dollars to Swedish currency?"
)
Die Antwort ist ein Wörterbuch, das in etwa so aussieht:
{"input": "What is the exchange rate from US dollars to Swedish currency?",
# ...
"output": "For 1 US dollar you will get 10.7345 Swedish Krona."}