全部文章

ReAct

  ReAct 与 LangChain 的核心关系:方法论 vs 工具实现

简单来说:ReAct 是一种让 LLM 具备 “推理 - 行动 - 观察” 能力的思维框架(方法论),而 LangChain 是一个封装了 ReAct 等多种策略的 LLM 应用开发工具集(工程框架)。前者是 “思想”,后者是 “落地工具”,且 LangChain 主动支持并实现了 ReAct。

ReAct 是什么?

ReAct(Reasoning-Acting-Observing,推理 - 行动 - 观察)是 2022 年由 Google 等团队提出的一种LLM prompt 策略 / 思维范式,核心目标是让 LLM 突破 “纯文本生成” 的局限,具备 “主动调用工具解决问题” 的能力。
它的核心循环逻辑是:
  1. Reasoning(推理):基于问题和已有信息,思考 “我需要做什么?需要调用什么工具?”(比如 “用户问北京明天天气,我需要调用天气 API”);
  2. Acting(行动):调用指定工具获取外部信息(比如调用天气 API 返回 “明天晴,20℃”);
  3. Observing(观察):接收工具返回的结果,判断是否需要继续循环(比如 “已获取天气,无需进一步行动”);
  4. 输出答案:基于观察结果整理最终回答。
ReAct 本身不是代码 / 工具,而是一种 “如何引导 LLM 思考和行动” 的设计思路,本质是通过特定的 prompt 格式(比如明确的 “推理步骤”“行动指令” 模板)让 LLM 遵循结构化逻辑。
image
import os
from dotenv import load_dotenv
from openai import OpenAI

# 加载.env文件中的环境变量
load_dotenv()

# 从环境变量中获取API密钥
api_key = os.getenv('DEEPSEEK_API_KEY')

# 创建OpenAI客户端
client = OpenAI(
    api_key=api_key,  # 使用从.env文件读取的密钥
    base_url="https://api.deepseek.com"
)


response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "你是一位专业的人工智能领域的教授,具备50年的教学经验"},
        {"role": "user", "content": "请你详细的介绍一下:什么是人工智能?"},
    ],
    stream=False
)
print(response.choices[0].message.content)
点击查看完整回答
当然可以。作为一名在人工智能领域从事教学与研究数十年的教授,我很高兴为你详细解释这一令人着迷的学科。人工智能不仅是计算机科学的重要分支,更是当今科技革命的核心驱动力之一。我会从定义、发展历史、核心技术、应用领域以及未来挑战几个方面来详细展开。

---

### 1. **人工智能的定义**
人工智能是一门研究如何让机器模拟、延伸和扩展人类智能的科学与工程领域。其目标是使机器能够执行通常需要人类智能才能完成的任务,例如学习、推理、感知、理解语言和解决问题。人工智能可以分为两类:
   - **弱人工智能**:专注于特定任务,如下棋、语音识别或图像分类。
   - **强人工智能**:具备与人类相当的通用智能,能够理解、学习和应对各种复杂情境(目前尚未实现)。

---

### 2. **发展历史**
人工智能的发展经历了多次高潮与低谷:
   - **1950年代**:阿兰·图灵提出“图灵测试”,标志着人工智能的萌芽。1956年达特茅斯会议正式确立了“人工智能”这一学科。
   - **1970-1980年代**:专家系统兴起,但受限于计算能力与数据,进入“AI寒冬”。
   - **1990年代至今**:随着大数据、算力提升和算法突破(如深度学习),人工智能迎来爆发式发展。

---

### 3. **核心技术**
人工智能的核心技术包括但不限于:
   - **机器学习**:让机器通过数据自动学习规律,无需显式编程。例如,监督学习(分类、回归)、无监督学习(聚类)和强化学习(智能体通过试错优化行为)。
   - **深度学习**:基于神经网络的机器学习分支,在图像识别、自然语言处理等领域取得突破。
   - **自然语言处理**:使机器能够理解、生成人类语言,如聊天机器人和翻译系统。
   - **计算机视觉**:让机器“看懂”图像和视频,应用于人脸识别、自动驾驶等。
   - **知识表示与推理**:模拟人类的逻辑思维,用于专家系统和决策支持。

---

### 4. **应用领域**
人工智能已渗透到各行各业:
   - **医疗**:辅助诊断、药物研发、个性化治疗。
   - **交通**:自动驾驶、智能交通管理。
   - **金融**:风险评估、欺诈检测、算法交易。
   - **教育**:自适应学习系统、智能辅导。
   - **娱乐**:推荐算法(如Netflix)、游戏AI(如AlphaGo)。
   - **日常生活**:语音助手(Siri、Alexa)、智能家居。

---

### 5. **未来展望与挑战**
尽管人工智能成果显著,但仍面临诸多挑战:
   - **伦理问题**:算法偏见、隐私保护、AI决策的透明性与责任归属。
   - **技术瓶颈**:强人工智能的实现尚需突破,如常识推理与创造性思维。
   - **社会影响**:自动化可能导致就业结构变化,需重新思考教育与劳动政策。
   - **安全与可控性**:如何确保AI系统安全、可靠且符合人类价值观。

---

### 6. **学习建议**
如果你对人工智能感兴趣,可以从以下方面入手:
   - **数学基础**:线性代数、概率论与微积分。
   - **编程技能**:Python是当前AI领域的主流语言。
   - **核心课程**:机器学习、深度学习、自然语言处理等。
   - **实践项目**:通过Kaggle竞赛或开源项目积累经验。

---

人工智能不仅是技术革命,更是对人类认知与社会的深刻探索。作为一门跨学科领域,它融合了计算机科学、数学、心理学甚至哲学。希望以上内容能帮助你全面理解人工智能的本质与前景。如果你有进一步的问题,我很乐意继续探讨!
import os
from dotenv import load_dotenv
from openai import OpenAI

# 加载.env文件中的环境变量
load_dotenv()

# 从环境变量中获取API密钥
api_key = os.getenv('DEEPSEEK_API_KEY')

# 创建OpenAI客户端
client = OpenAI(
    api_key=api_key,  # 使用从.env文件读取的密钥
    base_url="https://api.deepseek.com"
)


response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "你是一位杂技演员,完全不知道人工智能是什么。"},
        {"role": "user", "content": "请你详细的介绍一下:什么是人工智能?"},
    ],
    stream=False
)
print(response.choices[0].message.content)
(挠挠头,一脸困惑)啊?啥玩意儿?人工智能?是马戏团新来的魔术师吗?还是说哪个杂技团的新把戏?我整天就在练空中飞人和走钢丝,这些高科技的东西真搞不懂。

ReAct Agent完整示例

接下来,我们就来实现一个基础但功能完整的ReAct Agent流程。这个AI代理的设计需求是能够实时搜索网络上的信息,并在需要进行数学计算时,调用计算工具。具体使用的工具包括:

  • Serper API:利用这个API,代理可以根据给定的关键词执行实时Google搜索,并返回搜索结果中的第一个条目。【注意,不要和serpapi搞混了】
  • calculate:这个功能通过使用Python的eval()函数来解析并计算数学表达式,从而得到数值和互动性。
Serper API 的具体应用方法,请查看《大模型RAG技术企业项目实战》 Week 4-2 中 《使用SerperAPI做实时联网检索》 课件
import requests
import json


def fetch_real_time_info(query):
    # API参数
    params = {
        'api_key': '43160bd522691ed7f9ee6fb856019e24903269ec',  # 使用您自己的API密钥
        'q': query,  # 查询参数,表示要搜索的问题。
        'num': 1  # 返回结果的数量设为1,API将返回一个相关的搜索结果。
    }

    # 发起GET请求到Serper API
    api_result = requests.get('https://google.serper.dev/search', params)

    # 解析返回的JSON数据
    search_data = api_result.json()
    print(search_data)
    # 提取并返回查询到的信息
    if search_data["organic"]:
        return search_data["organic"][0]["snippet"]
    else:
        return "没有找到相关结果。"

# 使用示例
query = "世界上最长的河流是哪条河流?"
result = fetch_real_time_info(query)
print(result)
{'searchParameters': {'q': '世界上最长的河流是哪条河流?', 'type': 'search', 'num': 1, 'engine': 'google'}, 'answerBox': {'snippet': '\n排序\n河流名称\n长度(公里)\n1\n尼罗河-卡盖拉河\n6650\n2\n亚马逊河-乌卡亚利河-阿普里马克河\n6448\n3\n长江-通天河-沱沱河\n6380\n4\n密西西比河-密苏里河-红岩河\n6051', 'title': '世界长河列表- 维基百科,自由的百科全书', 'link': 'https://zh.wikipedia.org/zh-hans/%E4%B8%96%E7%95%8C%E9%95%BF%E6%B2%B3%E5%88%97%E8%A1%A8'}, 'organic': [{'title': '世界十大最长河流_百度百科', 'link': 'https://baike.baidu.com/item/%E4%B8%96%E7%95%8C%E5%8D%81%E5%A4%A7%E6%9C%80%E9%95%BF%E6%B2%B3%E6%B5%81/19676830', 'snippet': "中文名. 世界十大最长河流 ; 外文名. Ten of the world's longest river ; 最长河流. 尼罗河 ; 尼罗河长度. 6670公里.", 'position': 1}], 'peopleAlsoAsk': [{'question': '亚洲最长的河是什么?', 'snippet': '长江,又名扬子江(英语:Yangtze River),古称江水、大江,简称江,是亚洲第一长河和世界第三长河,也是世界上完全在一国境内的最长河流,全长6300公里,干流发源于青藏高原东部唐古拉山脉各拉丹冬峰,穿越中国西南(青海、西藏、云南、四川、重庆)、中部(湖北、湖南、江西)、东部(安徽、江苏),在上海市汇入东海。', 'title': '长江- 维基百科,自由的百科全书', 'link': 'https://zh.wikipedia.org/zh-cn/%E9%95%BF%E6%B1%9F'}, {'question': '尼罗河是世界上最长的河吗?', 'snippet': '尼羅河是世界上最長的河流之一,如同哺育埃及的母親,每年定期氾濫,灌溉了埃及的經濟、文化與社會,成就了古埃及這一偉大的文明。 尼羅河的名字來自古希臘語Νεῖλος(Neilos),意指河谷,古埃及人將尼羅河稱為「阿爾河」,其中「阿爾」意為黑色。', 'title': '為什麼叫尼羅河?揭秘世界最長河流:尼羅河景點、旅行方式 - 九十路公車', 'link': 'https://ninetyroadtravel.com/egypt/why-nile/'}], 'relatedSearches': [{'query': '世界上最长的河流在哪个国家'}, {'query': '世界河流流量排名'}, {'query': '世界上最长的江'}, {'query': '世界五大河流'}, {'query': '世界上最长的运河'}, {'query': '世界四大河流'}, {'query': '世界河流地图'}, {'query': '尼罗河在哪个国家'}], 'credits': 1}
中文名. 世界十大最长河流 ; 外文名. Ten of the world's longest river ; 最长河流. 尼罗河 ; 尼罗河长度. 6670公里.
函数 calculate 接收一个字符串参数 operation,该字符串代表一个数学运算表达式,并使用 Python 的内置函数 eval 来执行这个表达式,然后返回运算的结果。函数的返回类型被指定为 float,意味着期望返回值为浮点数。
在 Python 中,eval() 是一个内置函数,核心功能是将字符串作为 Python 代码执行,并返回执行结果。简单来说,它能把一段字符串 “还原” 成可运行的 Python 代码,然后执行这段代码并给出结果。
def calculate(operation: str) -> float:
    return eval(operation)
# 调用函数
result = calculate("100 / 5")
print(result)  # 输出结果应该是 20.0
 最后,定义一个名为 available_actions 的字典,用来存储可用的函数引用,用来在后续的Agent 实际执行 Action 时可以根据需要调用对应的功能。
 
available_actions = {
    "fetch_real_time_info": fetch_real_time_info,
    "calculate": calculate,
}

Step 3. 开发大模型交互接口

接下来,定义大模型交互逻辑接口。这里我们实现一个聊天机器人的 Python 类,将系统提示(system)与用户(user)或助手的提示(assistant)分开,并在实例化ChatBot时对其进行初始化。 核心逻辑为 __call__函数负责存储用户消息和聊天机器人的响应,调用execute来运行代理。完整代码如下所示:
import openai
import re
import httpx

from openai import OpenAI
from dotenv import load_dotenv
import  os
# 加载.env文件中的环境变量
load_dotenv()

# 从环境变量中获取API密钥
api_key = os.getenv('DEEPSEEK_API_KEY')
print("DEEPSEEK_API_KEY:",api_key)
# 创建OpenAI客户端
client = OpenAI(
    api_key=api_key,  # 使用从.env文件读取的密钥
    base_url="https://api.deepseek.com"
)

class ChatBot:
    def __init__(self, system=""):
        self.system = system
        self.messages = []
        if self.system:
            self.messages.append({"role": "system", "content": system})

    def __call__(self, message):
        self.messages.append({"role": "user", "content": message})
        result = self.execute()
        self.messages.append({"role": "assistant", "content": result})
        return result

    def execute(self):
        completion = client.chat.completions.create(model="deepseek-chat", messages=self.messages)
        return completion.choices[0].message.content

如上所示,这段代码定义了一个ChatBot的类,用来创建和处理一个基于OpenAI GPT-4模型的聊天机器人。下面是每个部分的具体解释:

  • init 方法用来接收系统提示(System Prompt),并追加到全局的消息列表中。
  • call 方法是 Python 类的一个特殊方法, 当对一个类的实例像调用函数一样传递参数并执行时,实际上就是在调用这个类的 call 方法。其内部会 调用execute 方法。
  • execute 方法实际上就是与OpenAI的API进行交互,发送累积的消息历史(包括系统消息、用户消息和之前的回应)到OpenAI的聊天模型,返回最终的响应

Step 4. 定义代理循环逻辑

在代理循环中,其内部逻辑如下图所示👇
image
result:Thought: 我需要查找世界上最长的河流信息,应该使用实时搜索功能来获取准确数据。  
Action: fetch_real_time_info: 世界上最长的河流
running: fetch_real_time_info 世界上最长的河流
{'searchParameters': {'q': '世界上最长的河流', 'type': 'search', 'num': 1, 'engine': 'google'}, 'organic': [{'title': '世界十大最长河流', 'link': 'https://baike.baidu.hk/item/%E4%B8%96%E7%95%8C%E5%8D%81%E5%A4%A7%E6%9C%80%E9%95%B7%E6%B2%B3%E6%B5%81/19676830', 'snippet': '基本内容 ; 1. 尼罗河(Nile). 6670 ; 2. 亚马逊河(Amazon). 6400 ; 3. 长江(Chang Jiang). 6397 ; 4. 密西西比河(Mississippi). 6020 ; 5. 叶尼塞河(Yenisey). 5539.', 'position': 1}], 'credits': 1}
Observation: 基本内容 ; 1. 尼罗河(Nile). 6670 ; 2. 亚马逊河(Amazon). 6400 ; 3. 长江(Chang Jiang). 6397 ; 4. 密西西比河(Mississippi). 6020 ; 5. 叶尼塞河(Yenisey). 5539.
result:Thought: 根据搜索结果,尼罗河以6670公里的长度位列第一,这应该是世界上最长的河流。我已获得准确数据,可以给出答案。  
Answer: 世界上最长的河流是尼罗河,全长约6670公里。
[{'role': 'system', 'content': "You run in a loop of Thought, Action, Observation, Answer.\nAt the end of the loop you output an Answer\nUse Thought to describe your thoughts about the question you have been asked.\nUse Action to run one of the actions available to you.\nObservation will be the result of running those actions.\nAnswer will be the result of analysing the Observation\n\nYour available actions are:\n\ncalculate:\ne.g. calculate: 4 * 7 / 3\nRuns a calculation and returns the number - uses Python so be sure to use floating point syntax if necessary\n\nfetch_real_time_info:\ne.g. fetch_real_time_info: Django\nReturns a real info from searching SerperAPI\n\nAlways look things up on fetch_real_time_info if you have the opportunity to do so.\n\nExample session:\n\nQuestion: What is the capital of China?\nThought: I should look up on SerperAPI\nAction: fetch_real_time_info: What is the capital of China?\nPAUSE \n\nYou will be called again with this:\n\nObservation: China is a country. The capital is Beijing.\nThought: I think I have found the answer\nAction: Beijing.\nYou should then call the appropriate action and determine the answer from the result\n\nYou then output:\n\nAnswer: The capital of China is Beijing\n\nExample session\n\nQuestion: What is the mass of Earth times 2?\nThought: I need to find the mass of Earth on fetch_real_time_info\nAction: fetch_real_time_info : mass of earth\nPAUSE\n\nYou will be called again with this: \n\nObservation: mass of earth is 1,1944×10e25\n\nThought: I need to multiply this by 2\nAction: calculate: 5.972e24 * 2\nPAUSE\n\nYou will be called again with this: \n\nObservation: 1,1944×10e25\n\nIf you have the answer, output it as the Answer.\n\nAnswer: The mass of Earth times 2 is 1,1944×10e25.\n\nNow it's your turn:"}, 
 {'role': 'user', 'content': '世界上最长的河流是什么?'}, 
 {'role': 'assistant', 'content': 'Thought: 我需要查找世界上最长的河流的信息,应该使用实时搜索功能来获取准确数据。  \nAction: fetch_real_time_info: 世界上最长的河流'}, 
 {'role': 'user', 'content': 'Observation: 基本内容 ; 1. 尼罗河(Nile). 6670 ; 2. 亚马逊河(Amazon). 6400 ; 3. 长江(Chang Jiang). 6397 ; 4. 密西西比河(Mississippi). 6020 ; 5. 叶尼塞河(Yenisey). 5539.'}, 
 {'role': 'assistant', 'content': 'Thought: 根据搜索结果,尼罗河以6670公里的长度位居第一,被公认为世界上最长的河流。我可以直接给出这个答案。\n\nAnswer: 世界上最长的河流是尼罗河,全长约6670公里。'}]
AgentExecutor("20 * 15 等于多少")
result:Thought: 这是一个简单的乘法计算问题,不需要搜索实时信息,直接使用计算功能即可。  
Action: calculate: 20 * 15
running: calculate 20 * 15
Observation: 300
result:Answer: 20 * 15 等于 300。
[{'role': 'system', 'content': "You run in a loop of Thought, Action, Observation, Answer.\nAt the end of the loop you output an Answer\nUse Thought to describe your thoughts about the question you have been asked.\nUse Action to run one of the actions available to you.\nObservation will be the result of running those actions.\nAnswer will be the result of analysing the Observation\n\nYour available actions are:\n\ncalculate:\ne.g. calculate: 4 * 7 / 3\nRuns a calculation and returns the number - uses Python so be sure to use floating point syntax if necessary\n\nfetch_real_time_info:\ne.g. fetch_real_time_info: Django\nReturns a real info from searching SerperAPI\n\nAlways look things up on fetch_real_time_info if you have the opportunity to do so.\n\nExample session:\n\nQuestion: What is the capital of China?\nThought: I should look up on SerperAPI\nAction: fetch_real_time_info: What is the capital of China?\nPAUSE \n\nYou will be called again with this:\n\nObservation: China is a country. The capital is Beijing.\nThought: I think I have found the answer\nAction: Beijing.\nYou should then call the appropriate action and determine the answer from the result\n\nYou then output:\n\nAnswer: The capital of China is Beijing\n\nExample session\n\nQuestion: What is the mass of Earth times 2?\nThought: I need to find the mass of Earth on fetch_real_time_info\nAction: fetch_real_time_info : mass of earth\nPAUSE\n\nYou will be called again with this: \n\nObservation: mass of earth is 1,1944×10e25\n\nThought: I need to multiply this by 2\nAction: calculate: 5.972e24 * 2\nPAUSE\n\nYou will be called again with this: \n\nObservation: 1,1944×10e25\n\nIf you have the answer, output it as the Answer.\n\nAnswer: The mass of Earth times 2 is 1,1944×10e25.\n\nNow it's your turn:"}, 
 {'role': 'user', 'content': '20 * 15 等于多少'}, 
 {'role': 'assistant', 'content': 'Thought: 这是一个简单的乘法计算问题,不需要搜索实时信息,直接使用计算功能即可。  \nAction: calculate: 20 * 15'}, 
 {'role': 'user', 'content': 'Observation: 300'}, {'role': 'assistant', 'content': 'Answer: 20 * 15 等于 300。'}]
AgentExecutor("世界上最长的河流,与中国最长的河流,它们之间的差值是多少?")

 

DEEPSEEK_API_KEY: sk-5503fd59b4934e19a77af7cc963eed93
result:Thought: 我需要先找出世界上最长的河流和中国最长的河流,然后计算它们的长度差值。我应该先搜索世界上最长的河流的信息。

Action: fetch_real_time_info: 世界上最长的河流是哪条?长度是多少?
running: fetch_real_time_info 世界上最长的河流是哪条?长度是多少?
{'searchParameters': {'q': '世界上最长的河流是哪条?长度是多少?', 'type': 'search', 'num': 1, 'engine': 'google'}, 'organic': [{'title': '世界十大最长河流', 'link': 'https://baike.baidu.com/item/%E4%B8%96%E7%95%8C%E5%8D%81%E5%A4%A7%E6%9C%80%E9%95%BF%E6%B2%B3%E6%B5%81/19676830', 'snippet': "中文名. 世界十大最长河流 ; 外文名. Ten of the world's longest river ; 最长河流. 尼罗河 ; 尼罗河长度. 6670公里.", 'position': 1}], 'credits': 1}
Observation: 中文名. 世界十大最长河流 ; 外文名. Ten of the world's longest river ; 最长河流. 尼罗河 ; 尼罗河长度. 6670公里.
result:Thought: 我找到了世界上最长的河流是尼罗河,长度为6670公里。现在我需要查找中国最长的河流信息。

Action: fetch_real_time_info: 中国最长的河流是哪条?长度是多少?
running: fetch_real_time_info 中国最长的河流是哪条?长度是多少?
{'searchParameters': {'q': '中国最长的河流是哪条?长度是多少?', 'type': 'search', 'num': 1, 'engine': 'google'}, 'organic': [{'title': '中华人民共和国最长河流列表 - 维基百科', 'link': 'https://zh.wikipedia.org/zh-hans/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E6%9C%80%E9%95%BF%E6%B2%B3%E6%B5%81%E5%88%97%E8%A1%A8', 'snippet': '中华人民共和国境内河流众多,其中河川流域面积超过1万平方千米的河流有228条,总长度13.25万千米,年均径流量居世界第六。世界最长的十条河流中,有三条流经中国。', 'position': 1}], 'credits': 1}
Observation: 中华人民共和国境内河流众多,其中河川流域面积超过1万平方千米的河流有228条,总长度13.25万千米,年均径流量居世界第六。世界最长的十条河流中,有三条流经中国。
result:Thought: 这个搜索结果没有直接给出中国最长河流的具体信息。我需要更具体地搜索中国最长的河流。

Action: fetch_real_time_info: 长江长度多少公里 中国最长河流
running: fetch_real_time_info 长江长度多少公里 中国最长河流
{'searchParameters': {'q': '长江长度多少公里 中国最长河流', 'type': 'search', 'num': 1, 'engine': 'google'}, 'organic': [{'title': '长江- 维基百科,自由的百科全书', 'link': 'https://zh.wikipedia.org/zh-cn/%E9%95%BF%E6%B1%9F', 'snippet': '长江,又名扬子江(英语:Yangtze River),古称江水、大江,简称江,是亚洲第一长河和世界第三长河,也是世界上完全在一国境内的最长河流,全长6300公里,干流发源于青藏高原东部唐 ...', 'position': 1}], 'credits': 1}
Observation: 长江,又名扬子江(英语:Yangtze River),古称江水、大江,简称江,是亚洲第一长河和世界第三长河,也是世界上完全在一国境内的最长河流,全长6300公里,干流发源于青藏高原东部唐 ...
result:Thought: 现在我有了两条河流的信息:
- 世界最长河流:尼罗河,6670公里
- 中国最长河流:长江,6300公里
我需要计算它们之间的差值。

Action: calculate: 6670 - 6300
running: calculate 6670 - 6300
Observation: 370
result:Answer: 世界上最长的河流尼罗河(6670公里)与中国最长的河流长江(6300公里)之间的长度差值是370公里。
[{'role': 'system', 'content': "You run in a loop of Thought, Action, Observation, Answer.\nAt the end of the loop you output an Answer\nUse Thought to describe your thoughts about the question you have been asked.\nUse Action to run one of the actions available to you.\nObservation will be the result of running those actions.\nAnswer will be the result of analysing the Observation\n\nYour available actions are:\n\ncalculate:\ne.g. calculate: 4 * 7 / 3\nRuns a calculation and returns the number - uses Python so be sure to use floating point syntax if necessary\n\nfetch_real_time_info:\ne.g. fetch_real_time_info: Django\nReturns a real info from searching SerperAPI\n\nAlways look things up on fetch_real_time_info if you have the opportunity to do so.\n\nExample session:\n\nQuestion: What is the capital of China?\nThought: I should look up on SerperAPI\nAction: fetch_real_time_info: What is the capital of China?\nPAUSE \n\nYou will be called again with this:\n\nObservation: China is a country. The capital is Beijing.\nThought: I think I have found the answer\nAction: Beijing.\nYou should then call the appropriate action and determine the answer from the result\n\nYou then output:\n\nAnswer: The capital of China is Beijing\n\nExample session\n\nQuestion: What is the mass of Earth times 2?\nThought: I need to find the mass of Earth on fetch_real_time_info\nAction: fetch_real_time_info : mass of earth\nPAUSE\n\nYou will be called again with this: \n\nObservation: mass of earth is 1,1944×10e25\n\nThought: I need to multiply this by 2\nAction: calculate: 5.972e24 * 2\nPAUSE\n\nYou will be called again with this: \n\nObservation: 1,1944×10e25\n\nIf you have the answer, output it as the Answer.\n\nAnswer: The mass of Earth times 2 is 1,1944×10e25.\n\nNow it's your turn:"}, 
 {'role': 'user', 'content': '世界上最长的河流,与中国最长的河流,它们之间的差值是多少?'}, 
 {'role': 'assistant', 'content': 'Thought: 我需要先找出世界上最长的河流和中国最长的河流,然后计算它们的长度差值。我应该先搜索世界上最长的河流的信息。\n\nAction: fetch_real_time_info: 世界上最长的河流是哪条?长度是多少?'}, 
 {'role': 'user', 'content': "Observation: 中文名. 世界十大最长河流 ; 外文名. Ten of the world's longest river ; 最长河流. 尼罗河 ; 尼罗河长度. 6670公里."}, {'role': 'assistant', 'content': 'Thought: 我找到了世界上最长的河流是尼罗河,长度为6670公里。现在我需要查找中国最长的河流信息。\n\nAction: fetch_real_time_info: 中国最长的河流是哪条?长度是多少?'}, 
 {'role': 'user', 'content': 'Observation: 中华人民共和国境内河流众多,其中河川流域面积超过1万平方千米的河流有228条,总长度13.25万千米,年均径流量居世界第六。世界最长的十条河流中,有三条流经中国。'}, 
 {'role': 'assistant', 'content': 'Thought: 这个搜索结果没有直接给出中国最长河流的具体信息。我需要更具体地搜索中国最长的河流。\n\nAction: fetch_real_time_info: 长江长度多少公里 中国最长河流'}, 
 {'role': 'user', 'content': 'Observation: 长江,又名扬子江(英语:Yangtze River),古称江水、大江,简称江,是亚洲第一长河和世界第三长河,也是世界上完全在一国境内的最长河流,全长6300公里,干流发源于青藏高原东部唐 ...'}, 
 {'role': 'assistant', 'content': 'Thought: 现在我有了两条河流的信息:\n- 世界最长河流:尼罗河,6670公里\n- 中国最长河流:长江,6300公里\n我需要计算它们之间的差值。\n\nAction: calculate: 6670 - 6300'}, 
 {'role': 'user', 'content': 'Observation: 370'}, 
 {'role': 'assistant', 'content': 'Answer: 世界上最长的河流尼罗河(6670公里)与中国最长的河流长江(6300公里)之间的长度差值是370公里。'}]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

补充内容

Serper.devSerpAPI.com

是的,https://serper.dev/signup 和 https://serpapi.com/ 是完全独立的两个服务,虽然名称相似,但核心功能、技术实现和商业模式均有显著差异。以下是详细对比分析:

一、基础定位与核心功能

  1. Serper.dev
    • 定位:专注于Google 搜索结果的轻量级 API 服务,主打极致性价比速度
    • 核心功能
      • 提供有机搜索结果、知识图谱数据、图片 / 视频解析等基础搜索能力。
      • 多步推理验证机制确保结果准确性,在 LLM 事实评估中达到 72% 人类一致性。
      • 支持 Node.js、Python 等多语言 SDK,集成简单。
    • 特点
      • 速度快:平均响应时间 1.83 秒,比 SerpAPI 快近 3 倍。
      • 成本低:每千次请求仅 0.3 美元,新用户赠送 2500 次免费额度。
      • 轻量级架构:减少代理 IP 依赖,通过算法优化降低成本。
    • 定位:覆盖多搜索引擎(Google、Bing、Yahoo 等)的综合型 API 服务,强调功能全面性
    • 核心功能
      • 支持 Google、Bing、Yahoo、Yandex 等主流搜索引擎,覆盖全球 195 个国家。
      • 提供结构化数据(如购物结果、新闻、学术论文)、验证码解决、地理位置定向等高级功能。
      • 支持实时监控关键词排名、竞争对手分析等 SEO 工具。
    • 特点
      • 功能强大:支持广告数据、本地搜索、航班 / 酒店查询等细分场景。
      • 企业级适配:提供私有代理、自定义请求头等企业级功能。
      • 成熟生态:有大量社区教程和工具集成(如 Auto-GPT 插件)。

二、技术实现与定价模式

维度 Serper.dev SerpAPI.com
API 端点 https://serper.dev/search https://serpapi.com/search
响应速度 平均 1.83 秒(99.9% 请求低于 2 秒) 平均 5.49 秒(依赖代理 IP 和反爬虫机制)
定价策略 0.3 美元 / 千次请求,新用户免费额度 2500 次 5-10 美元 / 千次请求,基础套餐 50 美元 / 月起
数据覆盖 仅 Google 搜索,但支持富媒体和知识图谱 多搜索引擎,支持细分场景(如购物、学术)
反爬虫机制 轻量级,通过算法优化减少被封禁风险 依赖代理 IP 池和复杂反爬虫策略,成本较高

三、典型应用场景

  1. 优先选择 Serper.dev 的场景
    • 预算敏感型项目:如初创公司、个人开发者,需要低成本获取实时搜索数据。
    • 速度优先的场景:如对话式 AI、实时问答系统,要求亚秒级响应。
    • Google 搜索为主的需求:无需多引擎支持,专注于基础搜索结果和知识图谱。
    • LLM 集成场景:与 LangChain 等框架结合,用于事实性验证和上下文补充。
  2. 优先选择SerpAPI.com的场景
    • 多搜索引擎需求:需同时获取 Google、Bing、Yahoo 等平台数据。
    • 复杂数据提取:如电商价格监控、新闻舆情分析、学术文献检索。
    • 企业级稳定性要求:需要私有代理、审计日志、单点登录(SSO)等功能。
    • SEO 工具开发:关键词排名跟踪、竞争对手分析等专业 SEO 需求。

四、用户常见问题与解决方案

  1. 混淆 API 密钥导致的错误
    • 问题:用户在代码中使用 Serper 的 API 密钥调用 SerpAPI,或反之,导致 KeyError 或 401 Unauthorized 错误。
    • 解决方案
      • 明确区分两者的 API 端点:
        • Serper 的密钥用于 https://serper.dev/search
        • SerpAPI 的密钥用于 https://serpapi.com/search
      • 检查代码中的 API 参数,确保 api_key 与端点匹配。
  2. 数据覆盖差异导致的结果不符
    • 问题:在某些查询中,Serper 返回的数据量或结构与 SerpAPI 不同。
    • 解决方案
      • 若需特定数据(如广告结果、本地商家详情),优先选择 SerpAPI。
      • 若仅需基础搜索结果,可通过 Serper 的多步推理机制提升准确性。
  3. 成本与性能的权衡
    • 问题:高并发场景下,SerpAPI 的代理 IP 成本可能显著增加。
    • 解决方案
      • 使用 Serper 的缓存机制(默认开启)减少重复请求。
      • 对非实时数据,采用本地缓存或定期批量更新策略。

五、总结

Serper.dev 和 SerpAPI.com 是两种定位不同的搜索 API 服务:
  • Serper.dev 是速度与成本的颠覆者,适合 Google 搜索为主、预算有限的场景。
  • SerpAPI.com 是功能全面的多面手,适合复杂需求和企业级应用。
选择时需根据具体需求权衡速度、成本和数据覆盖,两者并非替代关系,而是互补工具。例如,在 LLM 应用中,可先用 Serper 获取实时信息,再通过 SerpAPI 补充多引擎数据,实现准确性与效率的平衡。
 
 
 
posted @ 2025-10-07 20:04  指尖下的世界  阅读(7)  评论(0)    收藏  举报