SERP API 35 分钟阅读

为AI Agent赋能:使用SERP API实现实时联网搜索能力

深度讲解如何使用SERP API为AI Agent添加实时网络搜索能力。包含AI意图识别、搜索查询生成、结果解析和上下文整合等完整技术方案。通过OpenAI/Claude API集成代码示例,帮助AI应用获取最新信息,解决知识截止问题。

13,942 字

在AI应用快速发展的今天,实时信息获取已成为AI Agent的核心能力之一。无论是ChatGPT、Claude还是自研的AI助手,都需要能够访问最新的互联网信息来回答用户问题。SERP API正是实现这一能力的关键技术。

为什么AI Agent需要联网搜索?

AI的知识截止日期问题

大语言模型(LLM)都有一个固有的限制:知识截止日期。例如:

  • GPT-4的训练数据截止到2023年4月
  • Claude的知识截止到2024年初
  • 其他模型也都有类似限制

这意味着AI无法回答关于最新事件、实时数据或最近发布信息的问题。

联网搜索的价值

通过集成SERP API,AI Agent可以:

  1. 获取最新信息:实时新闻、股票价格、天气等
  2. 事实核查:验证AI生成内容的准确性
  3. 补充知识:获取训练数据中不存在的信息
  4. 提供来源:为答案提供可验证的信息来源

AI Agent联网搜索架构

基本架构

用户提问 → AI判断是否需要搜索 → SERP API搜索 → 提取相关信息 → AI整合答案 → 返回用户

核心组件

  1. 意图识别:判断问题是否需要联网搜索
  2. 查询生成:将用户问题转换为搜索关键词
  3. 搜索执行:调用SERP API获取结果
  4. 内容提取:从搜索结果中提取相关信息
  5. 答案生成:AI基于搜索结果生成回答

实战:构建AI Agent搜索功能

第一步:环境准备

import requests
import openai
from datetime import datetime
import json

# 配置API密钥
SEARCHCANS_API_KEY = "your_searchcans_api_key"
OPENAI_API_KEY = "your_openai_api_key"

openai.api_key = OPENAI_API_KEY

第二步:实现搜索功能

class SearchTool:
    def __init__(self, api_key):
        self.api_key = api_key
        self.api_url = "https://searchcans.youxikuang.cn/api/search"
    
    def search(self, query, num_results=5):
        """
        执行搜索并返回结果
        """
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "s": query,
            "t": "bing",
            "p": 1
        }
        
        try:
            response = requests.post(
                self.api_url,
                headers=headers,
                json=payload,
                timeout=10
            )
            
            if response.status_code == 200:
                data = response.json()
                results = data.get('organic', [])[:num_results]
                
                return [{
                    'title': r.get('title', ''),
                    'url': r.get('link', ''),
                    'snippet': r.get('snippet', '')
                } for r in results]
            else:
                return []
                
        except Exception as e:
            print(f"搜索失败: {str(e)}")
            return []
    
    def format_results(self, results):
        """
        格式化搜索结果为文本
        """
        if not results:
            return "未找到相关搜索结果。"
        
        formatted = "搜索结果:\n\n"
        for i, result in enumerate(results, 1):
            formatted += f"{i}. {result['title']}\n"
            formatted += f"   {result['snippet']}\n"
            formatted += f"   来源: {result['url']}\n\n"
        
        return formatted

第三步:实现AI Agent核心逻辑

class AIAgent:
    def __init__(self, openai_key, search_tool):
        self.openai_key = openai_key
        self.search_tool = search_tool
        openai.api_key = openai_key
    
    def should_search(self, question):
        """
        判断问题是否需要联网搜索
        """
        prompt = f"""判断以下问题是否需要联网搜索最新信息。
如果问题涉及实时数据、最新新闻、当前事件、具体日期后的信息,回答"是"。
如果是常识性问题、历史知识、概念解释,回答"否"。

问题:{question}

只回答"是"或"否":"""
        
        try:
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=[{"role": "user", "content": prompt}],
                max_tokens=10,
                temperature=0
            )
            
            answer = response.choices[0].message.content.strip()
            return "是" in answer or "yes" in answer.lower()
            
        except Exception as e:
            print(f"意图识别失败: {str(e)}")
            return False
    
    def generate_search_query(self, question):
        """
        将用户问题转换为搜索查询
        """
        prompt = f"""将以下问题转换为适合搜索引擎的关键词查询。
只返回关键词,不要有其他解释。

问题:{question}

搜索关键词:"""
        
        try:
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=[{"role": "user", "content": prompt}],
                max_tokens=50,
                temperature=0
            )
            
            return response.choices[0].message.content.strip()
            
        except Exception as e:
            print(f"查询生成失败: {str(e)}")
            return question
    
    def answer_with_search(self, question, search_results):
        """
        基于搜索结果生成答案
        """
        search_context = self.search_tool.format_results(search_results)
        
        prompt = f"""基于以下搜索结果回答用户问题。
请综合搜索结果中的信息,给出准确、完整的答案。
如果搜索结果不足以回答问题,请说明。
在答案末尾注明信息来源。

{search_context}

用户问题:{question}

回答:"""
        
        try:
            response = openai.ChatCompletion.create(
                model="gpt-4",
                messages=[{"role": "user", "content": prompt}],
                max_tokens=500,
                temperature=0.7
            )
            
            return response.choices[0].message.content.strip()
            
        except Exception as e:
            print(f"答案生成失败: {str(e)}")
            return "抱歉,我无法生成答案。"
    
    def answer_without_search(self, question):
        """
        直接回答问题(不需要搜索)
        """
        try:
            response = openai.ChatCompletion.create(
                model="gpt-4",
                messages=[{"role": "user", "content": question}],
                max_tokens=500,
                temperature=0.7
            )
            
            return response.choices[0].message.content.strip()
            
        except Exception as e:
            print(f"答案生成失败: {str(e)}")
            return "抱歉,我无法回答这个问题。"
    
    def chat(self, question):
        """
        处理用户问题的主函数
        """
        print(f"\n用户问题: {question}")
        print("正在分析问题...")
        
        # 判断是否需要搜索
        needs_search = self.should_search(question)
        
        if needs_search:
            print("需要联网搜索最新信息...")
            
            # 生成搜索查询
            search_query = self.generate_search_query(question)
            print(f"搜索关键词: {search_query}")
            
            # 执行搜索
            search_results = self.search_tool.search(search_query)
            print(f"找到 {len(search_results)} 条搜索结果")
            
            # 基于搜索结果生成答案
            answer = self.answer_with_search(question, search_results)
            
            return {
                'answer': answer,
                'used_search': True,
                'search_query': search_query,
                'sources': [r['url'] for r in search_results]
            }
        else:
            print("使用已有知识回答...")
            
            # 直接回答
            answer = self.answer_without_search(question)
            
            return {
                'answer': answer,
                'used_search': False
            }

第四步:使用AI Agent

# 初始化
search_tool = SearchTool(SEARCHCANS_API_KEY)
agent = AIAgent(OPENAI_API_KEY, search_tool)

# 测试问题
questions = [
    "今天的天气怎么样?",  # 需要搜索
    "什么是机器学习?",    # 不需要搜索
    "2024年诺贝尔物理学奖得主是谁?",  # 需要搜索
    "Python中如何定义函数?"  # 不需要搜索
]

for question in questions:
    result = agent.chat(question)
    print(f"\n回答: {result['answer']}")
    
    if result['used_search']:
        print(f"\n信息来源:")
        for source in result['sources']:
            print(f"  - {source}")
    
    print("\n" + "="*60)

高级功能实现

1. 多轮对话支持

class ConversationalAgent(AIAgent):
    def __init__(self, openai_key, search_tool):
        super().__init__(openai_key, search_tool)
        self.conversation_history = []
    
    def chat(self, question):
        """支持多轮对话的聊天功能"""
        # 添加用户问题到历史
        self.conversation_history.append({
            "role": "user",
            "content": question
        })
        
        # 判断是否需要搜索
        needs_search = self.should_search(question)
        
        if needs_search:
            search_query = self.generate_search_query(question)
            search_results = self.search_tool.search(search_query)
            search_context = self.search_tool.format_results(search_results)
            
            # 将搜索结果添加到上下文
            self.conversation_history.append({
                "role": "system",
                "content": f"搜索结果:\n{search_context}"
            })
        
        # 生成回答
        response = openai.ChatCompletion.create(
            model="gpt-4",
            messages=self.conversation_history,
            max_tokens=500,
            temperature=0.7
        )
        
        answer = response.choices[0].message.content.strip()
        
        # 添加AI回答到历史
        self.conversation_history.append({
            "role": "assistant",
            "content": answer
        })
        
        return answer

2. 智能结果过滤

def filter_relevant_results(self, question, search_results):
    """
    使用AI过滤最相关的搜索结果
    """
    results_text = "\n\n".join([
        f"{i+1}. {r['title']}\n{r['snippet']}"
        for i, r in enumerate(search_results)
    ])
    
    prompt = f"""从以下搜索结果中选择最相关的3条来回答问题。
只返回结果编号,用逗号分隔。

问题:{question}

搜索结果:
{results_text}

最相关的结果编号:"""
    
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=20,
        temperature=0
    )
    
    selected = response.choices[0].message.content.strip()
    indices = [int(i.strip())-1 for i in selected.split(',') if i.strip().isdigit()]
    
    return [search_results[i] for i in indices if i < len(search_results)]

3. 结合Reader APIAPI

对于需要深度信息的场景,可以结合Reader APIAPI

def extract_url_content(self, url):
    """
    提取URL的完整内容
    """
    extract_url = "https://searchcans.youxikuang.cn/api/extract"
    headers = {
        "Authorization": f"Bearer {self.api_key}",
        "Content-Type": "application/json"
    }
    
    payload = {"url": url}
    
    response = requests.post(extract_url, headers=headers, json=payload)
    
    if response.status_code == 200:
        return response.json().get('content', '')
    return ''

性能优化建议

1. 缓存搜索结果

import hashlib
from functools import lru_cache

class CachedSearchTool(SearchTool):
    def __init__(self, api_key, cache_ttl=3600):
        super().__init__(api_key)
        self.cache = {}
        self.cache_ttl = cache_ttl
    
    def search(self, query, num_results=5):
        # 生成缓存键
        cache_key = hashlib.md5(query.encode()).hexdigest()
        
        # 检查缓存
        if cache_key in self.cache:
            cached_data, timestamp = self.cache[cache_key]
            if time.time() - timestamp < self.cache_ttl:
                return cached_data
        
        # 执行搜索
        results = super().search(query, num_results)
        
        # 保存到缓存
        self.cache[cache_key] = (results, time.time())
        
        return results

2. 异步搜索

import asyncio
import aiohttp

async def async_search(self, query):
    """异步搜索实现"""
    async with aiohttp.ClientSession() as session:
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "s": query,
            "t": "bing",
            "p": 1
        }
        
        async with session.post(
            self.api_url,
            headers=headers,
            json=payload
        ) as response:
            if response.status == 200:
                data = await response.json()
                return data.get('organic', [])
            return []

3. 并行搜索多个查询

async def multi_search(self, queries):
    """并行搜索多个查询"""
    tasks = [self.async_search(q) for q in queries]
    results = await asyncio.gather(*tasks)
    return results

成本分析

使用SearchCans SERP API为AI Agent添加搜索能力的成本:

典型使用场景

假设一个AI聊天应用:

  • 日活用户:1000人
  • 每用户平均对话:10轮
  • 需要搜索的比例:30%
  • 每次搜索调用:1次

月度调用量:1000 × 10 × 0.3 × 30 = 90,000次
月度成本:90,000 ÷ 1,000 × ¥4.03 = ¥362.7

相比其他搜索API方案,SearchCans的定价极具竞争力,让中小开发者也能负担得起AI联网搜索功能。

实际应用案例

案例1:智能客服机器人

某电商平台的AI客服集成了SERP API:

  • 应用场景:回答产品相关问题、查询物流信息
  • 搜索频率:每天约5000次
  • 效果
    • 问题解决率提升40%
    • 客户满意度提升25%
    • 人工客服工作量减少60%

案例2:个人AI助手

某开发者构建的个人AI助手:

  • 功能:日程管理、信息查询、新闻摘要
  • 搜索频率:每天约100次
  • 月度成本:仅¥12
  • 价值:大幅提升个人效率

最佳实践

1. 优化搜索触发逻辑

不是所有问题都需要搜索,合理的触发逻辑可以:

  • 降低API调用成本
  • 提升响应速度
  • 改善用户体验

2. 提供信息来源

始终在答案中注明信息来源,增强可信度。

3. 处理搜索失败

当搜索失败时,应该优雅降级:

try:
    search_results = self.search_tool.search(query)
    if not search_results:
        return "抱歉,我暂时无法获取最新信息,但我可以基于已有知识回答..."
except Exception as e:
    return "搜索服务暂时不可用,让我基于已有知识回答..."

4. 监控和日志

记录搜索行为,用于优化和调试:

import logging

logging.info(f"Search triggered: {query}")
logging.info(f"Results count: {len(results)}")
logging.info(f"Response time: {response_time}ms")

开始构建你的AI Agent

为AI Agent添加联网搜索能力不再是难事。使用SearchCans的SERP API,你可以:

  1. 快速集成:几十行代码即可实现
  2. 成本可控:按需付费,低至¥4.03/千次
  3. 稳定可靠:99.65%可用率保障
  4. 灵活扩展:支持各种AI应用场景

立即开始:

  1. 注册SearchCans账户,免费获得100积分
  2. 查看API文档,了解接口详情
  3. API操作台测试搜索功能
  4. 使用本文代码快速构建你的AI Agent

让你的AI应用拥有实时信息获取能力,为用户提供更准确、更及时的服务。


SearchCans提供高性价比的必应搜索API和Reader API服务,专为AI Agent和智能应用打造。立即体验 →

标签:

SERP API AI Agent 联网搜索 AI开发

准备好用 SearchCans 构建你的 AI 应用了吗?

立即体验我们的 SERP API 和 Reader API。每千次调用仅需 ¥0.56 起,无需信用卡即可免费试用。