【总结】LangChain中工具的使用

目录

1.通过装饰器定义工具

2.通过装饰器定义工具名称

3.通过装饰器定义工具描述

4.对参数进行约束

5.使用LangChain里的预定义的工具

[6. 优化预定义工具](#6. 优化预定义工具)


1.通过装饰器定义工具

python 复制代码
@tool
def get_wheather(location: str) -> str:
    """
    Get the weather in a given location.
    Args:
        location: city name or coordinates
    """
    return "the current weather in {} is sunny".format(location)

注释很重要,必须要,不然agent不知道这个工具是干什么的


2.通过装饰器定义工具名称

python 复制代码
@tool("square_root")
def square_root(x: float) -> float:
    """计算平方根"""
    if x < 0:
        raise ValueError("不能计算负数的平方根")
    x = float(x)
    return x ** 0.5

通过这种方式的话,函数的名字就可以随意了


3.通过装饰器定义工具描述

python 复制代码
@tool("square_root", description="Calculate the square root of a number")
def tool1(x: float) -> float:
    return x ** 0.5

定义描述之后,函数中的注释就可以不用写了


4.对参数进行约束

定义类:

python 复制代码
class wheather_input(BaseModel):
    location: str = Field(..., description="City name or coordinates")
    units: Literal["celsius", "fahrenheit"] = Field("celsius", description="Temperature units")
    include_forecast: bool = Field(False, description="Whether to include a 5-day forecast")

在工具的装饰器中通过args_schema约束

python 复制代码
@tool(args_schema=wheather_input)
def get_weather_info(location: str, units: str, include_forecast: bool) -> str:
    """
    Get weather information for a given location.
    """
    if units == "celsius":
        temp = 22
    else:
        temp = 72
    result = f"Current weather in {location}: {temp} degrees {units[0].upper()}"
    if include_forecast:
        result += "\n5-day forecast: Sunny, Sunny, Sunny, Sunny, Sunny"
    return result

这样就对进入函数的参数进行了约束


5.使用LangChain里的预定义的工具

=> TavilySearch

python 复制代码
# 初始化工具,并设置参数,具体参数设置参考官网
tool = TavilySearch(
    max_results=5,
    topic="general",
    # include_answer=False,
    # include_raw_content=False,
    # include_images=False,
    # include_image_descriptions=False,
    # search_depth="basic",
    # time_range="day",
    # include_domains=None,
    # exclude_domains=None
)
python 复制代码
agent = create_agent(
    model="deepseek-chat",
    tools=[tool],
    system_prompt="你是一个智能助手,你使用工具来解决用户问题。",
)
response = agent.stream({
    "messages": [
        HumanMessage(content="南京今天天气如何?")
    ]
}, stream_mode="messages")

for token, metadata in response:
    if token.content:
        print(token.content, end="", flush=True)

直接用就可以,但是通过这种方式返回的内容很多,会消耗很多token, 我们一般会对这个进行优化


6. 优化预定义工具

python 复制代码
# LangChain提供的TavilySearch工具描述非常复杂,参数也很多。会有额外的网络消耗。
# 如果我们仅仅是需要query参数,建议自定义工具。
python 复制代码
# 使用tavily作为web搜索工具
tavily = TavilySearch(
    max_results=5,
    topic="general"
)
python 复制代码
@tool
def web_search(query: str):
    """Search the web for information"""
    return tavily.invoke(query)
python 复制代码
# Agent回答内容引用的网页信息
class Reference(BaseModel):
    title: str = Field(description="The title of the web page cited in the answer")
    url: str = Field(description="The url of the web page cited in the answer")

# Agent的回答内容
class AnswerInfo (BaseModel):
    answer: str = Field(description="The final answer for user")
    reference: list[Reference] = Field(description="The web pages cited in the answer")

agent = create_agent(
    model="deepseek-chat",
    tools=[web_search],
    system_prompt="你是一个智能助手,你使用工具来解决用户问题。",
    response_format=AnswerInfo
)

response = agent.invoke(
    {"messages": [HumanMessage(content="我要验牌是什么梗?")]},
)

print(response['structured_response'])
相关推荐
chaors1 小时前
DeepResearchSystem 0x08:KB 知识记忆
langchain·agent·ai编程
飞哥数智坊5 小时前
同一个 Agent,为什么有人越用越顺,有人却一直在返工?
agent
北斗落凡尘6 小时前
LangGraph 入门实战(2)
python·langchain
ttod_qzstudio6 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
JouYY7 小时前
大模型底层学习(三)-从零训练一个 BPE 分词器
架构·llm·agent
jufeng13077 小时前
【系列:手搓自主 AI Agent:Hermes 架构原理剖析 · 第 1 篇】
人工智能·python·架构·agent
月光船幽幽8 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
_oP_i10 小时前
python 后缀 mjs文件
开发语言·python
北斗落凡尘11 小时前
如何使用LangGraph(1)
python·langchain
蜡台11 小时前
Agency-Agents 智能体系统从零搭建实战指南
ai·agent