乐于分享
好东西不私藏

AI Case 8 · AI调用搜索引擎

AI Case 8 · AI调用搜索引擎

AI Case 8 · 让AI调用搜索引擎

21天AI案例实践 · 第8期 | 关键词:Function Calling · Tool定义 · Agent搜索 · ReAct范式


大模型虽然知识渊博,但它的训练数据有截止时间。碰到"今天发生了什么"、"最新股价多少"这类问题,它只能摊手说"我的知识截止到XXXX年"。

今天我们就来解决这个问题——让AI学会上网搜索


一、核心思路:把搜索引擎变成AI的"工具"

回想一下你自己遇到不知道的事情:打开搜索引擎 → 输入关键词 → 看结果 → 总结答案。

Function Calling 就是让AI也走这套流程。

技术架构

整个系统分为四层:

层级 职责 核心组件
用户交互层 接收自然语言问题 命令行 / API / 微信
Agent推理层 理解意图、决策、调用工具 LangChain Agent + LLM
外部服务层 执行搜索、获取数据 Google / DuckDuckGo API
结果输出层 整合信息、生成回答 自然语言 + 引用来源

二、Function Calling 到底是怎么跑的?

这里有一个很多人会搞混的点:不是AI"主动"去调用搜索,而是LLM输出一个特殊的结构化响应(tool_call),由外部的 Agent 框架来执行。

整个流程遵循 ReAct 范式(Reasoning + Acting):

Thought(思考)→ Action(行动)→ Observation(观察)→ 循环

第1步:LLM 分析问题

用户问:"今天有什么AI大新闻?" LLM想:这个问题需要最新信息,我自己的知识不够 → 生成 tool_call: web_search("AI news today")

第2步:Agent 执行工具

Agent框架拿到 tool_call → 调用 Google Search API → 拿到10条搜索结果

第3步:结果返回 LLM

搜索结果作为上下文注入 → LLM基于搜索结果重新思考 → 生成最终回答

关键洞察:如果一次搜索不够,Agent 会自动发起第二轮、第三轮……直到认为信息够了为止。


三、上代码!10分钟跑起来

下面是一个完整可运行的最小示例。只有 65 行代码,但包含了搜索 Agent 的全部核心逻辑。

环境准备

pip install langchain langchain-openai duckduckgo-search

完整代码

"""
AI搜索Agent - 最小可运行示例
使用 DuckDuckGo 搜索(免费,无需API Key)+ LangChain Agent
"""

from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.tools import DuckDuckGoSearchRun

# ── 1. 配置LLM ──
llm = ChatOpenAI(
    model="gpt-4o-mini",          # 性价比之选,也可以用 qwen-plus
    temperature=0.3,
    api_key="your-api-key",       # 替换为你的 OpenAI / 通义千问 API Key
    base_url="https://api.openai.com/v1"  # 或通义千问: https://dashscope.aliyuncs.com/compatible-mode/v1
)

# ── 2. 定义工具:DuckDuckGo 搜索 ──
search = DuckDuckGoSearchRun(
    name="web_search",
    description="搜索互联网获取最新信息。输入搜索关键词,返回相关网页摘要。"
)

tools = [search]

# ── 3. 定义 System Prompt ──
prompt = ChatPromptTemplate.from_messages([
    ("system""""你是一个专业的AI研究助手,具备联网搜索能力。
    
工作流程:
1. 遇到需要最新信息的问题,先调用 web_search 工具搜索
2. 获取搜索结果后,基于结果进行总结分析
3. 如果一次搜索信息不够,可以发起多次搜索
4. 回答时务必注明信息来源

注意:
- 搜索时使用简洁的关键词,不要输入完整句子
- 中文问题优先搜索中文关键词
- 如果搜索无结果,诚实告知用户"""
),
    ("human""{input}"),
    ("placeholder""{agent_scratchpad}"),
])

# ── 4. 构建 Agent ──
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,           # 打印思考过程,方便调试
    max_iterations=5,       # 最多搜索5轮
    handle_parsing_errors=True
)

# ── 5. 测试 ──
if __name__ == "__main__":
    questions = [
        "2026年6月AI领域有什么重要新闻?",
        "OpenAI最新的GPT模型有什么新功能?",
        "中国AI大模型市场的最新格局是怎样的?",
    ]
    
    for q in questions:
        print(f"\n{'='*50}")
        print(f"❓ 提问: {q}")
        print(f"{'='*50}")
        result = executor.invoke({"input": q})
        print(f"\n✅ 回答:\n{result['output']}")

运行效果

开启 verbose=True 后,你会看到 Agent 的完整思考过程:

> Entering new AgentExecutor chain...

Invoking: `web_search` with `2026年6月 AI 重要新闻`

[搜索结果] Title: 2026年6月AI行业十大事件 ...
            Summary: 6月以来,AI行业发生多起重磅事件:...

基于搜索结果,2026年6月AI领域主要有以下几个重要事件:
1. ...
2. ...

> Finished chain.

四、关键知识点

4.1 Tool 定义规范

LangChain 中定义一个 Tool 有三要素:

@tool
def my_search(query: str) -> str:
    """搜索互联网获取最新信息"""
    # 实现搜索逻辑
    return results
要素 说明 例子
name 工具名称,LLM用这个来调用 web_search
description 何时使用这个工具 "搜索互联网获取最新信息"
function 实际的执行逻辑 API调用 / 数据库查询

描述写得好不好,直接决定 Agent 会不会用这个工具。 如果描述太模糊,LLM 可能完全忽略它。

4.2 ReAct 范式

ReAct = Reasoning + Acting,是当前 Agent 领域最主流的范式:

Question: 今天深圳天气怎么样?

Thought: 我需要查询深圳今天的天气
Action: web_search
Action Input: "深圳 2026年6月10日 天气"
Observation: 深圳今日晴,25-32℃,湿度65%...

Thought: 我已经获得了天气信息,可以给出答案了
Final Answer: 深圳今天天气晴朗,温度25-32℃,适合出行。

4.3 常见搜索引擎方案对比

方案 费用 API Key 特点
DuckDuckGo 免费 不需要 适合开发测试,结果可能有限
Google Custom Search 100次/天免费 需要 结果质量高,有配额限制
Bing Search API $7/1000次 需要 微软生态,国内可用
SerpAPI $50/月起 需要 代理多搜索引擎,省心

五、生产环境增强建议

上面的代码可以直接跑通,但要用于生产,建议补充以下几点:

  1. 超时控制:搜索API响应可能很慢,加 timeout 参数
  2. 结果缓存:相同搜索词短时间内不重复请求(省配额)
  3. 敏感词过滤:用户输入可能包含敏感内容,需要后端过滤
  4. 搜索结果清洗:去掉SEO垃圾、广告页面,保留高质量内容
  5. 引用溯源:每条回答附上原始URL,让用户可以核实

六、本期小结

维度 要点
核心能力 Function Calling 让 LLM 可以调用外部工具
关键机制 ReAct 循环:思考→行动→观察→再思考
代码复杂度 65行核心代码即可运行
扩展方向 不只搜索引擎,任何API都可以包装成Tool

第8期的核心心法:AI 的能力 = LLM的推理能力 × 可调用的工具数量。工具越多,AI能做的事情就越多。


🚀 下期预告:SQL智能查询助手 — 让AI直接用自然语言查数据库,零SQL基础也能做数据分析。


本文是「21天AI案例实践」系列第8期,每期一个可运行的AI实战项目。关注本号,不错过更新。