7. 聊天模型-搜索工具与内置工具

在前一小节内容中,我们学会了如何用 @toolStructuredTool 自定义工具。然而,很多常用功能(搜索、数据库查询、网页浏览等)LangChain 已经内置集成——我们可以直接使用,无需从零手写。


1. LangChain 内置工具生态

1.1 BaseTool 与 BaseToolkit

LangChain 中的所有工具都基于两个基类:

基类说明示例
BaseTool单个工具的基类搜索工具、计算器、API 调用器
BaseToolkit一组相关工具的集合(工具包)数据库工具箱、文件系统工具箱

在 LangChain 的源码 Lib/site-packages/ 中全局搜索 BaseToolBaseToolkit,可以看到所有已继承实现的内置工具:

1.2 如何查找和使用内置工具

  1. LangChain API Reference 中搜索工具类名
  2. 查看对应工具的文档,了解初始化参数和用法
  3. 按需安装对应的集成包(如 langchain-tavilylangchain-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 安装依赖

pip install -U langchain-tavily

3.2 配置环境变量

将申请的 API Key 配置为环境变量 TAVILY_API_KEY

# Windows 命令提示符
set TAVILY_API_KEY=your_api_key_here

# 或在 Python 代码中直接设置
import os
os.environ["TAVILY_API_KEY"] = "your_api_key_here"

3.3 基础使用示例

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
from langchain_tavily import TavilySearch

# 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. 执行工具调用,获取搜索结果
for tool_call in ai_message.tool_calls:
    tool_message = tool.invoke(tool_call)
    messages.append(tool_message)

# 7. 模型根据搜索结果生成自然语言回答
print(model.invoke(messages).content)

3.4 运行效果

运行上述代码,模型会依次经历以下流程:

TavilySearch 聊天模型 用户 TavilySearch 聊天模型 用户 北京今天的天气怎么样? 调用搜索工具(北京天气) 返回结构化搜索结果 "今天北京天气多云,气温18~28°C,微风..."

输出示例:

今天的北京天气如下:温度大约在18.3摄氏度左右,有微风。以下是详细天气预报及相关链接:
- 当前气温:18.3°C,天气状况:多云...
- 更多信息请参考:[链接1] [链接2] ...

3.5 与工具调用流程的衔接

本示例与上一小节中完整工具调用流程完全一致:

  1. 定义工具 -> 这里使用的是 TavilySearch(而非 @tool 自定义工具)
  2. 绑定工具 -> model.bind_tools([tool]),与自定义工具绑定方式相同
  3. 模型选择工具 -> LLM 根据"天气"等关键词自动选择搜索工具
  4. 执行工具 -> tool.invoke(tool_call),返回 ToolMessage
  5. 组装消息列表 -> HumanMessage + AIMessage + ToolMessage
  6. 最终回复 -> 模型结合搜索结果生成自然语言回答

Tip: 内置工具即拿即用
TavilySearch 本身就是一个 BaseTool 实例,可直接调用 tool.invoke(),也支持 .name.description.args 等工具属性,与自定义工具完全兼容。


4. 搜索工具 + 结构化输出预览

TavilySearch 不仅仅可以配合自然语言回答使用,还可以和 with_structured_output() 方法结合,直接输出结构化的结果对象。

下面的示例演示了搜索后如何将结果解析为 SearchResult 模型:

from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
from langchain_tavily import TavilySearch
from pydantic import BaseModel, Field

class SearchResult(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)

for tool_call in ai_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 对象 |

主要内容到这里就结束啦

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐