DeepResearch 22 分钟阅读

手把手教程:使用SearchCans API构建你的第一个DeepResearch Agent

从零开始,用Python和SearchCans的SERP与Reader API构建一个功能完整的Mini-DeepResearch Agent。包含完整代码、最佳实践和调试技巧,让你快速掌握AI研究助理的开发。

8,565 字

理论固然重要,但实践才能真正掌握技术。本教程将手把手带你构建一个Mini-DeepResearch Agent——它能接收研究任务,自主搜索互联网,深度阅读内容,最终生成结构化的研究报告。我们将使用Python、LangChain框架和SearchCans的SERP与Reader API。

项目目标

我们要构建的系统能够:

  1. 接收自然语言描述的研究任务
  2. 自动分解任务为子问题
  3. 生成多个搜索查询
  4. 调用SERP API发现信息源
  5. 调用Reader API提取内容
  6. 整合信息并生成报告
  7. 支持迭代式深入研究

环境准备

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研究助理的无限可能了!


相关资源

技术文档

DeepResearch系列

应用案例

SearchCans提供高性价比的Bing搜索API和Reader API服务,专为AI Agent和开发者打造。立即体验 →

标签:

DeepResearch 开发教程 Python AI Agent

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

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