【总结】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'])
相关推荐
宝贝儿好2 小时前
【LLM】第二章:文本表示:词袋模型、小案例:基于文本的推荐系统(酒店推荐)
人工智能·python·深度学习·神经网络·自然语言处理·机器人·语音识别
王夏奇2 小时前
pythonUI界面弹窗设置的几种办法
python·ui
ZhengEnCi2 小时前
P2B-Python可迭代对象完全指南-从列表到生成器的Python编程利器
python
萌萌站起3 小时前
Vscode 中 python模块的导入问题
ide·vscode·python
是小蟹呀^3 小时前
【总结】提示词工程
python·llm·prompt·agent
YBAdvanceFu3 小时前
从零构建智能体:深入理解 ReAct Plan Solve Reflection 三大经典范式
人工智能·python·机器学习·数据挖掘·多智能体·智能体
王夏奇4 小时前
python中的__all__ 具体用法
java·前端·python
王夏奇4 小时前
pycharm中3种不同类型的python文件
ide·python·pycharm
小陈的进阶之路4 小时前
Selenium 滑动 vs Appium 滑动
python·selenium·测试工具·appium