7. 聊天模型-搜索工具与内置工具
文章目录
- 7. 聊天模型-搜索工具与内置工具
- 1. LangChain 内置工具生态
- 1.1 BaseTool 与 BaseToolkit
- 1.2 如何查找和使用内置工具
- 2. TavilySearch 搜索引擎
- 2.1 Tavily 简介
- 2.2 申请 API Key
- 2.3 API Playground 测试
- 2.4 UseCases 演示
- 3. 代码接入 TavilySearch
- 3.1 安装依赖
- 3.2 配置环境变量
- 3.3 基础使用示例
- 3.4 运行效果
- 3.5 与工具调用流程的衔接
- 4. 搜索工具 + 结构化输出预览
- 5. 总结
在前一小节内容中,我们学会了如何用
@tool和StructuredTool自定义工具。然而,很多常用功能(搜索、数据库查询、网页浏览等)LangChain 已经内置集成——我们可以直接使用,无需从零手写。
1. LangChain 内置工具生态
1.1 BaseTool 与 BaseToolkit
LangChain 中的所有工具都基于两个基类:
| 基类 | 说明 | 示例 |
|---|---|---|
BaseTool | 单个工具的基类 | 搜索工具、计算器、API 调用器 |
BaseToolkit | 一组相关工具的集合(工具包) | 数据库工具箱、文件系统工具箱 |
在 LangChain 的源码Lib/site-packages/中全局搜索BaseTool和BaseToolkit,可以看到所有已继承实现的内置工具:
1.2 如何查找和使用内置工具
- 在 LangChain API Reference 中搜索工具类名
- 查看对应工具的文档,了解初始化参数和用法
- 按需安装对应的集成包(如
langchain-tavily、langchain-community等)
2. TavilySearch 搜索引擎
2.1 Tavily 简介
这里我们以 TavilySearch 为例介绍一下如何使用内置工具:
支持获取最新、最实时的网络信息
Tavily 是一个专为 AI 智能体设计的搜索引擎,和传统搜索引擎(如 Google、Bing)不同,它的核心优势在于:专为 LLM 检索与推理需求打造,返回结构化、可解析的搜索结果、显著优于传统搜索引擎的语义相关性理解能力、返回 JSON 格式数据,便于直接用于后续推理和生成流程、
Tavily 官网:https://www.tavily.com/
2.2 申请 API Key
在 Tavily 官网登录(支持 Google 账号登录),进入 API Keys 页面:
点击添加新 Key,填写名称后 Create,创建后复制保存该 Key(与 OpenAI API Key 类似,关闭后不再显示)。
2.3 API Playground 测试
在左侧 API Playground 中可以选择已创建的 Key,模拟搜索请求测试效果:
Playground 会返回完整的搜索结果,包括标题、链接、摘要等结构化数据,并展示对应的 Python 调用代码。
2.4 UseCases 演示
左侧 UseCases 中提供了多种集成场景:
例如 Chat 模式——输入"北京今天的天气怎么样?",搜索引擎自动获取最新天气信息,系统再结合 LLM 生成自然语言回答。
3. 代码接入 TavilySearch
3.1 安装依赖
pipinstall-Ulangchain-tavily3.2 配置环境变量
将申请的 API Key 配置为环境变量TAVILY_API_KEY:
# Windows 命令提示符setTAVILY_API_KEY=your_api_key_here# 或在 Python 代码中直接设置importos os.environ["TAVILY_API_KEY"]="your_api_key_here"3.3 基础使用示例
fromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessagefromlangchain_tavilyimportTavilySearch# 1. 定义模型model=ChatOpenAI(model="gpt-4o-mini")# 2. 定义搜索工具(max_results 控制返回结果数量)tool=TavilySearch(max_results=4)# 3. 绑定工具到模型model_with_tools=model.bind_tools([tool])# 4. 用户提问messages=[HumanMessage("北京今天的天气怎么样?")]# 5. 模型决定调用搜索工具ai_message=model_with_tools.invoke(messages)messages.append(ai_message)# 6. 执行工具调用,获取搜索结果fortool_callinai_message.tool_calls:tool_message=tool.invoke(tool_call)messages.append(tool_message)# 7. 模型根据搜索结果生成自然语言回答print(model.invoke(messages).content)3.4 运行效果
运行上述代码,模型会依次经历以下流程:
输出示例:
今天的北京天气如下:温度大约在18.3摄氏度左右,有微风。以下是详细天气预报及相关链接: - 当前气温:18.3°C,天气状况:多云... - 更多信息请参考:[链接1] [链接2] ...3.5 与工具调用流程的衔接
本示例与上一小节中完整工具调用流程完全一致:
- 定义工具-> 这里使用的是
TavilySearch(而非@tool自定义工具) - 绑定工具->
model.bind_tools([tool]),与自定义工具绑定方式相同 - 模型选择工具-> LLM 根据"天气"等关键词自动选择搜索工具
- 执行工具->
tool.invoke(tool_call),返回ToolMessage - 组装消息列表->
HumanMessage+AIMessage+ToolMessage - 最终回复-> 模型结合搜索结果生成自然语言回答
Tip:内置工具即拿即用
TavilySearch本身就是一个BaseTool实例,可直接调用tool.invoke(),也支持.name、.description、.args等工具属性,与自定义工具完全兼容。
4. 搜索工具 + 结构化输出预览
TavilySearch 不仅仅可以配合自然语言回答使用,还可以和with_structured_output()方法结合,直接输出结构化的结果对象。
下面的示例演示了搜索后如何将结果解析为SearchResult模型:
fromlangchain_core.messagesimportHumanMessagefromlangchain_openaiimportChatOpenAIfromlangchain_tavilyimportTavilySearchfrompydanticimportBaseModel,FieldclassSearchResult(BaseModel):"""结构化搜索对象"""query:str=Field(description="搜索查询")findings:str=Field(description="查询结果摘要")model=ChatOpenAI(model="gpt-4o-mini")tool=TavilySearch(max_results=4)model_with_tools=model.bind_tools([tool])messages=[HumanMessage("北京今天的天气怎么样?")]ai_message=model_with_tools.invoke(messages)messages.append(ai_message)fortool_callinai_message.tool_calls:tool_message=tool.invoke(tool_call)messages.append(tool_message)# 将结果解析为结构化输出model_with_structured=model_with_tools.with_structured_output(SearchResult)result=model_with_structured.invoke(messages)print(result)# 输出示例: SearchResult(query='北京天气', findings='北京今日多云,18~28°C...')关于with_structured_output()的完整用法(Pydantic / TypedDict / JSON Schema 三种定义方式),将在下一讲中详细展开。
5. 总结
学习了如何在 LangChain 中使用内置工具和搜索引擎:
| 知识点 | 说明 |
|---|---|
| 内置工具生态 | LangChain 基于BaseTool/BaseToolkit集成了大量常用工具 |
| TavilySearch | 专为 AI 设计的搜索引擎,返回结构化搜索结果 |
| 接入流程 | 安装包 → 配置 API Key →TavilySearch()定义工具 →bind_tools()绑定 |
| 与自定义工具对比 | 内置工具使用方法与@tool自定义工具完全相同 |
| 结构化输出预览 | 搜索工具可与with_structured_output()配合,直接解析为 Pydantic 对象 |
搜索结果 |
|接入流程| 安装包 → 配置 API Key →TavilySearch()定义工具 →bind_tools()绑定 |
|与自定义工具对比| 内置工具使用方法与@tool自定义工具完全相同 |
|结构化输出预览| 搜索工具可与with_structured_output()配合,直接解析为 Pydantic 对象 |
主要内容到这里就结束啦