上一篇 下一篇 分享链接 返回 返回顶部

从搜索到报告自动完成:手把手搭建你的 AI 调研工作流

发布人:慈云数据-客服中心 发布时间:9小时前 阅读量:4

AI搜索 工作流自动化教程|附完整命令

在信息爆炸的时代,传统搜索已经无法满足复杂业务场景的需求。我们不再只是想“搜到网页”,而是希望系统能够自动完成:理解问题 → 检索信息 → 筛选来源 → 总结答案 → 生成报告 → 自动归档或推送

这就是“AI搜索工作流自动化”的价值。

本文将从零开始,带你搭建一个可运行的 AI 搜索自动化工作流。它可以输入一个问题,自动调用搜索引擎获取资料,再通过大模型进行摘要、去重、结构化整理,最后输出一份 Markdown 报告。

文章包含完整命令、项目结构、代码示例和扩展思路,适合用于个人知识管理、市场调研、竞品分析、内容创作、学术资料整理等场景。


一、什么是 AI 搜索工作流自动化?

传统搜索流程通常是这样的:

  1. 打开搜索引擎;
  2. 输入关键词;
  3. 浏览多个网页;
  4. 手动复制有用内容;
  5. 判断可信度;
  6. 总结成文档;
  7. 保存或分享。

这个过程重复、耗时,而且结果容易遗漏。

AI 搜索工作流自动化的目标,是把这些步骤交给程序和 AI 来完成:

用户输入问题
    ↓
自动生成搜索关键词
    ↓
调用搜索 API 获取网页结果
    ↓
抓取网页正文内容
    ↓
清洗文本
    ↓
交给大模型总结
    ↓
生成结构化报告
    ↓
保存为 Markdown / HTML / PDF

最终,你只需要输入一句话,例如:

请调研 2025 年中国 AI 搜索产品的发展趋势

系统就可以自动生成一份调研报告。


二、适用场景

AI 搜索自动化并不是只能用于技术人员。它适用于很多实际业务场景。

1. 内容创作

自媒体、公众号、博客作者可以用它快速收集资料,形成文章初稿。

例如:

帮我搜索并整理最近半年 AI Agent 的技术趋势

2. 市场调研

企业可以使用它分析行业动态、竞品信息和投资趋势。

例如:

调研国内主流 AI 搜索产品,包括秘塔 AI、Kimi、Perplexity、百度 AI 搜索等

3. 学术资料整理

学生和研究人员可以用它快速收集论文、新闻和技术资料。

例如:

总结 RAG 技术在企业知识库中的应用案例

4. 销售与运营

销售团队可以用它调研客户公司、行业背景和竞品动态。

例如:

搜索某家公司近一年的融资、产品和新闻动态

三、整体技术方案

本文使用一个相对轻量的方案:

  • Python 作为主开发语言;
  • Tavily Search API 或 SerpAPI 作为搜索工具;
  • OpenAI API 或兼容 OpenAI 格式的大模型接口作为总结引擎;
  • BeautifulSoup 用于网页正文提取;
  • Markdown 用于报告输出。

整体架构如下:

┌──────────────┐
│ 用户输入问题 │
└──────┬───────┘
       ↓
┌──────────────┐
│ 生成搜索关键词 │
└──────┬───────┘
       ↓
┌──────────────┐
│ 调用搜索 API │
└──────┬───────┘
       ↓
┌──────────────┐
│ 抓取网页内容 │
└──────┬───────┘
       ↓
┌──────────────┐
│ AI 总结分析  │
└──────┬───────┘
       ↓
┌──────────────┐
│ 输出报告文件 │
└──────────────┘

四、环境准备

下面以 macOS / Linux 环境为例。如果你使用 Windows,建议使用 PowerShell 或 WSL。

1. 创建项目目录

mkdir ai-search-workflow
cd ai-search-workflow

2. 创建 Python 虚拟环境

python3 -m venv .venv

激活虚拟环境:

source .venv/bin/activate

如果你是 Windows 用户,可以执行:

.venv\Scripts\activate

3. 安装依赖

pip install requests beautifulsoup4 python-dotenv openai markdown html2text

如果你后面想把 Markdown 转成 PDF,也可以安装:

pip install markdown-pdf

五、准备 API Key

本文示例使用两类 API:

  1. 搜索 API:Tavily Search API;
  2. 大模型 API:OpenAI 或兼容 OpenAI 格式的服务。

你也可以替换为其他搜索服务,例如 SerpAPI、Bing Search API、Google Custom Search API。

1. 创建环境变量文件

在项目根目录新建 .env 文件:

touch .env

写入以下内容:

OPENAI_API_KEY=你的大模型API_KEY
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o-mini

TAVILY_API_KEY=你的Tavily_API_KEY

如果你使用的是兼容 OpenAI 接口的国产大模型,只需要修改:

OPENAI_BASE_URL=你的接口地址
OPENAI_MODEL=你的模型名称

例如:

OPENAI_BASE_URL=https://api.example.com/v1
OPENAI_MODEL=deepseek-chat

六、项目结构

创建如下目录结构:

mkdir app reports
touch app/config.py app/search.py app/crawler.py app/llm.py app/workflow.py main.py

最终项目结构如下:

ai-search-workflow/
├── .env
├── app/
│   ├── config.py
│   ├── search.py
│   ├── crawler.py
│   ├── llm.py
│   └── workflow.py
├── reports/
└── main.py

七、编写配置文件

编辑 app/config.py

import os
from dotenv import load_dotenv

load_dotenv()

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_BASE_URL = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-4o-mini")

TAVILY_API_KEY = os.getenv("TAVILY_API_KEY")

if not OPENAI_API_KEY:
    raise ValueError("请在 .env 中配置 OPENAI_API_KEY")

if not TAVILY_API_KEY:
    raise ValueError("请在 .env 中配置 TAVILY_API_KEY")

这个文件负责读取环境变量,避免把密钥直接写进代码。


八、实现搜索模块

编辑 app/search.py

import requests
from app.config import TAVILY_API_KEY

def tavily_search(query, max_results=5):
    """
    调用 Tavily Search API 进行搜索
    """
    url = "https://api.tavily.com/search"

    payload = {
        "api_key": TAVILY_API_KEY,
        "query": query,
        "search_depth": "advanced",
        "include_answer": False,
        "include_raw_content": False,
        "max_results": max_results
    }

    response = requests.post(url, json=payload, timeout=30)
    response.raise_for_status()

    data = response.json()
    results = data.get("results", [])

    cleaned_results = []

    for item in results:
        cleaned_results.append({
            "title": item.get("title"),
            "url": item.get("url"),
            "content": item.get("content")
        })

    return cleaned_results

这个模块的作用是根据关键词获取搜索结果,包括标题、链接和简短摘要。


九、实现网页正文抓取模块

编辑 app/crawler.py

import requests
from bs4 import BeautifulSoup

HEADERS = {
    "User-Agent": "Mozilla/5.0 AI Search Workflow Bot"
}

def fetch_page_text(url, max_chars=6000):
    """
    抓取网页正文内容,并限制最大字符数
    """
    try:
        response = requests.get(url, headers=HEADERS, timeout=20)
        response.raise_for_status()
    except Exception as e:
        return f"抓取失败:{e}"

    soup = BeautifulSoup(response.text, "html.parser")

    for tag in soup(["script", "style", "nav", "footer", "header", "aside"]):
        tag.decompose()

    text = soup.get_text(separator="\n")

    lines = []
    for line in text.splitlines():
        line = line.strip()
        if len(line) > 20:
            lines.append(line)

    clean_text = "\n".join(lines)

    return clean_text[:max_chars]

这里我们通过 BeautifulSoup 移除脚本、样式、导航栏等无关内容,只保留网页可读文本。


十、实现大模型调用模块

编辑 app/llm.py

from openai import OpenAI
from app.config import OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MODEL

client = OpenAI(
    api_key=OPENAI_API_KEY,
    base_url=OPENAI_BASE_URL
)

def call_llm(prompt, temperature=0.3):
    """
    调用大模型生成内容
    """
    response = client.chat.completions.create(
        model=OPENAI_MODEL,
        messages=[
            {
                "role": "system",
                "content": "你是一名专业的研究分析师,擅长搜索资料、总结信息、提炼观点,并输出结构清晰的中文报告。"
            },
            {
                "role": "user",
                "content": prompt
            }
        ],
        temperature=temperature
    )

    return response.choices[0].message.content

如果你的模型接口兼容 OpenAI 格式,这段代码通常可以直接使用。


十一、实现 AI 搜索工作流

编辑 app/workflow.py

import os
from datetime import datetime
from app.search import tavily_search
from app.crawler import fetch_page_text
from app.llm import call_llm

def generate_search_queries(topic):
    """
    根据用户主题生成多个搜索关键词
    """
    prompt = f"""
请根据下面的研究主题,生成 5 个适合搜索引擎检索的中文关键词或问题。

研究主题:
{topic}

要求:
1. 关键词要覆盖背景、趋势、案例、数据、观点;
2. 每行一个关键词;
3. 不要添加解释。
"""

    result = call_llm(prompt, temperature=0.2)

    queries = []
    for line in result.splitlines():
        line = line.strip()
        line = line.lstrip("-").lstrip("1.").lstrip("2.").lstrip("3.").strip()
        if line:
            queries.append(line)

    return queries[:5]

def collect_sources(queries, max_results_per_query=3):
    """
    根据多个关键词收集搜索结果,并去重
    """
    all_results = []
    seen_urls = set()

    for query in queries:
        print(f"正在搜索:{query}")
        results = tavily_search(query, max_results=max_results_per_query)

        for item in results:
            url = item.get("url")
            if url and url not in seen_urls:
                seen_urls.add(url)
                item["query"] = query
                all_results.append(item)

    return all_results

def enrich_sources_with_content(sources):
    """
    抓取每个搜索结果对应的网页正文
    """
    enriched = []

    for index, item in enumerate(sources, start=1):
        print(f"正在抓取第 {index} 个网页:{item.get('url')}")
        page_text = fetch_page_text(item.get("url"))

        enriched.append({
            "title": item.get("title"),
            "url": item.get("url"),
            "query": item.get("query"),
            "snippet": item.get("content"),
            "page_text": page_text
        })

    return enriched

def build_report_prompt(topic, sources):
    """
    构造报告生成提示词
    """
    source_text = ""

    for i, item in enumerate(sources, start=1):
        source_text += f"""
资料 {i}
标题:{item.get("title")}
链接:{item.get("url")}
搜索词:{item.get("query")}
摘要:{item.get("snippet")}
正文摘录:
{item.get("page_text")[:3000]}
"""

    prompt = f"""
你是一名资深行业研究员。请根据以下搜索资料,围绕用户主题生成一份中文研究报告。

用户主题:
{topic}

资料内容:
{source_text}

请按照以下 Markdown 结构输出:

# {topic}

## 一、结论摘要
用 5 条以内要点总结核心结论。

## 二、背景介绍
解释该主题为什么重要,目前处于什么发展阶段。

## 三、关键信息整理
按主题归纳资料中的重要事实、数据、观点和案例。

## 四、趋势分析
分析未来可能的发展方向、机会和风险。

## 五、可执行建议
给出适合个人、团队或企业执行的建议。

## 六、参考来源
列出引用过的网页标题和 URL。

要求:
1. 必须使用中文;
2. 不要编造资料中没有的信息;
3. 如果资料不足,请明确说明;
4. 结构清晰,观点具体;
5. 尽量保留来源链接。
"""

    return prompt

def save_report(topic, content):
    """
    保存 Markdown 报告
    """
    os.makedirs("reports", exist_ok=True)

    safe_title = "".join(c for c in topic if c.isalnum() or c in "-_ ")
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = f"reports/{timestamp}_{safe_title[:40]}.md"

    with open(filename, "w", encoding="utf-8") as f:
        f.write(content)

    return filename

def run_workflow(topic):
    """
    执行完整 AI 搜索工作流
    """
    print("第一步:生成搜索关键词")
    queries = generate_search_queries(topic)

    print("生成的搜索关键词:")
    for q in queries:
        print("-", q)

    print("\n第二步:搜索资料")
    sources = collect_sources(queries)

    print(f"\n共收集到 {len(sources)} 条资料")

    print("\n第三步:抓取网页正文")
    enriched_sources = enrich_sources_with_content(sources)

    print("\n第四步:生成研究报告")
    report_prompt = build_report_prompt(topic, enriched_sources)
    report = call_llm(report_prompt, temperature=0.4)

    print("\n第五步:保存报告")
    filepath = save_report(topic, report)

    print(f"\n报告已保存:{filepath}")

    return filepath

十二、编写入口文件

编辑 main.py

import argparse
from app.workflow import run_workflow

def main():
    parser = argparse.ArgumentParser(description="AI 搜索工作流自动化工具")
    parser.add_argument("topic", type=str, help="请输入你要调研的主题")

    args = parser.parse_args()

    run_workflow(args.topic)

if __name__ == "__main__":
    main()

这个入口文件允许我们通过命令行传入研究主题。


十三、运行完整工作流

确保你已经激活虚拟环境:

source .venv/bin/activate

然后执行:

python main.py "2025年中国AI搜索产品发展趋势"

也可以换成其他主题:

python main.py "AI Agent在企业办公自动化中的应用"

或者:

python main.py "RAG知识库系统的技术架构和落地案例"

程序运行后,会依次显示:

第一步:生成搜索关键词
第二步:搜索资料
第三步:抓取网页正文
第四步:生成研究报告
第五步:保存报告

最后,你可以在 reports/ 目录下看到生成的 Markdown 报告。

查看报告文件:

ls reports

打开最新报告:

cat reports/你的报告文件名.md

十四、可选:将 Markdown 转为 HTML

如果你希望把报告转成网页格式,可以创建一个脚本。

新建文件:

touch md_to_html.py

写入:

import sys
import markdown

if len(sys.argv) < 2:
    print("用法:python md_to_html.py reports/xxx.md")
    sys.exit(1)

input_file = sys.argv[1]
output_file = input_file.replace(".md", ".html")

with open(input_file, "r", encoding="utf-8") as f:
    md_content = f.read()

html_content = markdown.markdown(
    md_content,
    extensions=["extra", "toc", "tables"]
)

html_page = f"""




AI 搜索报告



{html_content}


"""

with open(output_file, "w", encoding="utf-8") as f:
    f.write(html_page)

print(f"已生成:{output_file}")

运行:

python md_to_html.py reports/你的报告文件名.md

十五、可选:定时自动运行

如果你希望每天自动生成一份行业报告,可以使用 cron

查看 Python 路径:

which python

查看项目路径:

pwd

编辑定时任务:

crontab -e

添加一行,例如每天早上 8 点运行:

0 8 * * * cd /你的项目路径/ai-search-workflow && /你的项目路径/ai-search-workflow/.venv/bin/python main.py "AI搜索行业最新动态" >> cron.log 2>&1

保存后,系统会每天自动执行。

查看定时任务:

crontab -l

查看日志:

tail -f cron.log

十六、可选:推送到企业微信或飞书

如果你的团队需要每天收到自动报告,可以将生成结果推送到企业微信、飞书或钉钉。

以企业微信机器人为例,安装依赖:

pip install requests

新建 send_wecom.py

touch send_wecom.py

写入:

import sys
import requests

WEBHOOK_URL = "你的企业微信机器人Webhook地址"

def send_markdown(content):
    payload = {
        "msgtype": "markdown",
        "markdown": {
            "content": content[:4000]
        }
    }

    response = requests.post(WEBHOOK_URL, json=payload, timeout=10)
    response.raise_for_status()

    print("推送成功")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("用法:python send_wecom.py reports/xxx.md")
        sys.exit(1)

    file_path = sys.argv[1]

    with open(file_path, "r", encoding="utf-8") as f:
        content = f.read()

    send_markdown(content)

运行:

python send_wecom.py reports/你的报告文件名.md

如果报告过长,可以只推送摘要部分,完整报告保存在服务器或文档系统中。


十七、优化方向

上面的工作流已经可以完成基础自动化,但如果要用于生产环境,还可以继续优化。

1. 增加来源可信度评分

不同来源的可信度不同。你可以根据域名、发布时间、作者、内容长度等因素打分。

例如:

政府网站、上市公司公告、权威媒体、学术论文:高可信
营销软文、论坛帖子、匿名博客:低可信

2. 增加网页去噪能力

很多网页正文包含广告、推荐阅读和无关内容。可以使用更专业的正文提取库,例如:

pip install trafilatura

使用方式:

import trafilatura

downloaded = trafilatura.fetch_url(url)
text = trafilatura.extract(downloaded)

3. 增加多轮检索

第一次搜索后,可以让 AI 判断资料是否充分。如果不充分,再自动生成新的搜索词继续搜索。

流程如下:

初次搜索
    ↓
AI 判断缺失信息
    ↓
生成补充关键词
    ↓
二次搜索
    ↓
合并资料
    ↓
生成最终报告

4. 增加引用标注

为了让报告更可信,可以要求大模型在每个关键结论后面加上来源编号,例如:

AI 搜索产品正在从单纯问答向任务执行型 Agent 演进。[来源 3][来源 7]

5. 接入向量数据库

如果你需要长期积累资料,可以把抓取到的网页内容写入向量数据库,例如 Chroma、Qdrant、Milvus。

安装 Chroma:

pip install chromadb

这样系统就可以从“临时搜索”升级为“长期知识库”。


十八、常见问题

1. 为什么有些网页抓取失败?

原因可能包括:

  • 网站开启了反爬;
  • 页面需要 JavaScript 渲染;
  • 网站访问速度慢;
  • 服务器拒绝非浏览器请求;
  • 内容需要登录。

解决办法:

  • 更换数据源;
  • 使用 Tavily 返回的摘要;
  • 使用 Playwright 抓取动态页面;
  • 使用 RSS、官方 API 或网站地图。

安装 Playwright:

pip install playwright
playwright install

2. 为什么 AI 总结会出现不准确?

常见原因包括:

  • 搜索资料本身不准确;
  • 网页正文提取噪声太多;
  • 提示词约束不够;
  • 模型能力不足;
  • 输入资料超出上下文长度。

改进方法:

  • 增加“不要编造”的系统提示;
  • 要求模型列出依据;
  • 对来源进行筛选;
  • 分段总结后再汇总;
  • 使用上下文更长的模型。

3. 如何降低成本?

可以从以下几个方面优化:

  • 减少每个关键词搜索数量;
  • 限制网页正文最大字符数;
  • 先让小模型筛选资料,再用强模型写报告;
  • 缓存搜索结果和网页内容;
  • 对重复主题复用已有资料。

十九、完整命令汇总

下面把本文所有关键命令整理到一起,方便直接复制执行。

mkdir ai-search-workflow
cd ai-search-workflow

python3 -m venv .venv
source .venv/bin/activate

pip install requests beautifulsoup4 python-dotenv openai markdown html2text

mkdir app reports
touch app/config.py app/search.py app/crawler.py app/llm.py app/workflow.py main.py
touch .env

运行工作流:

python main.py "2025年中国AI搜索产品发展趋势"

查看报告:

ls reports
cat reports/你的报告文件名.md

转换 HTML:

touch md_to_html.py
python md_to_html.py reports/你的报告文件名.md

设置定时任务:

crontab -e
crontab -l
tail -f cron.log

安装动态页面抓取工具:

pip install playwright
playwright install

安装更强正文提取工具:

pip install trafilatura

安装向量数据库:

pip install chromadb

二十、总结

AI 搜索工作流自动化的核心,不只是“调用搜索 API”或“让大模型写一段总结”,而是把搜索、阅读、筛选、分析和输出串成一个稳定流程。

一个完整的 AI 搜索自动化系统,至少应包含以下能力:

  1. 能够根据主题自动生成搜索关键词;
  2. 能够调用搜索引擎获取多来源资料;
  3. 能够抓取网页正文并清洗文本;
  4. 能够利用大模型进行归纳分析;
  5. 能够输出结构化报告;
  6. 能够定时运行或推送给团队;
  7. 能够通过可信度评分、引用标注和知识库存储不断增强。

本文提供的是一个轻量但完整的起点。你可以先用它搭建个人版 AI 搜索助手,再逐步扩展成企业级情报系统、自动化内容生产系统或知识研究平台。

当搜索不再只是“找链接”,而是自动完成“理解、检索、判断、总结和交付”,AI 搜索才真正进入工作流时代。

目录结构
全文