【总结】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'])
相关推荐
2401_8323655216 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
Sirius.z16 小时前
第J3周:DenseNet121算法详解
python
2301_7796224116 小时前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python
墨心@16 小时前
赋予智能体技能,让其胜任现实世界任务
语言模型·大语言模型·agent
2301_7662834417 小时前
c++如何将控制台输出保存到文件_cout重定向到txt【详解】
jvm·数据库·python
健忘的萝卜17 小时前
Clawdbot 爆红硅谷,也把 AI Agent 和 Mac mini 推上风口
人工智能·macos·agent·数字员工·clawbot
小康小小涵18 小时前
基于ESP32S3实现无人机RID模块底层源码编译
linux·开发语言·python
风落无尘18 小时前
LangChain 完全入门指南:从基础到实战(附面试题)
人工智能·langchain
lzjava202418 小时前
Python的函数
开发语言·python
去伪存真18 小时前
我自己写的第一个skills--project-core-standards
前端·agent