Skip to content

Repository files navigation

LLM-SearchEval

面向大语言模型联网搜索能力的实验、评估与可观测分析框架

Python LangGraph Provider Observability

从实验设计、参数扫描到质量评估和可视化,系统化分析 LLM 的联网搜索行为。

为什么需要 LLM-SearchEval?

LLM 能够调用搜索工具,并不意味着它一定会在正确的时机搜索、引用可靠的信息,或在质量、时效与成本之间取得合理平衡。LLM-SearchEval 提供一套可复现的实验流水线,用于回答这些问题:

  • 模型是否在需要联网时正确触发搜索?
  • 搜索结果是否真正转化为可追溯的引用?
  • 对时效性问题,回答是否使用了最新信息?
  • 不同 Web Search 参数会如何影响延迟、Token 和搜索次数?
  • 规则指标与 LLM-as-a-Judge 的质量判断是否一致?

项目当前接入火山方舟 Doubao Responses API,并通过 LangGraph 编排完整研究流程。

核心能力

  • 可复现实验:支持 JSONL 数据集、样本区间、样本上限和参数变体扫描。
  • 联网行为追踪:记录搜索触发、查询词、引用、工具调用、延迟和 Token 消耗。
  • 多维规则评估:统计触发准确率、引用覆盖率、时效引用率和 P50/P95 延迟。
  • 质量与成本权衡:计算综合得分并识别 Pareto 前沿方案。
  • 双评委质量校准:使用两次不同温度的 LLM Judge 评估事实、引用、时效和完整性。
  • 人工复核分流:低置信度或 Judge 异常样本自动进入人工复核队列。
  • 科研风格可视化:输出 Pareto 散点图、Top Variants 雷达图和指标热力图。
  • 可选可观测性:接入 Langfuse Trace、Node Span 和 Judge Generation;未配置时自动降级,不阻塞实验。
  • 故障隔离:单次模型请求失败会记录错误并继续后续实验。

架构

LLM-SearchEval Architecture

Mermaid 工作流

%%{init: {"theme":"base","themeVariables":{"background":"#FFFFFF","mainBkg":"#FFFFFF","primaryColor":"#EEF4FF","primaryTextColor":"#17223B","primaryBorderColor":"#4C6FFF","lineColor":"#71809B","clusterBkg":"#FAFCFF","clusterBorder":"#B7C4D8","edgeLabelBackground":"#FFFFFF"}}}%%
flowchart TB
    subgraph INPUT["实验输入"]
        direction LR
        CLI["CLI 参数"]
        DATA[("JSONL 数据集")]
        SWEEP[("Sweep 配置")]
        CLI ~~~ DATA ~~~ SWEEP
    end

    subgraph GRAPH["LangGraph 工作流"]
        direction LR
        PREP["准备路径"] --> LOAD["加载样本"] --> BUILD["构建变体"] --> RUN["执行实验"]
    end

    subgraph RUNTIME["联网实验运行时"]
        direction LR
        CLIENT["DoubaoClient"] --> ARK["火山方舟 Responses API"]
        ARK -->|启用联网| SEARCH["Web Search"] --> SUCCESS["成功记录"]
        ARK -->|直接回答| SUCCESS
        CLIENT -->|单次异常| ERROR["记录错误并继续"]
        SUCCESS & ERROR --> LOGS[("结构化日志")]
    end

    subgraph ANALYSIS["评估与决策"]
        direction TB
        EVAL["规则评估"] --> TRADE["Tradeoff / Pareto"] --> GATE{"启用双评委?"}
        GATE -->|是| JUDGE["双评委 LLM"] --> REVIEW["低置信度检测"] --> JREPORT["Judge 报告"] --> VIS["科研可视化"]
        GATE -->|否| VIS
        VIS --> FINAL["汇总产物"]
    end

    subgraph OUTPUT["分析与产物"]
        direction LR
        REPORTS["评估 / Tradeoff / Judge 报告"]
        FIGURES["散点图 / 雷达图 / 热力图"]
        QUEUE["人工复核队列"]
        SUMMARY["graph_summary.json"]
        REPORTS ~~~ FIGURES ~~~ QUEUE ~~~ SUMMARY
    end

    CLI --> PREP
    DATA --> LOAD
    SWEEP --> BUILD
    RUN --> CLIENT
    LOGS --> EVAL
    EVAL & TRADE & JREPORT --> REPORTS
    REVIEW -->|低置信度或异常| QUEUE
    VIS --> FIGURES
    FINAL --> SUMMARY
Loading

完整、可编辑的 Mermaid 源文件见 docs/architecture.mmd,矢量版本见 docs/architecture.svg

快速开始

1. 安装

git clone https://github.com/fei121/LLM-SearchEval.git
cd LLM-SearchEval

python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate
pip install -r requirements.txt

2. 配置模型

在项目根目录创建 .env

ARK_API_KEY=your_api_key
ARK_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
ARK_MODEL=doubao-seed-1-6-250615

3. 运行完整流水线

python scripts/run_graph_pipeline.py \
  --dataset data/experiment_dataset.jsonl \
  --max-samples 20

运行完成后,结构化日志、评估报告和可视化结果会写入 reports/

常用实验方式

参数扫描

python scripts/run_graph_pipeline.py \
  --dataset data/experiment_dataset.jsonl \
  --sweep-profile data/tradeoff_sweep.example.json \
  --max-samples 20

启用双评委与人工复核分流

python scripts/run_graph_pipeline.py \
  --dataset data/experiment_dataset.jsonl \
  --sweep-profile data/tradeoff_sweep.example.json \
  --max-samples 20 \
  --enable-judge \
  --judge-low-confidence-threshold 0.35

运行指定数据区间

python scripts/run_graph_pipeline.py \
  --start-line 6 \
  --end-line 20

分步运行

# 生成实验数据集
python scripts/generate_dataset.py

# 执行实验
python scripts/run_experiments.py --max-samples 5 --variants baseline_web_on

# 生成规则评估报告
python scripts/evaluate_runs.py --logs reports/run_logs_YYYYMMDD_HHMMSS.json

# 生成 Tradeoff 报告
python scripts/tradeoff_report.py --logs reports/run_logs_YYYYMMDD_HHMMSS.json

# 生成科研图表
python scripts/visualize_tradeoff.py --logs reports/run_logs_YYYYMMDD_HHMMSS.json

评估体系

维度 指标 说明
搜索行为 Trigger Rate / Trigger Accuracy 模型是否在正确的样本上触发联网搜索
引用质量 Citation Coverage 成功回答中包含可追溯引用的比例
时效能力 Time-sensitive Citation Rate 时效性样本中使用引用的比例
响应性能 Average / P50 / P95 Latency 不同实验变体的响应延迟分布
资源成本 Token Total / Web Search Calls 模型与搜索工具的资源消耗
综合权衡 Composite Score / Pareto Front 在质量、时效与成本之间筛选优势方案
Judge 质量 Factual / Citation / Timeliness / Completeness 双评委对回答质量的细粒度评分
Judge 置信度 Confidence / Needs Review 将低置信度或异常结果送入人工复核

输出产物

reports/
├── run_logs_*.json                 # 结构化运行日志
├── raw_responses_*/                # 原始 API 响应
├── evaluation_report*.md           # 规则指标报告
├── tradeoff_report*.md             # 质量、成本与时效权衡报告
├── judge_raw_*.json                # 双评委原始结果(可选)
├── judge_report_*.md               # Judge 汇总报告(可选)
├── human_review_queue_*.csv        # 人工复核队列(可选)
├── graph_summary*.json             # 工作流产物索引
└── figures/
    ├── fig1_pareto_scatter.*
    ├── fig2_radar_top_variants.*
    └── fig3_metric_heatmap.*

Langfuse 可观测性

如需记录完整 Trace、节点 Span 和 Judge Generation,可在 .env 中增加:

LANGFUSE_PUBLIC_KEY=your_public_key
LANGFUSE_SECRET_KEY=your_secret_key
LANGFUSE_HOST=https://cloud.langfuse.com

使用显式会话运行:

python scripts/run_graph_pipeline.py \
  --max-samples 5 \
  --enable-judge \
  --session-id llm-search-eval-001 \
  --user-id researcher

如果未提供 Langfuse 密钥或 SDK 上报异常,流水线会自动降级为 No-op,实验主流程保持可用。

数据格式

数据集采用 JSON Lines,每条记录包含:

{
  "sample_id": "sample_001",
  "category": "time_sensitive",
  "question": "问题内容",
  "need_search": true,
  "time_sensitive": true,
  "notes": "样本备注"
}

运行日志保存样本、实验变体、回答、错误状态及原始响应位置。response 中包括答案、延迟、Token、工具调用、联网状态、查询词和引用。

项目结构

LLM-SearchEval/
├── data/                         # 数据集与参数扫描配置
├── docs/                         # Mermaid 架构源码与 SVG
├── scripts/                      # 数据生成、实验、评估与可视化入口
├── src/doubao_pipeline/
│   ├── graph/workflow.py         # LangGraph 工作流
│   ├── client.py                 # Doubao Responses 客户端
│   ├── runner.py                 # 实验执行与日志记录
│   ├── evaluator.py              # 规则指标评估
│   ├── tradeoff.py               # 综合得分与 Pareto 分析
│   ├── judge.py                  # 双评委与人工复核分流
│   ├── visualize.py              # 科研图表生成
│   └── observability.py          # Langfuse 可观测性
├── Architecture.png             # 项目架构图
├── RESEARCH_PLAN.md              # 研究设计
└── requirements.txt

设计原则

  • 事实可追溯:同时保留结构化指标、引用信息和原始模型响应。
  • 实验可复现:数据范围、参数变体和 Judge 阈值均由配置或 CLI 控制。
  • 失败可隔离:单次请求失败不会中断整个实验批次。
  • 评估可组合:规则指标、Pareto 分析和 LLM Judge 分层执行。
  • 观测可选配:外部观测系统不可用时不影响核心流程。

参与贡献

欢迎通过 Issue 提交新的评估维度、数据集设计、模型适配建议或可视化方案。提交代码前,请确保改动保持日志字段的可追溯性,并同步更新相关文档与架构图。

如果这个项目对你的 LLM 联网搜索研究有帮助,欢迎 Star、Fork 并分享你的实验结果。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages