PDF文档问答系统

一个基于RAG架构的系统,用于获取、处理最新的PDF文档(如SmPC文件),并通过LangChain和大型语言模型(Gemini或GPT-4.1)提供基于文档内容的问答服务,特别优化了冰岛语支持。

  • by a-burge
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 a-burge/mcp-poc

使用说明

用于最新PDF文档的MCP服务器

一个获取最新PDF文档(来自serlyfjaskra.is的SmPC文件)的系统,使用基于节的分块对其进行处理,并使用LangChain与谷歌的Gemini或OpenAI的GPT-4.1提供会话MCP服务器,针对冰岛语进行了优化。

项目概述

该项目实施了一个检索增强生成(RAG)系统,该系统:

  • 更新时获取最新的PDF文档
  • 将PDF分解为可管理的、语义连贯的片段
  • 使用LangChain提供会话式MCP服务器
  • 基于带有来源归因的PDF内容回答问题

域上下文

  • 文件:SmPC(产品特性摘要)文件
  • 来源: 特殊药物档案.is
  • 语言:冰岛语(所有文件和用户查询)
  • 用户:医疗保健专业人员(医生、药剂师)

主要特点

  • 基于分段的分组:通过从不将部分拆分为块来保持语义完整性
  • 消息来源:所有答案都包括对特定文档部分的引用
  • 冰岛语支持:针对准确的冰岛语理解和生成进行了优化
  • RAG架构:使用向量嵌入进行高效检索和生成
  • 双LLM支持:可配置支持Google Gemini和OpenAI GPT-4.1

建筑

该系统遵循RAG管道:

  1. PDF更新事件→ PDF提取管道
  2. 文档分割(基于节的分块)
  3. 矢量存储(嵌入和索引)
  4. MCP服务器(查询处理、检索和生成)

快速开始

先决条件

  • Python 3.11或更高版本(httpx>=0.27和Opik兼容性所需)
  • Google Gemini或OpenAI GPT-4.1的API密钥

安装

  1. 克隆仓库 (如果适用)或导航到项目目录

  2. 确保已安装Python 3.11+:

    python3 --version  # Should show 3.11 or higher
    

    如果你需要安装Python 3.11+:

    • macOS(使用Homebrew): brew install python@3.11
    • 使用pyenv: pyenv install 3.11.9 && pyenv local 3.11.9
    • Linux:使用您的发行版的包管理器
    • 视窗:从下载 python.org
  3. 创建虚拟环境:

    python3 -m venv venv
    source venv/bin/activate  # On Windows: venv\Scripts\activate
    
  4. 安装依赖项:

    pip install -r requirements.txt
    
  5. 配置环境变量:

    cp .env.example .env
    

    编辑 .env 并添加您的API密钥:

    # Choose one LLM provider
    LLM_PROVIDER=gemini  # or "gpt4"
    
    # For Gemini
    GOOGLE_API_KEY=your_google_api_key_here
    
    # For GPT-4.1
    OPENAI_API_KEY=your_openai_api_key_here
    
    # PDF URL (update with actual SmPC PDF URL)
    PDF_URL=https://serlyfjaskra.is/example/smpc.pdf
    

运行应用程序

启动Streamlit界面:

streamlit run src/streamlit_app.py

应用程序将在您的浏览器中打开 http://localhost:8501.

用法

  1. 处理PDF:

    • 在侧边栏中输入PDF URL
    • 选择您的法学硕士提供者(Gemini或GPT-4.1)
    • 点击“Vinnaúr PDF”(流程PDF)按钮
    • 等待文档被下载、分块和索引
  2. 提问:

    • 在查询框中输入您的冰岛语问题
    • 点击“Leita”(搜索)按钮
    • 查看带有源引用的答案
  3. 查看源代码:

    • 展开源代码部分,查看用于生成答案的确切文本
    • 每个源都包括节名称、文档名称和页码

项目结构

fwh/
├── README.md                 # This file
├── REFERENCE.md              # Detailed technical documentation
├── requirements.txt          # Python dependencies
├── .env.example              # Environment variable template
├── config.py                 # Configuration management
├── src/
│   ├── __init__.py
│   ├── pdf_fetcher.py        # PDF download and text extraction
│   ├── chunker.py            # Section-based chunking
│   ├── vector_store.py       # Vector store management
│   ├── rag_chain.py          # RAG chain setup
│   └── streamlit_app.py      # Streamlit UI
└── data/
    ├── pdfs/                 # Downloaded PDFs
    └── vector_store/         # Persisted vector store

配置

配置是通过环境变量进行管理的 .env 文件:

  • LLM_PROVIDER:“双子座”或“gpt4”
  • GOOGLE_API_KEY:Google Gemini API密钥(如果使用Gemini,则需要)
  • OPENAI_API_KEY:OpenAI API密钥(如果使用GPT-4.1,则为必需项)
  • PDF_URL:要处理的默认PDF URL
  • CHUNK_SIZE:目标块大小(以字符为单位)(默认值:300)
  • CHUNK_OVERLAP:块之间的重叠(默认值:0)
  • EMBEDDING_MODEL:嵌入模型名称(默认:释义多语言MiniLM-L6-v2)
  • RETRIEVAL_TOP_K:要检索的块数(默认值:5)

API密钥

Google Gemini API密钥

  1. 访问 谷歌人工智能工作室
  2. 使用您的Google帐户登录
  3. 创建新的API密钥
  4. 将密钥复制到您的 .env 文件

OpenAI API密钥

  1. 访问 OpenAI平台
  2. 登录或创建帐户
  3. 创建新的API密钥
  4. 将密钥复制到您的 .env 文件

技术细节

基于分段的分组

该系统使用智能截面检测来保持语义完整性:

  • 使用模式匹配检测节标题
  • 从不在一个部分内拆分内容
  • 用元数据标记每个块(节、页、源文档)
  • 仅在必要时细分大块

向量存储

  • 使用Chroma进行持久载体存储
  • 采用多语言嵌入(意译multilingual-MiniLM-L6-v2)来支持冰岛语
  • 存储用于过滤和源归因的元数据

RAG链条

  • 基于语义相似度检索前k个相关块
  • 使用自定义冰岛语提示,强调准确性和来源引用
  • 支持Gemini和GPT-4.1,可配置选择
  • 返回包含源引用的答案

故障排除

常见问题

  1. API密钥错误:

    • 确保在中正确设置了API密钥 .env
    • 验证密钥是否有效,是否有足够的学分/配额
  2. PDF下载失败:

    • 检查PDF URL是否可访问
    • 验证网络连接
    • 确保URL指向有效的PDF文件
  3. 导入错误:

    • 确保安装了所有依赖项: pip install -r requirements.txt
    • 验证您使用的Python版本是否正确(3.11+)
  4. 矢量存储问题:

    • 通过删除来清除矢量存储 data/vector_store/ 目录
    • 重新处理PDF以重建索引

发展

运行测试

(待实施)

代码风格

  • 遵循PEP 8标准
  • 全程使用类型提示
  • Google风格的公共函数文档字符串

文档

看 参考.md 详细的架构、实施计划和技术规范。

状态

✅ POC完成 -已准备好进行测试和评估

许可证

[在此处添加您的许可证]