DevGraph复制品
GitHub存储库的开发者生产力副本,使用 快速API, LangGraph, LangChain, 主控程序,以及 检索增强生成.
这个项目被设计成一个完整的学习路径:从一个简单的FastAPI应用程序开始,发展成为一个多代理、生产风格的agent AI系统。
______________________________________________________________________
1.项目设置(所有阶段)
1.1克隆并进入项目
如果这是你自己的回购 git clone\devgraph副本 cd devgraph副驾驶
如果你还没有在本地启动git,只需创建一个名为的文件夹 devgraph-copilot 并按照其余步骤进行操作。
1.2创建和激活虚拟环境
python-m venv.venv
窗户: .venv\\Scripts\\activate
macOS/Linux: source.ven/bin/activate
1.3安装依赖项
pip安装-r要求.txt
随着我们经历各个阶段,需求将会增长。至少,这个项目使用FastAPI、Uvicorn、LangChain、LangGraph、pydantic-settings和一些辅助库。
1.4运行应用程序
uvicorn app.main:应用程序--reload
在浏览器中打开:
- http://127.0.0.1:8000
- API文件:http://127.0.0.1:8000/docs
______________________________________________________________________
2.项目文件夹结构(高级)
随着项目的发展,结构将如下:
devgraph副驾驶/ ├── app │ ├── __初始化__南美国家巴拉圭的缩写(Paraguay) │ ├── main.py#FastAPI应用程序入口点(路由、布线) │ └── config.py#设置和配置(环境、密钥等) │ ├── 代理 │ ├── __初始化__南美国家巴拉圭的缩写(Paraguay) │ ├── graph_state.py#共享语言图形状态(查询、计划、文档等) │ ├── graph_builder.py#LangGraph图形定义(节点、边) │ ├── planner.py#planner代理(决定运行哪些代理) │ ├── introduct.py#摄入代理(克隆仓库、块、嵌入、索引) │ ├── data_quality.py#数据质量代理(对数据/索引进行健全性检查) │ ├── code_qa.py#基于RAG的代码qa代理(回答问题) │ ├── tool_executor.py#MCP工具执行器代理(调用外部工具) │ └── documentation_agent.py#额外代理示例(文档生成器) │ ├── rag │ ├── __初始化__南美国家巴拉圭的缩写(Paraguay) │ ├── chung.py#RAG的分块策略 │ ├── embeddings.py#嵌入模型包装器 │ └── vectorstore.py#矢量存储抽象(添加/搜索) │ ├── mcp服务器 │ ├── __初始化__南美国家巴拉圭的缩写(Paraguay) │ ├── repo_tools#用于repo操作(列表/读/写)的MCP服务器 │ └── external_tools#用于外部API(天气/新闻等)的MCP服务器 │ ├── tests │ └── test_main.py#单元/集成测试(稍后将增长) │ ├── docs │ ├── 项目概述与规划.md │ ├── architecture.md │ ├── code_flow.md │ ├── how_toadd_an_agent.md │ ├── example_new_agent_documentation_agent.md │ └── interview_guide.md │ ├── 需求.txt ├── Dockerfile#用于部署(后期) └── README.md
每个阶段都会填充更多的文件,这样文件夹结构就会逐渐与这张完整的图片相匹配。
______________________________________________________________________
3.第1阶段——最小FastAPI后端
目标: 确认后端可以启动并响应一个简单的请求。
3.1在第一阶段创建的文件
app/main.pyapp/__init__.pyagents/__init__.pyrag/__init__.pymcp_servers/__init__.pyrequirements.txtREADME.md
3.2代码(第1阶段)
app/main.py (第一阶段版本)为:
从fastapi导入fastapi
FastAPI应用实例 app=FastAPI(标题=“DevGraph复制品-第1阶段”)
@app.get(“/”) 异步定义read_root(): 返回{ “消息”:“DevGraph Copilot后端正在运行(第1阶段)”, “next_steps”:\[ “添加LangGraph状态图”, “添加基本RAG管道”, “集成MCP工具” \] }
3.3如何运行第一阶段
从项目根: uvicorn app.main:应用程序--reload
在浏览器中打开:
- http://127.0.0.1:8000
预期JSON(第1阶段): { “消息”:“DevGraph Copilot后端正在运行(第1阶段)”, “next_steps”:\[ “添加LangGraph状态图”, “添加基本RAG管道”, “集成MCP工具” \] }
如果你看到这个反应,那么第一阶段正在发挥作用。
______________________________________________________________________
4.第2阶段–LangGraph骨架
目标: 将最小的LangGraph图连接到FastAPI后端。
4.1第2阶段的新文件/更新文件
app/config.py–基本设置(应用程序名称、环境)。agents/graph_state.py–图形的共享状态定义。agents/graph_builder.py–带有规划器和回声节点的最小LangGraph图。app/main.py–更新为:
- 显示“第二阶段” / - 添加 POST /api/chat 使用LangGraph的端点。
4.2状态和节点(当前)
GraphState 领域:
user_input:来自API的原始消息。message_type:简单分类(例如。,"question"或"statement").reply:最终回复文本。
节点:
planner_node:
- 倒像 user_input. - 集合 message_type 到 "question" 如果它以 ?,否则 "statement".
echo_node:
- 倒像 user_input 和 message_type. - 写 reply 包括两者。
图形流程: 开始->规划节点->回声节点->结束
4.3新终点—— POST /api/chat
请求正文: { “message”:“你好” }
响应(示例): { “reply”:“LangGraph的回声(type=语句):你说了->你好” }
它是如何工作的(简短):
- FastAPI在中接收请求
/api/chat. - 它创建了一个初始
GraphState随着user_input. - 它调用编译后的LangGraph
graph_app. planner_node套message_type.echo_node读取user_input和message_type并写道reply.- 最终状态作为HTTP响应返回。
4.4测试双节点流
- 重新启动服务器:
uvicorn app.main:应用程序--reload
- 打开Swagger:http://127.0.0.1:8000/docs
- 测试
POST /api/chat:
- 主体:
{“留言”:“你好吗?”}
预期: { “回复”:“LangGraph的回声(类型=问题):你说->你好吗?” }
- 主体:
{“message”:“这是一个声明”}
预期: { “reply”:“LangGraph的回声(type=statement):你说->这是一个语句” }
这证明:
- 状态正在流经多个节点。
- 规划师写道
message_type,echo读到了。
______________________________________________________________________
5.第3阶段——RAG骨架(仅设置)
目标: 为RAG组件创建基本文件(还没有真正的LLM)。
5.1第3阶段的新文件(骨架)
rag/chunking.py
simple_line_chunker(text: str) -> List[str>–琐碎的基于行的分块器。
rag/embeddings.py
dummy_embedding(text: str) -> List[float]–基于长度的虚假嵌入。
embed_chunks(chunks: List[str]) -> List[List[float]].
rag/vectorstore.py
InMemoryVectorStore–内存中存储块和假嵌入。
add(chunks, embeddings)和search(query_embedding, top_k=3).
5.2现状
这些模块尚未连接到图形或API中。\ 它们是使第3阶段集成更容易的占位符。
______________________________________________________________________
6.第一阶段和第二阶段总结
第一阶段
- 基本的FastAPI应用程序
GET /返回第1阶段JSON。 requirements.txt,virtualenv,最小的项目结构。
第2阶段(加上小型2节点升级)
app/config.py随着Settings.agents/graph_state.py定义GraphState(user_input,message_type,reply).agents/graph_builder.py使用LangGraphStateGraph:- 节点:
planner_node → echo_node. - 流量:
START → planner_node → echo_node → END. app/main.py已更新:- 根
/显示“第二阶段”。 - 新
POST /api/chat端点使用graph_app.invoke.
已创建(但尚未使用)RAG骨架文件:
rag/chunking.pyrag/embeddings.pyrag/vectorstore.py
如果 / 返回第2阶段JSON和 POST /api/chat 返回正确的回声 type=question/statement,您已经完全完成了这些阶段,并准备开始连接真正的RAG和更多的代理。
______________________________________________________________________
5.3第3阶段——将假RAG连接到图形中
- 扩展的
GraphState随着retrieved_chunks. - 添加
agents/ingestion_helper.py:
- 全球 InMemoryVectorStore 用示例文本初始化。
- 更新
agents/graph_builder.py:
- 现在绘图: START -> planner_node -> code_qa_node -> END. - code_qa_node: - 嵌入 user_input 使用 dummy_embedding. - 搜索 InMemoryVectorStore. - 写 retrieved_chunks 和一个 [Fake RAG] 回答。
/api/chat现在返回由检索到的片段组成的回复。
现在,你真正拥有了这两样东西: 当USE_LLM=false或OPENAI_API_KEY为空时: 仅RAG模式,完全本地。 当USE_LLM=true并且设置了有效密钥时: RAG+在线法学硕士答案。
如何在实践中使用它 仅运行RAG(无API)
- 在.env中:
USE_LLM=假 OPENAI_API密钥=
- 重新启动:
uvicorn app.main:应用程序--reload
- POST/api/聊天→ 您将看到使用本地嵌入+向量存储的\[RAG only\]响应。
运行RAG+LLM
- 在.env中:
USE_LLM=真 OPENAI_API_KEY=sk-。..您的_real_key。.. LLM_MODEL_NAME=gpt-4o-mini#或提供程序的型号id
- 重新启动:
uvicorn app.main:应用程序--reload
- POST/api/聊天→ 您将看到使用本地嵌入+向量存储+在线LLM的\[RAG+LLM\]响应。
