一、LangChain 1.0+ 工具调用核心概念
LangChain 1.0+ 对工具调用进行了全面重构,现在的 API 更简洁、更灵活、更符合现代 Python 风格。核心分为两个概念:Tool(单个工具)和Toolkit(工具集合)。
1. Tool(单个工具)
核心定义
Tool 是 LangChain 中工具的最小单位,它封装了一个具体的功能(比如搜索、计算、代码执行、文件读写),LLM 可以根据用户的需求,自主选择调用哪个工具、传入什么参数。
LangChain 1.0+ 工具的三种来源
表格
| 来源 | 说明 | 示例 |
|---|---|---|
| 预定义工具 | LangChain 官方内置了 100+ 预定义工具,直接导入即可使用 | Serper 搜索、DuckDuckGo 搜索、PythonREPL 代码执行器、计算器 |
| 自定义工具 | 用@tool装饰器,把任意 Python 函数包装成 LangChain 工具 | 你自己写的天气查询函数、数据库查询函数 |
| OpenAI 兼容工具 | 直接使用 OpenAI Functions 格式的工具定义 | 兼容所有 OpenAI 兼容模型(豆包、通义千问) |
最简单的自定义工具示例
from langchain_core.tools import tool @tool def multiply(a: int, b: int) -> int: """ 乘法计算器,计算两个整数的乘积 :param a: 第一个整数 :param b: 第二个整数 :return: 乘积 """ return a * b # 查看工具信息 print(multiply.name) print(multiply.description) print(multiply.args)2. Toolkit(工具集合)
核心定义
Toolkit 是一组相关工具的集合,比如 GitHubToolkit 包含了「查询仓库、创建 Issue、提交代码」等多个 GitHub 相关工具,你可以一次性导入整个 Toolkit,不用逐个导入单个工具。
常用预定义 Toolkit
表格
| Toolkit 名称 | 说明 |
|---|---|
SerperToolkit | Serper 搜索引擎工具集合 |
PythonToolkit | Python 代码执行、文件读写工具集合 |
GitHubToolkit | GitHub 操作工具集合 |
SQLDatabaseToolkit | SQL 数据库查询工具集合 |
二、准备工作:获取 Serper API Key
我们用Serper 搜索引擎(免费、稳定、国内访问快)来实现能上网的聊天机器人,它是 LangChain 官方推荐的搜索引擎工具。
1. 获取 Serper API Key
- 访问 Serper 官网
- 用邮箱注册账号(免费版每天有 2500 次查询,足够学习使用)
- 登录后进入「Dashboard」,复制你的API Key
2. 配置.env文件
在项目根目录的.env文件中添加 Serper API Key:
# 豆包 API Key DOUBAO_API_KEY=你的豆包APIKey # Serper 搜索引擎 API Key SERPER_API_KEY=你的SerperAPIKey三、完整代码:LangChain 1.0+ 集成 Serper 搜索的聊天机器人
这个代码完全兼容 LangChain 1.0+ 最新版本,使用LCEL 语法、bind_tools绑定工具、RunnableWithMessageHistory管理记忆,实现了一个能实时搜索、能记住上下文的智能聊天机器人。
import os from dotenv import load_dotenv # ====================== LangChain 1.0+ 新包导入 ====================== from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables.history import RunnableWithMessageHistory from langchain_core.chat_history import BaseChatMessageHistory, InMemoryChatMessageHistory from langchain_community.tools import SerperSearchRun from langchain_core.tools import tool # ====================== 1. 初始化配置 ====================== load_dotenv() # 初始化豆包 ChatModel(必须用支持工具调用的模型,推荐 doubao-pro-32k) llm = ChatOpenAI( api_key=os.getenv("DOUBAO_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", model="doubao-pro-32k", # 必须用 pro 模型,支持工具调用 temperature=0.7 ) # ====================== 2. 初始化 Serper 搜索工具 ====================== @tool def serper_search(query: str) -> str: """ Serper 搜索引擎工具,用于查询实时信息、新闻、知识等 当用户的问题涉及实时信息、最新动态、或你不确定的知识时,使用这个工具 :param query: 搜索关键词,用中文或英文都可以 :return: 搜索结果摘要 """ search = SerperSearchRun(serper_api_key=os.getenv("SERPER_API_KEY")) return search.run(query) # 工具列表:把所有工具放在一个列表里 tools = [serper_search] # ====================== 3. 定义聊天提示词模板(必须包含工具调用的说明) ====================== prompt = ChatPromptTemplate.from_messages([ ("system", """你是一个友好、聪明的聊天助手,不仅能聊天,还能通过搜索引擎获取实时信息。 ## 核心规则 1. 如果用户的问题涉及实时信息(比如今天的天气、最新新闻、体育比赛结果)、或你不确定的知识,必须先调用 serper_search 工具搜索,再根据搜索结果回答 2. 必须记住用户之前提到的关键信息(姓名、喜好、需求),后续对话主动呼应 3. 语气亲切自然,不使用书面化套话、不生硬、不啰嗦 4. 纯文本回答,不使用特殊格式 """), MessagesPlaceholder(variable_name="history"), ("user", "{input}") ]) # ====================== 4. 记忆管理(和之前一样) ====================== store = {} def get_session_history(session_id: str) -> BaseChatMessageHistory: if session_id not in store: store[session_id] = InMemoryChatMessageHistory() return store[session_id] # ====================== 5. 构建带工具调用的 LCEL Chain(核心变化) ====================== # 第一步:把工具绑定到 LLM 上(LangChain 1.0+ 核心方法) llm_with_tools = llm.bind_tools(tools) # 第二步:构建基础链 base_chain = prompt | llm_with_tools | StrOutputParser() # 第三步:带记忆的链 chain_with_history = RunnableWithMessageHistory( base_chain, get_session_history, input_messages_key="input", history_messages_key="history" ) # ====================== 6. 聊天主循环 ====================== def main(): print("===== LangChain 1.0+ 能上网的聊天机器人(Serper 搜索) =====") print("输入 'q' 退出,输入 'clear' 清空上下文\n") session_id = "user_123" while True: user_input = input("你:").strip() if user_input.lower() == "q": print("🤖 再见!下次再聊~") break if user_input.lower() == "clear": if session_id in store: store[session_id].clear() print("🤖 上下文已清空啦~") continue if not user_input: continue # 调用带记忆的 Chain response = chain_with_history.invoke( {"input": user_input}, config={"configurable": {"session_id": session_id}} ) print(f"🤖:{response}\n") if __name__ == "__main__": main()四、核心变化详解(LangChain 1.0+ 工具调用)
1. 工具绑定:llm.bind_tools(tools)
这是 LangChain 1.0+ 工具调用的核心方法,它把工具列表绑定到 LLM 上,让 LLM 知道自己有哪些工具可以调用、每个工具的功能是什么、入参出参是什么。
2. 提示词必须包含工具说明
在系统提示词里,必须明确告诉 LLM:
- 什么时候需要调用工具
- 调用哪个工具
- 工具的作用是什么
这样 LLM 才能准确判断是否需要调用工具。
3. 必须用支持工具调用的模型
豆包的doubao-pro-32k、doubao-pro-128k支持工具调用,doubao-lite系列不支持,这点一定要注意。
五、运行效果演示
===== LangChain 1.0+ 能上网的聊天机器人(Serper 搜索) ===== 输入 'q' 退出,输入 'clear' 清空上下文 你:今天北京的天气怎么样? 🤖:我需要先搜索一下今天北京的天气情况。 (后台自动调用 serper_search 工具搜索) 🤖:根据最新搜索结果,今天北京的天气是晴,温度 18-28℃,东北风 3 级,空气质量优,非常适合出门哦~ 你:我叫小明,喜欢打篮球 🤖:你好小明!很高兴认识你,打篮球是一个很棒的爱好,既能锻炼身体又能放松心情~ 你:我喜欢什么? 🤖:你喜欢打篮球呀,小明~ 你:2026年世界杯在哪里举办? 🤖:我需要搜索一下2026年世界杯的举办地。 (后台自动调用 serper_search 工具搜索) 🤖:根据搜索结果,2026年世界杯将由美国、加拿大、墨西哥三国联合举办,这是世界杯历史上首次由三个国家联合举办。六、总结
- LangChain 1.0+ 工具调用核心:
@tool装饰器把 Python 函数包装成工具llm.bind_tools(tools)把工具绑定到 LLM 上- 提示词里必须明确说明工具的使用规则
- Tool 和 Toolkit 的区别:
- Tool 是单个工具,比如 Serper 搜索
- Toolkit 是一组相关工具的集合,比如 GitHubToolkit
- 扩展更多工具:你可以用
@tool装饰器,把任意 Python 函数包装成工具,比如天气查询、数据库查询、文件读写等,然后添加到tools列表里,LLM 就能自主调用了。