基于 LlamaIndex + Streamlit 实现的 RAG(检索增强生成)应用。用户上传 PDF 文件后,可以用自然语言提问,系统根据文档内容给出准确、可靠的回答。
支持 阿里云通义千问(DashScope) 和 OpenRouter 多种大语言模型,并内置评估数据集生成与 RAG 质量评测功能。
- 支持单份 PDF 的智能问答
- 同时使用向量检索(适合找细节、引用、事实)和摘要检索(适合总结、整体理解)
- 通过路由机制(Router Retriever)让 LLM 自动判断使用哪种检索方式
- 使用重排序(Reranker)提升检索结果的精确性
- 支持流式输出 + 模型推理过程展示,提升用户体验
- 内置数据集生成与评估管线,便于量化 RAG 效果
- 适用场景:论文阅读、合同审查、技术手册查询、内部知识库问答等
| 类别 | 技术 / 库 | 主要用途 |
|---|---|---|
| 前端界面 | Streamlit | 快速构建交互式聊天界面 |
| RAG 核心框架 | LlamaIndex | 文档加载、分块、索引、检索、对话引擎 |
| 大模型 | 通义千问 (qwen-max)、OpenRouter (Step 3.5 Flash, GPT-oss 20B) | 文本生成、路由选择 |
| 向量嵌入 | DashScope text-embedding-v2 | 生成文本向量 |
| PDF 解析 | SimpleDirectoryReader | 加载 PDF 文档 |
| 索引类型 | VectorStoreIndex + SummaryIndex | 向量检索 + 文档摘要检索 |
| 检索路由 | RouterRetriever + LLMSingleSelector | 智能选择检索工具 |
| 重排序 | DashScopeRerank (gte-rerank) | 对检索结果重排,提升 Top-N 精确性 |
| 对话记忆 | ChatMemoryBuffer (可配置 token 上限) | 支持多轮上下文对话 |
| 数据集生成 | RagDatasetGenerator | 从文档自动生成问答对用于评估 |
| 评估指标 | FaithfulnessEvaluator + RelevancyEvaluator | 忠实度与相关性评测 |
| 环境变量管理 | python-dotenv | 安全管理 API Key |
- 用户上传 PDF → 保存到临时目录
- 使用 SimpleDirectoryReader 解析文档
- SentenceSplitter(块大小 1024,交叠 150)进行分块
- VectorStoreIndex:用于精确定位细节、引用、具体事实
- SummaryIndex:用于回答概括性、整体理解类问题
router_retriever = RouterRetriever(
selector=LLMSingleSelector.from_defaults(),
retriever_tools=[summary_tool, vector_tool],
verbose=True
)LLM 根据问题自动判断:
- 用 summary_tool(问主题、总结、大方向)
- 用 vector_tool(问具体段落、数据、引用)
检索结果经过 DashScope gte-rerank 模型重排,从 Top-K(默认 15)中筛选出最相关的 Top-N(默认 5)节点,提升回答质量。
- 使用 ContextChatEngine(保留完整上下文)
- 自定义 system prompt,强制模型基于上传的 PDF 内容回答,不编造内容
- 支持 streaming 流式输出(逐 token 显示)
- 内置 ChatMemoryBuffer 支持多轮对话
- 自动识别模型输出中的 `` 标签
- 用
st.expander折叠展示推理过程,主回答保持简洁
| 文件 | 功能 |
|---|---|
demo.py |
Streamlit 前端应用入口 |
utils.py |
核心工具函数:LLM 路由、索引构建、检索引擎配置 |
dataset_generate.py |
从 PDF 文档自动生成评估数据集(问答对) |
eval.py |
对生成的数据集进行评估,输出忠实度与相关性指标 |
- Python 3.10+
- 可联网访问 dashscope.aliyuncs.com 和 openrouter.ai
pip install streamlit llama-index llama-index-llms-openai-like llama-index-llms-openrouter llama-index-embeddings-dashscope llama-index-postprocessor-dashscope-rerank pymupdf python-dotenv推荐创建 requirements.txt:
streamlit>=1.38.0
llama-index>=0.10.0
llama-index-llms-openai-like
llama-index-llms-openrouter
llama-index-embeddings-dashscope
llama-index-postprocessor-dashscope-rerank
llama-index-readers-file
pymupdf
python-dotenv
pandas
项目根目录创建 .env 文件:
DASHSCOPE_API_KEY=sk-你的通义千问API密钥
OPENROUTER_API_KEY=sk-你的OpenRouter API密钥两个 Key 均需配置,DashScope 用于嵌入模型和 Qwen 模型,OpenRouter 用于免费模型。
streamlit run demo.py浏览器会自动打开:http://localhost:8501
- 侧边栏选择模型(Qwen Max / Step 3.5 Flash / GPT-oss 20B)
- 上传一份 PDF 文件
- 等待「PDF 加载完成」和「索引构建完成」
- 在下方输入框提问
- 可点击「清空对话」重置所有状态
将待评估的 PDF 文件放入 Files/ 目录,然后运行:
python dataset_generate.py脚本会:
- 加载
Files/目录下的文档 - 使用 Qwen Max 为每个文本块生成 2 个问答对
- 保存为
datasets/my_dataset.json
将 PDF 文件放入 Files/ 目录,确保 datasets/my_dataset.json 已生成,然后运行:
python eval.py脚本会:
- 加载评估数据集
- 使用 ChatEngine 逐一生成回答
- 分别评估 忠实度(Faithfulness) 和 相关性(Relevancy)
- 输出汇总结果到
eval/result.csv,包含每个问题的回答、各项指标的通过情况及模型反馈
评估指标说明:
- 忠实度(Faithfulness):回答是否基于检索到的上下文,是否存在幻觉/编造
- 相关性(Relevancy):回答是否与问题相关
- 仅支持单份 PDF(可扩展为多文件/文件夹)
- 未显示引用来源/页码(可添加 Citation 后处理)
- 未处理表格、图片内容(可引入 LlamaParse 或 Unstructured)
- 可进一步加入 hybrid search 提升检索召回率
- 评估数据集的生成质量依赖 LLM,可加入人工校验环节