理论固然重要,但实践才能真正掌握技术。本教程将手把手带你构建一个Mini-DeepResearch Agent——它能接收研究任务,自主搜索互联网,深度阅读内容,最终生成结构化的研究报告。我们将使用Python、LangChain框架和SearchCans的SERP与Reader API。
项目目标
我们要构建的系统能够:
- 接收自然语言描述的研究任务
- 自动分解任务为子问题
- 生成多个搜索查询
- 调用SERP API发现信息源
- 调用Reader API提取内容
- 整合信息并生成报告
- 支持迭代式深入研究
环境准备
1. 安装依赖
pip install langchain langchain-openai openai requests python-dotenv
2. 获取API密钥
你需要三个API密钥:
OpenAI API:用于LLM(GPT-4)
SearchCans SERP API:用于搜索(注册获取)
SearchCans Reader API:用于内容提取(注册获取)
3. 配置环境变量
创建.env文件:
OPENAI_API_KEY=your_openai_key
SEARCHCANS_SERP_KEY=your_serp_key
SEARCHCANS_READER_KEY=your_reader_key
核心组件实现
步骤1:封装API工具
首先,我们将SERP API和Reader API封装为LangChain工具。
import os
import requests
from dotenv import load_dotenv
from langchain.tools import Tool
from langchain.agents import AgentExecutor, create_openai_functions_agent
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
load_dotenv()
# SearchCans API配置
SERP_API_URL = "https://searchcans.youxikuang.cn/api/search"
READER_API_URL = "https://searchcans.youxikuang.cn/api/url"
SERP_API_KEY = os.getenv("SEARCHCANS_SERP_KEY")
READER_API_KEY = os.getenv("SEARCHCANS_READER_KEY")
def search_web(query: str, num_results: int = 10) -> str:
"""
调用SERP API搜索互联网
Args:
query: 搜索查询词
num_results: 返回结果数量
Returns:
格式化的搜索结果字符串
"""
headers = {"Authorization": f"Bearer {SERP_API_KEY}"}
params = {
"q": query,
"num": num_results,
"engine": "bing" # 使用Bing搜索引擎
}
try:
response = requests.get(SERP_API_URL, headers=headers, params=params)
response.raise_for_status()
data = response.json()
# 格式化结果
results = []
for i, item in enumerate(data.get("organic_results", []), 1):
results.append(
f"{i}. {item['title']}\n"
f" URL: {item['link']}\n"
f" 摘要: {item['snippet']}\n"
)
return "\n".join(results) if results else "未找到相关结果"
except Exception as e:
return f"搜索出错: {str(e)}"
def read_webpage(url: str) -> str:
"""
调用Reader API提取网页内容
Args:
url: 目标网页URL
Returns:
提取的Markdown格式内容
"""
headers = {"Authorization": f"Bearer {READER_API_KEY}"}
params = {"url": url}
try:
response = requests.get(READER_API_URL, headers=headers, params=params)
response.raise_for_status()
data = response.json()
content = data.get("content", "")
title = data.get("title", "")
# 限制内容长度,避免超过LLM的token限制
max_length = 8000
if len(content) > max_length:
content = content[:max_length] + "\n\n[内容已截断...]"
return f"# {title}\n\n{content}"
except Exception as e:
return f"内容提取出错: {str(e)}"
步骤2:创建Agent工具
将上述函数转换为LangChain工具:
tools = [
Tool(
name="WebSearch",
func=search_web,
description=(
"搜索互联网获取相关信息。"
"输入应该是一个搜索查询字符串。"
"返回搜索结果列表,包含标题、URL和摘要。"
"当你需要查找关于某个主题的信息时使用此工具。"
)
),
Tool(
name="ReadWebpage",
func=read_webpage,
description=(
"深度阅读网页内容。"
"输入应该是一个完整的URL。"
"返回网页的Markdown格式文本内容。"
"当你从搜索结果中找到相关网页,需要详细了解其内容时使用此工具。"
)
)
]
步骤3:设计Agent的Prompt
Prompt设计是Agent行为的核心:
system_prompt = """你是一个专业的AI研究助理,擅长进行深度调研。
你的任务是:
1. 理解用户的研究需求
2. 将复杂任务分解为多个子问题
3. 使用WebSearch工具搜索相关信息
4. 使用ReadWebpage工具深度阅读重要网页
5. 整合信息,生成结构化的研究报告
研究策略:
- 从宏观到微观:先搜索了解主题概览,再深入具体细节
- 多角度验证:对关键信息,从多个来源验证
- 关注权威来源:优先阅读官方网站、学术论文、权威媒体的内容
- 迭代深入:如果初步信息不足,进行额外的搜索
报告要求:
- 结构清晰,包含引言、主体、结论
- 每个论点都有具体的事实和数据支持
- 标注信息来源(URL)
- 突出关键洞察和建议
开始工作吧!"""
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
步骤4:创建Agent
# 初始化LLM
llm = ChatOpenAI(
model="gpt-4",
temperature=0, # 降低随机性,保持研究的一致性
api_key=os.getenv("OPENAI_API_KEY")
)
# 创建Agent
agent = create_openai_functions_agent(llm, tools, prompt)
# 创建Agent执行器
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 打印执行过程
max_iterations=15, # 限制最大迭代次数
handle_parsing_errors=True
)
步骤5:执行研究任务
def conduct_research(task: str) -> str:
"""
执行研究任务
Args:
task: 研究任务描述
Returns:
研究报告
"""
print(f"\n开始研究: {task}\n")
print("=" * 60)
result = agent_executor.invoke({"input": task})
print("\n" + "=" * 60)
print("研究完成!\n")
return result["output"]
# 示例:运行研究任务
if __name__ == "__main__":
task = """
研究AI在电子商务中的应用:
1. 主要应用场景有哪些?
2. 有哪些成功案例?
3. 技术实现的关键要素是什么?
4. 未来发展趋势如何?
请生成一份详细的研究报告。
"""
report = conduct_research(task)
# 保存报告
with open("research_report.md", "w", encoding="utf-8") as f:
f.write(report)
print("报告已保存到 research_report.md")
运行效果
执行上述代码后,你会看到Agent的思考和执行过程:
开始研究: 研究AI在电子商务中的应用...
============================================================
> 进入新的AgentExecutor链...
思考: 我需要先搜索AI在电子商务中的应用场景
行动: WebSearch
行动输入: "AI人工智能电子商务应用场景"
观察:
1. AI驱动的个性化推荐系统...
URL: https://example.com/ai-ecommerce
摘要: 介绍了AI在电商推荐系统中的应用...
[Agent继续搜索和阅读...]
思考: 我现在有足够的信息来生成报告了
最终答案:
# AI在电子商务中的应用研究报告
## 引言
人工智能正在深刻改变电子商务行业...
[完整报告内容]
优化与扩展
1. 添加缓存机制
避免重复的API调用:
from functools import lru_cache
@lru_cache(maxsize=100)
def search_web_cached(query: str, num_results: int = 10) -> str:
return search_web(query, num_results)
@lru_cache(maxsize=50)
def read_webpage_cached(url: str) -> str:
return read_webpage(url)
2. 并行处理
同时读取多个网页:
from concurrent.futures import ThreadPoolExecutor
def read_multiple_urls(urls: list) -> dict:
"""并行读取多个URL"""
with ThreadPoolExecutor(max_workers=5) as executor:
results = executor.map(read_webpage, urls)
return dict(zip(urls, results))
3. 结果验证
添加信息来源验证:
def verify_information(claim: str, sources: list) -> bool:
"""
验证信息是否得到多个来源支持
"""
# 实现逻辑:检查claim是否在多个sources中出现
pass
4. 成本控制
追踪API使用量:
class APIUsageTracker:
def __init__(self):
self.serp_calls = 0
self.reader_calls = 0
def track_serp(self):
self.serp_calls += 1
def track_reader(self):
self.reader_calls += 1
def report(self):
print(f"SERP API调用: {self.serp_calls}")
print(f"Reader API调用: {self.reader_calls}")
print(f"预估成本: ${self.calculate_cost()}")
实战案例
让我们用这个Agent完成一个真实的研究任务:
task = """
我正在考虑投资AI芯片领域的创业公司。请研究:
1. 当前AI芯片市场的主要玩家和格局
2. 技术趋势(如NPU、边缘AI芯片)
3. 投资机会和风险
4. 未来3-5年的市场预测
生成一份投资决策参考报告。
"""
report = conduct_research(task)
Agent会自动:
- 搜索AI芯片市场报告
- 阅读主要公司(NVIDIA、AMD、Intel等)的资料
- 查找投资分析和行业预测
- 整合信息,生成20-30页的详细报告
常见问题与调试
Q1: Agent陷入循环怎么办?
设置max_iterations限制,并优化Prompt引导Agent及时生成结论。
Q2: 内容提取失败
某些网站有反爬虫机制。Reader API通常能处理,但如果仍失败,可以跳过该URL。
Q3: Token超限
限制每次读取的内容长度,或使用更大context window的模型(如GPT-4-32k)。
Q4: 成本过高
- 优化搜索查询,减少不必要的搜索
- 使用缓存避免重复调用
- 先用SERP的snippet判断相关性,再决定是否深度阅读
下一步
这个Mini-DeepResearch只是起点。你可以继续扩展:
- 添加更多工具:如数据库查询、API调用、计算工具
- 多Agent协作:不同Agent负责不同任务
- 人机协作:在关键决策点请求人工确认
- 持续监控:定期运行研究任务,追踪主题变化
- 可视化界面:开发Web界面,方便非技术用户使用
更多高级技巧,请参考AI Agent集成完整指南。
总结
通过本教程,你已经掌握了:
- DeepResearch的基本架构
- 如何集成SERP API和Reader API
- 使用LangChain构建Agent
- 优化和扩展的最佳实践
现在,是时候构建你自己的DeepResearch Agent,探索AI研究助理的无限可能了!
相关资源
技术文档:
- SERP API文档 – API参考
- Reader API文档 – API参考
- AI Agent集成指南 – 高级技巧
DeepResearch系列:
- 什么是DeepResearch – 基础概念
- DeepResearch架构 – 技术架构
- 超越RAG – 技术对比
应用案例:
SearchCans提供高性价比的Bing搜索API和Reader API服务,专为AI Agent和开发者打造。立即体验 →