自定义应用模板

开发应用中,我们使用预构建的模板(即 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 密钥等参数。
    • 该构造函数返回一个对象,该对象必须是“pickle-able”才能部署到推理引擎。因此,您应该初始化服务客户端并在 .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."}

后续步骤