本项目是一个基于 LangGraph 和大语言模型(LLM)实现的 Agentic RAG (检索增强生成) 系统。它融合了动态查询分析和自我纠错机制,能够根据用户问题的复杂度智能地选择最优的策略(直接回答、向量库检索或网络搜索),并对生成的答案进行相关性评估,从而实现更高质量的问答效果。
- 智能路由:根据问题类型自动选择直接回答、向量检索或网络搜索。
- 自我纠错:当生成的答案与问题不相关时,系统会自动改写问题并重新尝试,形成一个修正循环。
- 动态知识源:集成了本地向量数据库(ChromaDB)和实时网络搜索(Tavily)。
- 高度可配置:支持切换不同的语言模型和嵌入模型,兼容OpenAI API格式的各种模型(包括本地部署的Ollama、VLLM等)和本地Sentence-Transformers模型。
- 模块化设计:代码结构清晰,分为状态、节点、链、图等模块,便于维护和二次开发。
- 智能混合检索 (Intelligent Hybrid Retrieval):Agent可根据问题类型(概念理解 vs. 精确查找)自动选择最优检索策略(分层检索或直接检索),解决了特定实体查不准、查不全的问题。
为了根治“大海捞针”和“特定条目查不全”的矛盾,本项目架构已升级为**智能混合检索(Intelligent Hybrid Retrieval)**模式。
Agent的核心不再是单一的检索链路,而是一个更聪明的智能调度器。它首先仅根据用户问题本身进行意图分析,然后决定调用哪一种最合适的“武器”去获取知识:
-
直接区块检索 (Direct Chunk Search):当用户查询一个具体实体(如药品名、产品型号)时,Agent会选择此策略。它将直接在最细粒度的“区块层”进行高精度搜索,确保最高的查全率。
-
分层检索 (Hierarchical Search):当用户提出一个开放性、概念性问题时,Agent则采用此策略。它会先通过“摘要层”定位相关文档,再到文档内部寻找答案,保证了上下文的完整性。
这种设计让Agent能“因材施教”,针对不同问题采用不同策略,兼顾了查全率与查准率,是构建强大RAG系统的关键。
为了极致地提升效率和准确性,数据注入(ingest.py)过程也采用了智能策略:对于文章、报告等叙事型文档,系统会调用LLM生成高质量摘要;对于药品清单等表格型数据,系统则会跳过LLM调用,直接使用数据原文作为其自身的“摘要”,确保了对精确条目的100%信息保真度,并将注入时间从数小时缩短至数分钟。
系统的工作流程已升级,其核心步骤如下:
-
智能路由 (Route Query):接收用户问题,LLM仅根据问题本身分析其意图,决定最合适的处理路径(
direct_chunk_search,hierarchical_search,web_search,direct)。 -
知识检索 (Retrieve):仅当路由决策需要从本地知识库检索时,此步骤被激活。Agent会根据第1步的决策,调用对应的检索函数(直接区块检索或分层检索)来获取上下文。
-
重写查询 (Rewrite Query):如果需要从知识库或网络检索,首先使用LLM优化和改写用户问题,使其更适合作为后续检索的输入。
-
生成答案 (Generate Response):LLM结合检索到的上下文信息和优化后的问题来生成答案。
-
评估相关性 (Grade Relevance):使用LLM评估生成的答案是否与原始问题相关。
- 如果相关:流程结束,将答案返回给用户。
- 如果不相关:流程自动跳转回第3步(重写查询),开始新一轮的尝试。
这个循环修正的机制确保了最终答案的质量和相关性。
- 语言: Python 3.11+
- 流程编排: LangGraph
- LLM框架: LangChain
- 核心语言模型: Qwen, GPT, 或任何兼容OpenAI API的自定义模型
- 向量数据库: ChromaDB
- 嵌入模型: 支持OpenAI兼容模型和本地Sentence-Transformers模型
- 网络搜索: Tavily Search
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS/Linux
source .venv/bin/activatepip install -r requirements.txt-
将
.env.example文件复制并重命名为.env。 -
打开
.env文件,填入您的API密钥和自定义API地址。# OpenAI 或 兼容OpenAI的模型的API Key OPENAI_API_KEY="your_openai_api_key" # 用于网络搜索的 Tavily API Key TAVILY_API_KEY="your_tavily_api_key" # --- Custom Endpoints --- # 用于聊天模型的主URL (例如: "http://localhost:11434/v1") OPENAI_API_BASE= # 如果您的嵌入模型使用了与聊天模型不同的URL,请在此处设置。 # 如果留空,将默认使用上面的 OPENAI_API_BASE。 EMBEDDING_API_BASE=
您可以在 config.py 文件中调整系统的核心行为:
LLM_MODEL_NAME: 设置聊天模型的名称 (例如:"gpt-4o","qwen-turbo")。EMBEDDING_PROVIDER: 选择嵌入模型的提供商。"openai": 使用兼容OpenAI API的模型。"local": 使用本地Sentence-Transformers模型。
EMBEDDING_MODEL_NAME: 当提供商为openai时,指定嵌入模型的名称。LOCAL_EMBEDDING_MODEL_PATH: 当提供商为local时,指定本地模型的路径或HuggingFace Hub名称。
-
将您自己的知识库文档 (如 .txt, .md, .pdf, .xlsx 文件) 放入
data文件夹中。 -
运行以下命令来处理这些文档并构建向量数据库:
python ingest.py
该脚本会读取
data目录下的所有文件,将它们处理并存储到chroma_db目录中。如果您的文档很多,或者您选择使用本地嵌入模型,此过程可能需要一些时间。
知识库初始化完成后,运行主程序:
python main.py程序启动后,您可以直接在命令行中输入问题进行交互。
您可以通过特定的指令来与Agent的长期记忆进行交互:
-
查看记忆: 输入
!show_memories来查看Agent最近记住的10条关键信息。 -
删除记忆: 输入
!forget [您想忘记的主题]来让Agent删除相关的记忆。例如:!forget 我的项目ID系统会找出与该主题相关的记忆,并请求您最终确认是否删除。
如果您不确定自定义模型的配置是否正确,可以运行测试脚本:
python test_custom_model.py该脚本会验证聊天模型的API地址和模型名称是否可用。