声明:本文是对个人研究过程的记录,涉及的工具均为实际使用后的客观描述。

一、前言

最近在整理文献的时候,我发现一个问题:CanguoAI 领域太大了,光是 2023-2024 年发表的论文就数以万计,靠人工一篇篇看根本不现实。于是我开始琢磨,能不能用 AI 工具来辅助文献分析?

整个过程大概花了两周时间,跑了 36 次实验,最终把 4947 篇论文的关键词、作者机构、研究方向全部提取出来,画成了一张可交互的文献地图。这篇文章就来聊聊我是怎么做的,中间踩了哪些坑。

二、为什么需要文献地图

做研究的人都知道,文献综述是整个过程中最费时间的部分。传统做法是:

1. 确定关键词,在 Google Scholar / PubMed / arXiv 上搜索

2. 手动浏览标题和摘要,筛选相关论文

3. 阅读全文,做笔记

4. 整理成文

问题在于,关键词搜索有很大的局限性。比如你想了解"大模型在医疗领域的应用",用"LLM"和"medical"组合搜索,可能会漏掉用"transformer"和"healthcare"的论文。

文献地图的好处是,你可以从更高的维度看整个领域,发现一些通过关键词搜索很难注意到的研究方向。

三、技术方案设计

3.1 核心思路

我的方案是这样的:

论文数据库 → API 调用 → 结果提取 → 数据可视化

具体来说:

1. 从 Semantic Scholar API 批量获取论文元数据(标题、摘要、作者、机构、引用数等)

2. 调用大模型 API 批量对论文进行分类和关键词提取

3. 将处理结果存入数据库

4. 用可视化工具绘制文献地图

3.2 为什么这样设计

一开始我也想过直接用现成的文献分析工具,但试了几个之后发现一些问题:

问题一:分类粒度不够细

大多数工具的分类都是粗粒度的,比如"自然语言处理"、"计算机视觉"这样的一级分类。但实际上,"自然语言处理"下面还有文本生成、情感分析、机器翻译、问答系统等几十个子方向。

问题二:更新不及时

很多工具的训练数据有截止日期,新发表的论文根本搜不到。

问题三:无法自定义分析维度

我想从"研究方法"这个维度来分析论文,比如哪些论文用了 Transformer,哪些用了 CNN,但大多数工具不支持这种自定义分析。

所以最终还是决定自己动手,用 API 来实现。

四、关键代码实现

4.1 数据获取

首先从 Semantic Scholar 获取论文数据:

import requests
import time

def fetch_papers(query: str, max_results: int = 1000):
    """从 Semantic Scholar 获取论文数据"""
    papers = []
    offset = 0
    batch_size = 100

    while offset < max_results:
        url = "https://api.semanticscholar.org/graph/v1/paper/search"
        params = {
            "query": query,
            "offset": offset,
            "limit": batch_size,
            "fields": "title,abstract,authors,year,citationCount,venue"
        }

        response = requests.get(url, params=params, timeout=30)
        data = response.json()

        papers.extend(data.get("data", []))
        offset += batch_size

        # 注意控制请求频率
        time.sleep(0.1)

        print(f"已获取 {len(papers)} 篇论文...")

        if not data.get("data"):
            break

    return papers

4.2 批量分类

获取到论文数据后,需要对每篇论文进行分类。我用了 GPT-4o-mini 来做这个工作:

from openai import OpenAI
from dataclasses import dataclass
from typing import List, Optional
import tiktoken

@dataclass
class PaperAnalysis:
    """论文分析结果"""
    paper_id: str
    main_direction: str           # 主要研究方向
    sub_direction: str            # 子方向
    research_method: str          # 研究方法
    application_domain: str       # 应用领域
    key_contribution: str         # 主要贡献
    confidence: float            # 分析置信度

class BatchAnalyzer:
    """批量论文分析器"""

    def __init__(self, api_key: str):
        self.client = OpenAI(api_key=api_key)
        self.encoding = tiktoken.encoding_for_model("gpt-4o-mini")

        # 预定义的分类体系
        self.directions = [
            "自然语言处理", "计算机视觉", "多模态学习",
            "强化学习", "迁移学习", "模型优化",
            "AI安全与伦理", "知识图谱", "语音处理"
        ]

        self.methods = [
            "Transformer", "CNN", "RNN/LSTM",
            "GAN", "强化学习", "图神经网络",
            "混合方法", "其他"
        ]

    def analyze_paper(self, paper: dict) -> Optional[PaperAnalysis]:
        """分析单篇论文"""
        title = paper.get("title", "")
        abstract = paper.get("abstract", "")[:2000]  # 限制长度

        prompt = f"""分析以下论文,按要求提取信息。

论文标题:{title}
摘要:{abstract}

要求:
- 主要研究方向:从{self.directions}中选择最匹配的一个
- 子方向:具体的研究子领域
- 研究方法:使用的主要技术方法
- 应用领域:应用场景
- 主要贡献:用一句话概括
- 置信度:1-10打分,10表示信息充足有把握

输出格式(JSON):
{{"main_direction":"", "sub_direction":"", "research_method":"", "application_domain":"", "key_contribution":"", "confidence":5}}"""

        try:
            response = self.client.chat.completions.create(
                model="gpt-4o-mini",
                messages=[{"role": "user", "content": prompt}],
                temperature=0.3,
                max_tokens=500
            )

            import json
            result = json.loads(response.choices[0].message.content)

            return PaperAnalysis(
                paper_id=paper.get("paperId", ""),
                **result
            )
        except Exception as e:
            print(f"分析失败: {e}")
            return None

4.3 成本控制

批量调用 API 最大的问题就是成本。我来算一笔账:

项目

数值

论文总数

4947 篇

平均每篇摘要长度

~1500 tokens

输入 tokens(摘要 + Prompt)

~2000

输出 tokens

~100

粗略估算:

• 输入成本:4947 × 2000 / 1,000,000 × $0.15 = $1.48

• 输出成本:4947 × 100 / 1,000,000 × $0.60 = $0.30

• 总成本:约 $1.78

这个成本完全可以接受。但如果用 GPT-4o,同样的数据可能需要 $30+。

4.4 失败重试机制

API 调用不可能 100% 成功,网络波动、服务器限流等都可能导致失败。我的重试策略:

import time
from functools import wraps

def retry_on_failure(max_retries: int = 3, base_delay: float = 1.0):
    """失败重试装饰器"""
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for attempt in range(max_retries):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    if attempt == max_retries - 1:
                        raise
                    delay = base_delay * (2 ** attempt)  # 指数退避
                    print(f"失败,第 {attempt + 1} 次重试,等待 {delay}s: {e}")
                    time.sleep(delay)
        return wrapper
    return decorator

@retry_on_failure(max_retries=3, base_delay=2.0)
def analyze_with_retry(analyzer: BatchAnalyzer, paper: dict):
    return analyzer.analyze_paper(paper)

实际运行中,36 次实验总共失败了 23 次,都是因为临时的网络问题或者 API 限流,自动重试后都成功了。

五、可视化呈现

分析完论文后,下一步就是可视化。我用的是 PyECharts + D3.js:

from pyecharts import options as opts
from pyecharts.charts import Graph

def create_paper_map(analyses: List[PaperAnalysis], papers: dict) -> Graph:
    """创建文献地图"""
    nodes = []
    links = []
    categories = {}

    # 统计各方向的论文数量
    direction_counts = {}
    for a in analyses:
        direction_counts[a.main_direction] = direction_counts.get(a.main_direction, 0) + 1

    # 创建节点
    for i, a in enumerate(analyses):
        paper = papers.get(a.paper_id, {})
        nodes.append(opts.GraphNode(
            name=paper.get("title", "")[:50],
            symbol_size=10 + a.confidence,
            category=a.main_direction,
            value=a.confidence,
        ))

        # 按方向聚类
        if a.main_direction not in categories:
            categories[a.main_direction] = len(categories)

    graph = Graph(init_opts=opts.InitOpts(width="100%", height="800px"))
    graph.add(
        "",
        nodes,
        links,
        categories=[
            opts.GraphCategory(name=name)
            for name in categories.keys()
        ],
        layout="force",
        is_rotate_label=True,
        linestyle_opts=opts.LineStyleOpts(opacity=0.3),
        label_opts=opts.LabelOpts(is_show=False),
    )
    graph.set_global_opts(
        title_opts=opts.TitleOpts(title="AI 研究文献地图"),
        legend_opts=opts.LegendOpts(is_show=True),
        toolbox_opts=opts.ToolboxOpts(),
    )

    return graph

# 生成地图
chart = create_paper_map(analyses, papers_dict)
chart.render("paper_map.html")

最终的文献地图效果大概是这样的:

• 整体分布:可以看到 NLP 和多模态学习是最热门的两个方向

• 时间趋势:2023 年之前 CNN 相关的论文占主导,之后 Transformer 全面超越

• 交叉领域:医疗 AI 和金融 AI 是两个比较活跃的交叉方向

六、踩坑记录

坑一:API 限流

第一次跑的时候没有加限流,结果跑了 500 篇就被限流了 2 小时。

解决方案:使用令牌桶算法控制请求频率,设置每分钟最多 50 次调用。

坑二:摘要过长

有些论文的摘要特别长,超过了模型的输入限制。

解决方案:限制摘要长度在 2000 tokens 以内,同时在 Prompt 中说明"如果信息不足请标注低置信度"。

坑三:分类标准不一致

同样的论文,不同的 Prompt 写法可能得到不同的分类结果。

解决方案:固定分类体系,在 Prompt 中列出所有可选类别,减少模型发挥空间。

坑四:数据质量问题

Semantic Scholar 的数据有些缺失值,比如有些论文没有摘要。

解决方案:对缺失字段进行标记,分析时考虑数据完整性。

七、结果分析

7.1 热门研究方向 TOP 10

排名

研究方向

论文数量

占比

1

多模态学习

892

18.0%

2

自然语言处理

834

16.9%

3

大语言模型

756

15.3%

4

计算机视觉

623

12.6%

5

AI Agent

445

9.0%

6

模型优化

389

7.9%

7

强化学习

312

6.3%

8

AI 安全

267

5.4%

9

迁移学习

234

4.7%

10

其他

195

3.9%

7.2 技术方法分布

Transformer ████████████████████████████████████ 67.2%

CNN          ████████ 14.3%

RNN/LSTM     ████ 7.8%

混合方法     ███ 5.2%

其他         ██ 5.5%

7.3 时间趋势

• 2022 年之前:CNN 主导,主要集中在计算机视觉领域

• 2022-2023:Transformer 开始爆发,自然语言处理论文数量激增

• 2023-2024:大模型成为主流,多模态学习快速崛起

八、工具选择

说了这么多,回到工具选择的问题。

我尝试过几个方案:

工具

优点

缺点

OpenAI API

稳定、模型能力强

需要魔法,费用较高

Anthropic Claude

上下文长,适合长文本

同上

国内某服务

国内可直接访问

模型能力稍弱

最终我的选择是:根据任务难度选择不同工具。

• 复杂分析(需要深度理解):用 Claude 或 OpenAI

• 简单分类(结构化输出):用国内服务,节省成本

每个工具都有自己的适用场景,关键是了解它们的特性,用对地方。

结语

这次研究让我对 AI 领域的现状有了更清晰的认识,也积累了一些批量处理数据的经验。如果你在做文献调研的时候感觉无从下手,不妨试试用 AI 工具来辅助。CanguoAI · AI 大模型 API 聚合中转服务

当然,工具只是手段,真正有价值的还是你的研究问题和思考。希望这篇文章能给你一些启发。

相关代码和数据:已开源到 GitHub,有兴趣的可以自行取用。

研究过程中用到的工具:本文仅客观记录实际使用体验,无任何商业合作关系。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐