这是一个基于 RAG (检索增强生成) 技术的本地问答机器人项目。它可以读取本地文件夹中的 PDF 文档,将其转化为向量索引,并利用 OpenAI 的 GPT 模型根据文档内容回答用户的问题。
项目包含一个基于 Gradio 的可视化网页界面,支持多语言问答(系统会自动优化检索词)。
- 本地文档加载:自动扫描
docs/文件夹下的所有 PDF 文件。 - 向量化存储:使用 OpenAI Embeddings 将文本向量化,并持久化存储在本地
chroma_db/中(重启无需重新索引)。 - 智能检索:使用 LangChain 的 RetrievalQA 链查找最相关的文档片段。
- 跨语言智能检索 (Cross-Lingual RAG):内置翻译逻辑,将用户问题转化为英文进行检索以提高准确率,最终用用户原语言回答。
- 可视化界面:提供简洁的 Gradio 聊天窗口。
根据截图与代码逻辑,项目文件结构如下:
R/
├── .gradio/ # Gradio 缓存目录(自动生成)
├── chroma_db/ # 向量数据库持久化目录(自动生成,存储索引数据)
├── docs/ # 存放PDF 文档(如简历、论文等)
├── my_env/ # Python 虚拟环境
├── .env # 配置文件(存放 API Key)
├── QAchatbot.ipynb # 主程序代码(Jupyter Notebook)
└── README.md # 项目说明文档
- 前置要求 Python 3.8 或更高版本
有效的 OpenAI API Key
- 安装依赖 建议在 my_env 虚拟环境中运行。请确保安装以下核心库:
pip install langchain langchain-openai langchain-community langchain-chroma gradio python-dotenv pypdf
- 配置 API Key 在项目根目录下创建一个名为 .env 的文件(如果不存在),并添加 OpenAI Key:
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-
准备数据: 将您想要问答的 PDF 文件(例如简历、技术文档、论文)放入 docs/ 文件夹中。
截图示例中包含:A_Comprehensive_Review...pdf, Henrietta Mitchell resume.pdf 等。
-
运行程序: 打开 QAchatbot_updated.ipynb,按顺序执行所有单元格(Cells)。
-
初始化索引:
-
首次运行:程序会自动读取 docs/ 中的 PDF,切分文本并构建向量数据库。这可能需要几分钟(取决于文档大小)。
-
后续运行:程序会检测到 chroma_db 文件夹存在,直接加载已有索引,速度很快。
-
-
开始对话: 代码运行到底部会启动 Gradio 界面(通常地址为 http://0.0.0.0:7860 或 http://localhost:7860)。 在输入框中输入问题,例如:
-
"Henrietta Mitchell 的主要技能是什么?"
-
"总结一下那篇关于 LoRA 的论文。"
-
如果需要调整配置,请在 Notebook 中找到以下变量:
-
DOCS_DIR: 文档存放路径(默认为 "docs")。
-
PERSIST_DIRECTORY: 向量库存储路径(默认为 "chroma_db")。
-
llm: 默认使用 gpt-4o-mini,可根据需要更改模型。
-
chunk_size: 文本切分大小(默认为 1000 字符)。
为了解决中文提问匹配英文文档准确率低的问题,本项目采用了以下处理逻辑:
- Input: 用户输入中文问题(例如:“LoRA 的原理是什么?”)。
- Translation: LLM 自动将问题翻译为英文("What is the principle of LoRA?")。
- Search: 使用英文问题在向量数据库中检索最相关的文档片段(Chunk)。
- Generation: 将 [英文文档片段 + 原始中文问题] 喂给 GPT-4o。
- Output: GPT-4o 基于英文资料,用中文生成最终答案。
Q: 我添加了新的 PDF,为什么机器人不知道?
A: 如果添加了新文件,目前最简单的方法是删除 chroma_db 文件夹,然后重新运行代码。程序会重新扫描 docs 目录并重建索引。
Q: 启动时报错 ValueError: 请在 .env 文件中设置 OPENAI_API_KEY?
A: 请确保根目录下有 .env 文件,且格式正确(不要有空格或引号包裹 Key)。