引言
在现代软件开发中,动态地为工具传递参数尤为重要,特别是在构建基于自然语言处理的应用时。此文章将探讨如何在运行时安全地为工具注入参数而不暴露给语言模型(LLM),以确保应用的安全性和可靠性。
主要内容
为什么在运行时注入参数
许多应用需要在运行时使用动态值,例如用户ID,而这些值不应由LLM生成。这不仅涉及到安全问题,还可能影响到应用的稳定性。因此,我们需要一种方法,确保只有正确的参数被传递到LLM控制的工具中。
如何实现参数注入
为了实现运行时参数注入,我们可以使用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:
"""更新用户最喜欢的宠物列表."""
user_to_pets[user_id] = pets
# 使用API代理服务提高访问稳定性
在工具调用时,user_id被主动注入,而不会由模型生成。
代码示例
以下是如何实现工具调用并确保user_id得以传递的示例:
user_id = "123"
update_favorite_pets.invoke({"pets": ["lizard", "dog"], "user_id": user_id})
print(user_to_pets) # {'123': ['lizard', 'dog']}
# 查看模型调用工具时的效果
tools = [update_favorite_pets]
llm_with_tools = llm.bind_tools(tools)
ai_msg = llm_with_tools.invoke("my favorite animals are cats and parrots")
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)
常见问题和解决方案
问题1:为什么不直接让模型生成所有参数?
让模型生成所有参数,包括敏感信息,如用户ID,可能导致安全隐患。因此,敏感参数应在应用逻辑中手动注入。
问题2:如何确保参数始终正确传递?
可以通过注解来约束参数的生成和传递。在实现时,确保通过tool_call_schema而非input_schema来控制模型的调用。
总结和进一步学习资源
通过合理使用工具注解,开发者可以确保应用在使用自然语言模型时的安全性和稳定性。建议阅读以下资源加深对参数管理的理解:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---