用Langchain创建一个可以总结网页内容的Agent

  去年的时候我写过一篇关于OpenAi Function Call的实践文章,就是用Function Call的功能实现抓取并总结网页内容的功能,具体可以参考ChatGPT函数调用初体验:让ChatGPT具备抓取网页文本的能力,当时写了还算比较多的代码,最近在学习了LangChain的使用后,发现LangChain封装的很好了,同样的功能几乎不需要写太多的代码了。

  接下来我们还是以抓取并总结网页内容的Agent为例,来看下使用LangChain如何实现类似的功能,当然你要看懂这篇文章,必须对LangChain有一定的了解,如果完全没有任何了解,建议先去看下LangChain官网的一些入门概念,废话不说我们直接开始。

网页加载工具定义

  我们首先就是要定义个可以加载到网页内容的工具,这次我们直接使用LangChain提供好的WebBaseLoader。另外借助LangChain的装饰器@tool,我也仅需要正常写一个函数并表明出入参类型和功能即可,不用提供像之前那样复杂的函数定义schema。

@tool
def web_loader(url: str) -> str:
    """抓取url对应网页的内容"""
    loader = WebBaseLoader(url)
    docs = loader.load()
    return docs[0].page_content

创建llm并绑定工具

llm = ChatOpenAI(model="gpt-3.5-turbo", max_tokens=4096)
tools = [web_loader]
llm_with_tools = llm.bind_tools(tools)

  llm我使用的是OpenAi的gpt3.5,你也可以使用其他模型,另外ChatOpenAI有很多其他参数可调,你可以按自己需求调整。这里最关键的一步,就是需要将llm和工具用bind_tools()绑定在一起,不绑定的话后续llm是不知道有哪些tool可以调用的。

创建prompt

  有些同学说prompt不是就一句话的事吗,还需要单独写! 我开始也是随意创建了一个prompt,结果调用报错了。 原来带有函数调用Agent的prompt是有特殊要求的,其中除了要包含input之外,还需要包含agent_scratchpad占位符,agent_scratchpad的作用就是在prompt留出函数调用中间结果的位置:

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "你是一个擅长对长文做总结的智能助手,可以精确提炼出长文中的要点。注意,请使用markdown格式返回结果。",
        ),
        ("placeholder", "{chat_history}"),
        ("user", "{input}"),
        MessagesPlaceholder(variable_name="agent_scratchpad"),
    ]
)

创建Agent并执行

  agent 可以直接调用LangChain提供的create_tool_calling_agent方法,创建。

agent = create_tool_calling_agent(llm_with_tools, tools, prompt)

  agent创建好之后,必须创建agent执行器才可以执行,这里直接实例化AgentExecutor即可。

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=False)

  直接invoke下就可以看到我们想要的结果了~~

agent_executor.invoke(
    {
        "input": "这个链接讲了什么内容? https://blog.csdn.net/xindoo/article/details/138356308?spm=1001.2014.3001.5501"
    }
)

{'input': '这个链接讲了什么内容? https://blog.csdn.net/xindoo/article/details/138356308?spm=1001.2014.3001.5501',
 'output': '这篇博文介绍了一个命令行工具ShellGPT,它是一个开源软件,可以帮助用户快速生成 shell 命令、代码片段和文档,无需再依赖外部资源(如 Google 搜索)。以下是该文章的主要内容:\n\n- ShellGPT的配置安装:支持 Linux、macOS、Windows 等操作系统,安装简单,只需使用pip安装即可。\n- 函数调用:ShellGPT允许执行系统中的函数,如播放音乐、打开网页或执行 shell 命令。提供了一些高级配置选项。\n- 角色管理:用户可以创建自定义角色,这些角色可以用来生成代码、执行 shell 命令或满足特定需求。用户可以使用命令指定特定的角色执行指令。\n- 聊天功能:用户可以和GPT进行聊天,支持单轮聊天和多轮聊天模式。\n- 写命令并执行:用户可以借助GPT的编码能力写脚本或命令,并执行。\n- 其他功能:文章提及了一些其他细节和功能,如如何通过 API从 0 到 1 构建本地 GPTs、GPT每日面试题等。\n\n总的来说,ShellGPT是一个实用的工具,可以帮助用户在命令行环境下更高效地生成命令和代码,同时还提供了一些高级功能和配置选项。'}

  至此我们就完整的创建了一个可以总结网页内容的Agent,完整代码我放Github https://github.com/xindoo/LangChain-examples/blob/main/%E7%BD%91%E9%A1%B5%E6%80%BB%E7%BB%93.ipynb上了,有需要可以自取。
在这里插入图片描述

<think>嗯,用户想了解如何在LangChain创建或使用自定义Tool。首先,我需要回忆一下LangChain的相关文档和之前的引用内容。记得引用[1]提到了定义简单工具的示例代码,引用[3]是关于创建自定义工具的视频教程,而引用[4]则讨论了如何修改工具属性和定义优先级。 首先,用户可能需要一个基本的步骤指南,从定义工具开始。我应该先解释使用@tool装饰器的方法,这是最直接的方式。比如,定义一个简单的函数,加上装饰器,并说明参数。然后,可能需要提到如何将这个工具添加到Agent中,这一步需要结合引用[1]和引用[4]的内容,比如使用load_tools或者直接初始化Agent。 接下来,用户可能需要更复杂的自定义工具,比如处理结构化数据或者与其他服务集成。这时候需要继承BaseTool类,重写_run方法。这部分需要详细说明,可能需要示例代码,但要注意不要直接复制,而是用自然的中文描述。比如,创建一个天气查询工具,调用API获取数据,并处理错误情况。 然后,用户可能会关心如何在SQLDatabaseToolkit中添加自定义工具,如引用[2]的问题。这里需要解释如何扩展现有的Toolkit,可能需要覆盖默认工具或添加新工具。需要提到修改tools属性或者继承SQLDatabaseToolkit类,这部分需要参考引用[4]中的修改工具属性的方法。 另外,工具属性的调整也很重要,比如修改名称或描述,确保Agent能正确识别和使用。引用[4]里提到直接修改工具的name属性,比如tools[0].name = "Google Search",这个例子可以引用来说明。 还有优先级的问题,不同的工具可能在特定输入下有冲突,需要设置优先级。引用[4]中提到的定义优先级,可能需要通过描述中的关键词或者设置参数来处理,这部分需要举例说明,比如在工具描述中加入明确的关键词。 最后,注意事项部分要提醒用户输入输出类型、描述的重要性、错误处理和测试工具。这些是确保工具正常工作的关键点,需要结合最佳实践来建议。 生成相关问题的时候,要考虑用户可能进一步的需求,比如参数验证、异步工具、集成外部API、调试方法、动态优先级和性能优化。这些问题覆盖了用户可能遇到的进阶问题,帮助他们更深入地使用LangChain的自定义工具。 需要确保整个回答结构清晰,分步骤说明,每个部分都有示例或引用支持,同时语言自然,符合中文表达习惯。避免使用Markdown格式,但保持代码块的结构。检查所有引用是否正确对应,比如引用[1]是关于定义工具,引用[2]是SQL Toolkit的自定义,引用[3]是视频教程,引用[4]是修改属性和优先级。 总结来说,回答需要涵盖基本创建方法、高级自定义、工具包扩展、属性调整、优先级设置以及注意事项,每个部分都结合引用内容,确保信息准确可靠。然后生成的相关问题要引导用户探索更深入的主题,帮助他们全面掌握自定义工具的使用。</think>### 如何在 LangChain创建或使用自定义工具 以下是分步指南,结合官方文档和社区实践: #### 一、基础工具定义 1. **使用 `@tool` 装饰器** 通过函数装饰器快速创建工具(引用[1][^1]): ```python from langchain.tools import tool @tool("天气查询工具") def get_weather(city: str) -> str: """根据城市名称查询实时天气""" # 调用天气API实现 return f"{city}天气:晴,25℃" ``` 2. **添加到 Agent** ```python from langchain.agents import initialize_agent agent = initialize_agent( tools=[get_weather], llm=llm, agent="zero-shot-react-description" ) ``` #### 二、高级自定义工具 1. **继承 `BaseTool` 类**(引用[3][^3]) ```python from langchain.tools import BaseTool from pydantic import BaseModel class WeatherInput(BaseModel): city: str class CustomWeatherTool(BaseTool): name = "AdvancedWeatherTool" description = "通过经纬度查询气象数据" args_schema = WeatherInput def _run(self, city: str): # 实现复杂天气查询逻辑 return f"{city}气象报告:湿度60%,风速5m/s" ``` #### 三、扩展 SQL Toolkit(引用[2][^2]) ```python from langchain.agents.agent_toolkits import SQLDatabaseToolkit class CustomSQLToolkit(SQLDatabaseToolkit): def get_tools(self): base_tools = super().get_tools() base_tools.append(CustomWeatherTool()) return base_tools ``` #### 四、工具属性调整(引用[4][^4]) ```python tools = load_tools(["serpapi", "llm-math"], llm=llm) tools[0].name = "Google 搜索" tools[0].description = "优先使用此工具进行网页搜索" ``` #### 五、工具优先级控制 在工具描述中加入关键词: ```python @tool("汇率计算", return_direct=True) def currency_exchange(...): """当问题包含'汇率'或'货币兑换'时优先使用此工具""" ``` ### 注意事项 1. 输入/输出需明确定义数据类型 2. 工具描述影响 Agent 的调度决策 3. 建议添加错误处理逻辑 4. 可通过 `agent.tools` 属性验证工具加载状态 §§ 1. 如何为自定义工具添加参数验证? 2. 如何创建异步工具实现? 3. 如何将自定义工具与外部API集成? 4. 如何调试工具调用过程? 5. 如何实现动态工具优先级? 6. 自定义工具的性能优化方法?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xindoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值