在AI应用快速发展的今天,实时信息获取已成为AI Agent的核心能力之一。无论是ChatGPT、Claude还是自研的AI助手,都需要能够访问最新的互联网信息来回答用户问题。SERP API正是实现这一能力的关键技术。
为什么AI Agent需要联网搜索?
AI的知识截止日期问题
大语言模型(LLM)都有一个固有的限制:知识截止日期。例如:
- GPT-4的训练数据截止到2023年4月
- Claude的知识截止到2024年初
- 其他模型也都有类似限制
这意味着AI无法回答关于最新事件、实时数据或最近发布信息的问题。
联网搜索的价值
通过集成SERP API,AI Agent可以:
- 获取最新信息:实时新闻、股票价格、天气等
- 事实核查:验证AI生成内容的准确性
- 补充知识:获取训练数据中不存在的信息
- 提供来源:为答案提供可验证的信息来源
AI Agent联网搜索架构
基本架构
用户提问 → AI判断是否需要搜索 → SERP API搜索 → 提取相关信息 → AI整合答案 → 返回用户
核心组件
- 意图识别:判断问题是否需要联网搜索
- 查询生成:将用户问题转换为搜索关键词
- 搜索执行:调用SERP API获取结果
- 内容提取:从搜索结果中提取相关信息
- 答案生成: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,你可以:
- 快速集成:几十行代码即可实现
- 成本可控:按需付费,低至¥4.03/千次
- 稳定可靠:99.65%可用率保障
- 灵活扩展:支持各种AI应用场景
立即开始:
- 注册SearchCans账户,免费获得100积分
- 查看API文档,了解接口详情
- 在API操作台测试搜索功能
- 使用本文代码快速构建你的AI Agent
让你的AI应用拥有实时信息获取能力,为用户提供更准确、更及时的服务。
SearchCans提供高性价比的必应搜索API和Reader API服务,专为AI Agent和智能应用打造。立即体验 →