自定义应用模板

开发应用中,我们使用了预构建的模板(即 reasoning_engines.LangchainAgent)来开发应用。在本部分中,我们将介绍自定义您自己的应用模板的步骤。如果您的需求超出了预构建模板所提供的内容,此方法可能会很有用。

Reasoning Engine 中的应用模板定义为 Python 类。举例来说,以下 Python 代码是可在 Vertex AI 上部署的 LangChain 应用的示例(您可以为 CLASS_NAME 变量赋予一个值,例如 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})

在编写 Python 类时,以下三个方法对推理引擎很重要:

  1. __init__()
    • 仅针对应用配置参数使用此方法。 例如,您可以使用此方法从用户那里收集模型参数和安全属性作为输入参数。您还可以使用此方法收集项目 ID、区域、应用凭据和 API 密钥等参数。
    • 构造函数会返回一个对象,该对象必须是“可序列化的”,才能部署到推理引擎。因此,您应在 .set_up 方法(而非 __init__ 方法)中初始化服务客户端并建立与数据库的连接。
    • 此方法为可选方法。如果未指定,Vertex AI 会使用该类的默认 Python 构造函数。
  2. set_up()
    • 您必须使用此方法来定义应用初始化逻辑。例如,您可以使用此方法建立与数据库或依赖服务的连接、导入依赖软件包或预计算用于处理查询的数据。
    • 此方法为可选方法。如果未指定,Vertex AI 会假定应用无需在处理用户查询前调用 .set_up 方法。
  3. query()
    • 您必须使用此方法来定义处理用户查询的运行时逻辑。例如,您可以使用此方法通过生成式 AI 模型生成内容,或从外部 API 检索实时数据。
    • 此方法是必需的。如果未指定,则当您尝试创建应用的远程实例时,ReasoningEngine 服务将返回错误。
    • 您应为此方法提供一个清晰的文档字符串,用于定义它的作用、记录其属性以及为其输入提供类型注解。避免在 query 方法中使用可变参数。

在本地测试应用

使用以下代码在本地内存中实例化应用:

agent = CLASS_NAME(
    model=model,  # Required.
    tools=[get_exchange_rate],  # Optional.
    project=PROJECT_ID,
    location=LOCATION,
)
agent.set_up()

您可以将测试查询发送到本地实例以测试应用:

response = agent.query(
    input="What is the exchange rate from US dollars to Swedish currency?"
)

响应是一个类似于以下内容的字典:

{"input": "What is the exchange rate from US dollars to Swedish currency?",
 # ...
 "output": "For 1 US dollar you will get 10.7345 Swedish Krona."}

后续步骤