一个基于 LangChain + Flask 构建的简历问答 Demo,支持文档检索增强生成(RAG)、多轮对话记忆、模型自动 Fallback,并配有简单的前端界面。
- RAG 检索增强:基于 Chroma 向量库 + HuggingFace Embedding,实现语义相似度检索
- 多轮对话记忆:不同浏览器会话独立隔离,刷新页面后历史不丢失
- 模型自动 Fallback:本地模型不可用时自动切换到 DeepSeek API,保证服务可用性
- 前端实时交互:简洁的 Web 界面,支持 loading 状态、换行保留和错误提示
- 对话历史持久化:每个 session 的历史自动保存为本地 JSON,程序重启后可恢复
| 模块 | 技术 |
|---|---|
| 大模型调用 | LangChain + ChatOpenAI(兼容 OpenAI 格式) |
| 向量库 | Chroma + HuggingFaceEmbeddings (BAAI/bge-small-zh-v1.5) |
| 文本切分 | RecursiveCharacterTextSplitter |
| Web 服务 | Flask |
| 前端 | 原生 HTML / CSS / JavaScript |
langchain_mycode/
├── app.py # Flask 入口,负责路由、编排调用流程
├── chains.py # LangChain Prompt / Chain / Fallback 封装
├── config.py # API 配置、文件路径、环境初始化
├── history_manager.py # 对话历史:内存缓存 + JSON 持久化
├── vector_store.py # Embedding 模型加载、向量库构建与检索
├── test.py # 命令行测试入口(无 Web 服务时调试用)
├── static/
│ └── index.html # 前端页面
├── chat_history/ # 对话历史 JSON 存储目录
└── db/ # Chroma 向量库持久化文件
pip install langchain langchain-openai langchain-community langchain-huggingface chromadb flask复制环境变量模板并填入你的真实密钥:
cp .env.example .env然后编辑 .env:
DEEPSEEK_API_KEY=your-deepseek-api-key
.env已被加入.gitignore,不会提交到仓库,确保密钥安全。
将简历或知识文档放到 config.py 中 DOC_PATH 指定的路径,首次运行会自动构建向量库。
python app.py访问 http://127.0.0.1:5000/ 即可使用。
用户提问
↓
retriever.invoke(question) → 语义检索 Top-K 文档片段
↓
组装 Prompt:system(参考文档) + history(多轮记忆) + human(当前问题)
↓
safe_invoke() → 优先调用 local_llm,失败自动 fallback 到 DeepSeek
↓
AI 回复 + 更新对话历史 + 持久化到 JSON
- 前端首次打开页面时通过
crypto.randomUUID()生成唯一session_id,存入localStorage - 后端根据
session_id区分不同用户,get_session_history()从内存缓存读取,缺失时从 JSON 文件加载 - 每次请求结束后在
finally块中调用save_session_history(),确保无论模型调用成功与否都会尝试持久化
safe_invoke()内部先尝试local_chain_with_memory.invoke()- 若本地模型不可用(网络不通、认证失败),捕获异常后自动切换到
primary_chain_with_memory(DeepSeek) - 返回结果中附带
model_used和retried字段,便于上层判断本次请求是否触发了 fallback
- API Key 安全:
config.py中的密钥不要提交到公共仓库,生产环境建议使用环境变量 - 向量库重建:如果更换了原始文档,需要删除
db/目录,下次启动会自动重新构建 - 本地模型:如果不需要 local fallback,可将
safe_invoke()中 fallback 逻辑简化,避免等待超时