- 全文扫描识别:在全文范围内识别完整问答对(可配置questioner_prefixes),不受传统分块限制
- 规则直接提取:高置信度问答对直接提取,无需LLM处理,效率提升
- 智能配对逻辑:支持多种问答组合模式(如问-答、问-问-答、问-答-答)
- 标准格式识别:支持questioner_prefixes和answerer_prefixes定义的问答标识
- 支持扩展模式:如编号前缀(1.网友:)、带标识符(网友A:)、间接引用(有人问:)
- 高效直接处理:直接提取,无需语义分析+LLM 处理,提高效率
# 支持的问答格式示例
"网友:什么是价值投资?" # 基础格式
"1. 主持人:如何看待市场波动?" # 编号前缀
"有人问:stop doing list是什么?" # 间接引用- 动态阈值计算:基于文本语义自动调整相似度阈值
- 潜在问题检测:结合长度限制、疑问词、词性分析
- 领域自适应:根据文本内容选择通用或领域特定模型(如paraphrase-multilingual-MiniLM-L12-v2)
- 提供关键参数:max_question_length, default_similarity_threshold, std_factor
- 智能合并:合并过小的语义相关块(min_block_size)
- 自动分割:按语义分割超大块(max_block_size)
- 置信度维持:当系统合并多个文本块时,每个块都有自己的置信度等级(high/medium/low)。合并时保持最低置信度,保持处理的保守性和可靠性
- 动态模板选择:根据Token数量自动切换Prompt模板
- Full Prompt(
full_prompt):Token充足时使用,包含详细示例 - Compact Prompt(
compact_prompt):Token受限时自动切换,保留核心指令
- Full Prompt(
- 模板目录配置:
prompt_template_dir - 自动截断策略:优先级按段落→句子→字符顺序
- 链式摘要机制:超长答案自动分片处理(chain_summary_threshold)
- NLI蕴含校验:使用mDeBERTa-v3模型验证摘要质量(nli_model_path)
- 预定义降级策略:生成式摘要 → 抽取式摘要 → 原文保留
# 长答案处理流程
if len(answer) > 3000: # 自定义长答案触发参数
chunks = smart_split(answer, target_length=500)
summaries = [llm_summarize(chunk, length=50) for chunk in chunks]
final_summary = " ".join(summaries)
if nli_entailment_score(answer, final_summary) > 0.7:
return final_summary
else:
return extractive_summary(answer)- 实时Token估算:中文1.5倍,英文0.75倍
- 自动阈值管理:Token上限6000(max_prompt_tokens)
- 使用统计追踪:记录Full/Compact配置使用
- 🤖 本地大模型集成:支持Ollama自定义LLM model_name(默认:qwen2.5:7b-instruct)
- 批量并行处理:启用多线程并行,配置batch_size和max_workers
- 连接池优化:复用HTTP连接
- 模型预热机制:配置模型预热,保持30分钟热状态
Legend QA Extractor 采用 QA-First + 智能语义分组 + 并发处理 的架构设计,从 raw PDF content 到 structured Q&A pairs 的完整处理流程包含8个主要阶段:
- PDF文本提取 - PyMuPDF 文本提取
- 文本预处理 - 标准化Q&A格式,分割段落
- QA优先识别 - 规则基础快速识别明显问答对
- 语义分组 - 三层智能分块策略
- 并发处理 - ThreadPoolExecutor 并行处理
- LLM提取 - Ollama API 调用,JSON解析
- 后处理 - 长答案处理、质量过滤、关键词生成
- 输出保存 - JSONL格式保存,详细日志记录
graph LR
A[PDF输入] --> B[文本提取]
B --> C[预处理]
C --> D[QA识别]
D --> E[语义分组]
E --> F[并发处理]
F --> G[LLM提取]
G --> H[后处理]
H --> I[JSONL输出]
style A fill:#e1f5fe
style I fill:#e8f5e9
style F fill:#fff3e0
style G fill:#f3e5f5
- 完整系统架构图 - 包含详细的组件关系、代码位置和性能优化说明
- 核心模块说明 - PDF处理器、文本处理器、QA提取器、LLM客户端、语义分组器
- 性能优化特性 - 并发处理、连接池、Keep-Alive机制、Token监控
- 配置参数详解 - 语义分组、长答案处理、批处理等高级配置
QAExtractionProcessor- 主协调器,管理整个处理流程PDFProcessor- PDF文本提取和元数据获取TextProcessor- 文本预处理和分块SemanticGrouper- 三层智能语义分组策略QAExtractor- LLM驱动的问答对提取LLMClient- Ollama API 客户端,支持并发和优化
- Python: 3.8 或更高版本
- Ollama: 已安装并运行 (安装指南)
- 模型: 推荐
qwen2.5:7b-instruct或更高版本 - 新增依赖: sentence-transformers, jieba, torch
# 1. 克隆项目
git clone https://github.com/yourusername/legend-qa-extractor.git
cd legend-qa-extractor
# 2. 自动环境设置(推荐)
chmod +x scripts/setup_environment.sh
./scripts/setup_environment.sh
# 3. 拉取推荐模型(可自定义)
ollama pull qwen2.5:7b-instruct# config/config.yaml - v2.0 配置
# 基础设置
pdf_filename: "document.pdf"
model_name: "qwen2.5:7b-instruct"
max_block_size: 1500
min_block_size: 200
# 🚀 智能语义分组配置
semantic_grouping:
max_question_length: 50 # 潜在问题最大长度
default_similarity_threshold: 0.65 # 默认相似度阈值
std_factor: 0.5 # 动态阈值计算系数
high_confidence_min_size: 100 # 高置信度块最小尺寸
high_confidence_max_size: 2000 # 高置信度块最大尺寸
model_name: "paraphrase-multilingual-MiniLM-L12-v2"
# 🚀 长答案处理配置
long_answer_processing:
chain_summary_threshold: 3000 # 触发链式摘要的长度
summary_length: 50 # 摘要片段目标长度
entailment_threshold: 0.7 # NLI蕴含验证阈值
nli_model_path: "MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7"
# 🚀 过滤和质量控制
filtering_level: "balanced" # strict/balanced/none
semantic_threshold: 0.5 # 语义过滤阈值# 高效提取
python extract_qa.py interview.pdf
# 高质量模式
python extract_qa.py document.pdf \
--model qwen2.5:14b-instruct \
--temperature 0.05 \
--config config/high_quality.yaml
# 快速测试(按比例采样)
python extract_qa.py large_document.pdf --sample 0.02from evaluation import QAEvaluator
# 初始化评估器
evaluator = QAEvaluator(
golden_set_path="golden_set.jsonl",
generated_qa_path="output/extracted_qa.jsonl"
)
# 执行评估
results = evaluator.evaluate_qa_extraction()
# 生成报告
evaluator.generate_evaluation_report(results)- 问题匹配度:使用多语言sentence-transformer计算问题相似度
- 答案质量度:深度语义理解,不仅比较文字,更关注语义
- 综合评分:问题相似度(30%) + 答案相似度(70%)
{
"golden_set_size": 7,
"generated_set_size": 7,
"average_question_similarity": 0.9983,
"average_answer_similarity": 0.9279,
"overall_score": 0.9490,
"matched_pairs": 7,
"grade": "优秀 🏆",
"confidence_distribution": {
"high": "7 blocks (100.0%)"
}
}# 1. 从Excel创建黄金标准集
python scripts/excel_to_golden_set.py template # 生成标注集模板
# 编辑 golden_set_template.xlsx
python scripts/excel_to_golden_set.py convert # 转换为JSONL
# 2. 运行提取
python extract_qa.py your_document.pdf
# 3. 执行评估
python evaluation.py实时监控和优化token使用:
📊 Token使用报告
==================================================
📝 Prompt使用统计:
精简版: 15 次 (60%)
完整版: 10 次 (40%)
🎯 Token使用统计:
平均利用率: 68.5%
最高使用: 3,245 tokens
最低使用: 1,892 tokens
⚡ 性能指标:
处理速度: 2.3 块/分钟
平均响应时间: 8.7秒
🟢 Token利用率健康python scripts/excel_to_golden_set.py template| question | answer | domain | difficulty | quality_score |
|---|---|---|---|---|
| 什么是价值投资? | 价值投资就是买股票就是公司... | investment | medium | 5 |
| 如何看待市场波动? | 市场先生的报价每天都不一样... | investment | easy | 4 |
python scripts/excel_to_golden_set.py convert
python evaluation.py我们欢迎以下方向的贡献:
- 🧠 新的领域识别模型
- 📝 更好的摘要算法
- 🌍 多语言支持(目前主要支持中文)
- ⚡ 性能优化建议
- 🐛 Bug修复和代码优化
- 📖 文档完善和示例补充
MIT License