我们要构建一个技术支持智能助手,它能理解用户查询,根据问题复杂度动态选择检索深度(Adaptive RAG),通过 LangGraph 执行推理工作流,经由 FastAPI 返回结果,最后在 Streamlit UI 上呈现响应。这个场景针对的是一个真实痛点:团队面对大规模文档集时,传统 RAG 在模糊查询或多步骤问题上经常答非所问。
技术概览
Adaptive RAG 可以理解为'搜索之前先思考'的 RAG。简单查询走轻量级检索就够了,遇到复杂问题则自动切换到多跳深度搜索、重排序或查询扩展,用更低的延迟换更高的准确率。
LangGraph 是用来构建有状态、多步骤 AI 工作流的框架。和传统链式调用不同,它把 LLM 工作流建模成一张图——每个节点对应一个步骤(检索 → 推理 → 验证 → 响应),原生支持重试、记忆、循环和故障转移。对于需要在生产环境中保证可预测行为的场景,这种抽象比线性 chain 灵活得多。
FastAPI 把 Adaptive RAG + LangGraph 包装成 API 接口对外暴露,处理请求分发,天然适配异步 I/O。前端用 Streamlit 搭建,聊天风格的界面,不需要写 HTML/CSS,做 POC 演示足够了。
系统架构
数据流走向如下:
User → Query → Streamlit UI → Sends request → FastAPI → Passes query → LangGraph → Runs Adaptive RAG → Retriever → Gets chunks → Vector DB → Returns results → LangGraph → Generates final response → FastAPI → Sends to UI → User
项目结构
项目结构尽量精简,核心文件分布如下:
ai-poc/
├── backend/ # 后端逻辑
│ ├── app.py # FastAPI API 服务器
│ ├── rag_pipeline.py # Adaptive RAG 检索
│ ├── graph_workflow.py # LangGraph 工作流
│ ├── config.py # 配置和环境设置
│ ├── data/ # 源文档
│ └── __init__.py # 包初始化器
├── frontend/ # UI 层
│ ├── ui.py # Streamlit 界面
│ └── __init__.py # 包初始化器
├── .env # API 密钥和机密信息
├── requirements.txt # 项目依赖
└── README.md # 设置说明
requirements.txt 包含以下依赖:
fastapi uvicorn[standard] streamlit requests pydantic langchain langchain-community langgraph faiss-cpu sentence-transformers openai python-dotenv
核心代码实现
自适应检索管道 (rag_pipeline.py)
这里的关键在于根据查询长度动态调整检索深度。我们定义一个类来管理 FAISS 向量库。


