day 2:RAG 快速原型实现计划
Deep Agents Template 的高级功能**(规划、委派、批评子智能体、写文件等)和前端 HTTP 调用的能力。
下面我为你整合一个完整的项目,基于 deepagents 库(LangChain 的深度智能体模板),外加 Flask 包装层和前端聊天界面。这样你既得到了 deep agent 的强大工作流,又能通过浏览器与它交互。
最终项目结构
my_deep_agent/
├── .env # API Key 配置
├── requirements.txt # 依赖列表
├── app.py # Flask 后端 + deep agent 逻辑
├── static/
│ └── index.html # 前端聊天界面
└── README.md # 运行说明
1. 后端代码 (app.py)
这里使用 deepagents 的 create_deep_agent,保留其内置的 plan、delegate、critique、finalize 流程,并添加两个默认子智能体(研究员和批评家)。然后通过 Flask 暴露 /chat 接口供前端调用。
import os
from dotenv import load_dotenv
from flask import Flask, request, jsonify
from flask_cors import CORS
from langchain_openai import ChatOpenAI # 如果你用其他模型,可改为 ChatAnthropic
from deepagents import create_deep_agent
from deepagents.middleware import SubAgentMiddleware
from langchain_core.tools import tool
load_dotenv()
# ---------- 配置模型(使用通义千问或 OpenAI 兼容服务)----------
api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = os.getenv("DASHSCOPE_BASE_URL")
if not api_key or not base_url:
# 如果没有配置 DashScope,尝试用 Anthropic
api_key = os.getenv("ANTHROPIC_API_KEY")
if not api_key:
raise ValueError("请设置 DASHSCOPE_API_KEY 或 ANTHROPIC_API_KEY")
# 模型初始化(这里以 DashScope 兼容 OpenAI 为例)
llm = ChatOpenAI(
model="qwen-plus",
temperature=0.7,
api_key=api_key,
base_url=base_url,
model_kwargs={"extra_body": {"enable_thinking": False}}
)
# 如果你使用 Anthropic Claude,改为:
# from langchain_anthropic import ChatAnthropic
# llm = ChatAnthropic(model="claude-3-5-sonnet-20241022", temperature=0.7)
# ---------- 自定义工具(类似 get_weather)----------
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气(模拟)"""
return f"🌤️ {city} 今天天气晴朗,气温 22°C,适合出行。"
# ---------- 构建 Deep Agent ----------
# create_deep_agent 会自动包含:计划、委派、批评、最终确定四步流程
# 同时内置了 execute 和 write_file 工具,并自动添加了两个子智能体:researcher 和 critic
deep_agent = create_deep_agent(
model=llm,
tools=[get_weather], # 你可以添加更多自定义工具
system_prompt="""你是一个智能助手,负责计划、委派、批评并最终回答用户问题。
如果用户询问需要搜索或分析的信息,可以委派给 researcher 子智能体;
如果用户询问需要批判性分析,可以委派给 critic 子智能体。
你也可以直接调用 get_weather 工具回答天气问题。""",
# 可选:自定义子智能体
# sub_agents=[...]
)
# ---------- Flask 应用 ----------
app = Flask(__name__)
CORS(app) # 允许前端跨域
@app.route("/chat", methods=["POST"])
def chat():
data = request.get_json()
user_message = data.get("message", "")
if not user_message:
return jsonify({"error": "消息不能为空"}), 400
try:
# 调用 deep agent(使用 invoke,它会完整执行 plan->delegate->...->finalize)
response = deep_agent.invoke({"messages": [("user", user_message)]})
# 提取最后一条 AI 消息的内容
final_message = response["messages"][-1].content
return jsonify({"response": final_message})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
注意:
deepagents库需要单独安装,它依赖langgraph和一些中间件。如果create_deep_agent的签名与上述不同,请查阅 deepagents 文档。上面的代码假设create_deep_agent接受model,tools,system_prompt等参数,并内置子智能体。
2. 前端代码 (static/index.html)
与之前相似,提供简洁的聊天界面。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>深度智能体助手</title>
<style>
body { font-family: system-ui; max-width: 800px; margin: 2rem auto; padding: 0 1rem; background: #f5f7fb; }
.chat-container { background: white; border-radius: 1rem; box-shadow: 0 4px 12px rgba(0,0,0,0.1); display: flex; flex-direction: column; height: 70vh; overflow: hidden; }
.messages { flex: 1; padding: 1.5rem; overflow-y: auto; display: flex; flex-direction: column; gap: 1rem; }
.message { display: flex; gap: 0.5rem; }
.user-message { justify-content: flex-end; }
.assistant-message { justify-content: flex-start; }
.bubble { max-width: 70%; padding: 0.75rem 1rem; border-radius: 1.5rem; line-height: 1.4; }
.user-bubble { background: #007aff; color: white; border-bottom-right-radius: 0.25rem; }
.assistant-bubble { background: #e9e9ef; color: black; border-bottom-left-radius: 0.25rem; }
.input-area { display: flex; gap: 0.5rem; padding: 1rem; border-top: 1px solid #ddd; background: white; }
input { flex: 1; padding: 0.75rem; border: 1px solid #ccc; border-radius: 2rem; font-size: 1rem; }
button { background: #007aff; color: white; border: none; border-radius: 2rem; padding: 0 1.25rem; cursor: pointer; }
button:hover { background: #005fc1; }
.loading { text-align: center; color: #666; font-style: italic; margin: 0.5rem 0; }
</style>
</head>
<body>
<div class="chat-container">
<div class="messages" id="messages">
<div class="message assistant-message">
<div class="bubble assistant-bubble">👋 你好!我是深度智能体,支持计划、委派、批评和最终解答。试试问我“西安天气”或“分析一下人工智能的未来趋势”。</div>
</div>
</div>
<div class="input-area">
<input type="text" id="userInput" placeholder="输入消息..." onkeypress="handleKeyPress(event)">
<button id="sendBtn">发送</button>
</div>
</div>
<script>
const messagesDiv = document.getElementById('messages');
const userInput = document.getElementById('userInput');
const sendBtn = document.getElementById('sendBtn');
const API_URL = 'http://127.0.0.1:5000/chat';
function addMessage(content, isUser) {
const messageDiv = document.createElement('div');
messageDiv.className = `message ${isUser ? 'user-message' : 'assistant-message'}`;
const bubble = document.createElement('div');
bubble.className = `bubble ${isUser ? 'user-bubble' : 'assistant-bubble'}`;
bubble.textContent = content;
messageDiv.appendChild(bubble);
messagesDiv.appendChild(messageDiv);
messagesDiv.scrollTop = messagesDiv.scrollHeight;
}
function showLoading() {
const loadingDiv = document.createElement('div');
loadingDiv.id = 'loading';
loadingDiv.className = 'loading';
loadingDiv.textContent = '🤔 深度思考中(计划→委派→批评→最终回答)...';
messagesDiv.appendChild(loadingDiv);
messagesDiv.scrollTop = messagesDiv.scrollHeight;
}
function hideLoading() {
const loadingDiv = document.getElementById('loading');
if (loadingDiv) loadingDiv.remove();
}
async function sendMessage() {
const message = userInput.value.trim();
if (!message) return;
userInput.value = '';
addMessage(message, true);
showLoading();
try {
const response = await fetch(API_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message: message }),
});
hideLoading();
if (!response.ok) {
const errorData = await response.json();
addMessage(`❌ 错误: ${errorData.error || '请求失败'}`, false);
return;
}
const data = await response.json();
addMessage(data.response, false);
} catch (error) {
hideLoading();
addMessage(`❌ 网络错误: ${error.message}`, false);
}
}
function handleKeyPress(event) {
if (event.key === 'Enter') sendMessage();
}
sendBtn.addEventListener('click', sendMessage);
</script>
</body>
</html>
3. 环境变量 (.env)
根据你使用的模型提供者填写:
# 使用阿里云 DashScope(兼容 OpenAI)
DASHSCOPE_API_KEY=sk-xxxxxx
DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
# 或者使用 Anthropic
# ANTHROPIC_API_KEY=sk-ant-xxxxxx
4. 依赖文件 (requirements.txt)
flask==3.0.3
flask-cors==4.0.1
python-dotenv==1.0.1
langchain-openai==0.1.20 # 如果用 dashscope
# langchain-anthropic==0.1.20 # 如果用 anthropic
deepagents>=0.1.0 # 这个包可能还在开发,请使用最新版
# 注意:deepagents 会自动安装 langgraph 等依赖
安装命令:
pip install -r requirements.txt
如果 deepagents 包尚未在 PyPI 发布,你可能需要从 GitHub 安装:
pip install git+https://github.com/langchain-ai/deepagents.git
(具体请查阅 deepagents 官方文档)
5. 运行说明 (README.md)
# 深度智能体 + 前端调用
本整合项目基于 Deep Agents Template,通过 Flask 提供 HTTP API,前端可以聊天调用深度智能体(计划→委派→批评→最终回答)。
## 快速开始
1. 安装依赖
```bash
pip install -r requirements.txt
-
配置 API Key
在.env中填入你的 DASHSCOPE_API_KEY 或 ANTHROPIC_API_KEY。 -
启动后端
python app.py服务运行在 http://0.0.0.0:5000
-
打开前端
用浏览器打开static/index.html文件。 -
测试
在聊天框输入问题,例如“西安天气怎么样?”或“分析一下人工智能对教育的影响”。
注意事项
- 第一次调用可能较慢,因为 deep agent 会进行多轮内部推理。
- 你可以修改
app.py中的get_weather工具,或添加更多自定义工具。 - 该模板继承了 deep agent 的
execute、write_file能力,可以在对话中让 agent 执行代码或写入文件。
---
## 6. 验证工作
1. **启动后端**后,打开前端,输入“西安天气”。
- 预期:智能体会调用 `get_weather` 工具,返回天气信息。
2. 输入“写一个 Python 脚本打印 hello world”。
- 预期:deep agent 可能会使用 `execute` 工具运行代码(取决于模型决策)。
3. 输入“研究一下 LangChain 的最新进展”。
- 预期:agent 可能会委派给 `researcher` 子智能体,然后返回总结。
---
## 如果 `deepagents` 包不可用怎么办?
如果 `deepagents` 库尚未公开或安装失败,你可以退而使用 `langgraph` 的 `create_react_agent` 并手动实现“计划-委派-批评”流程。但为了体验模板的完整功能,建议先去 [LangChain Deep Agents 官方仓库](https://github.com/langchain-ai/deepagents) 查看最新安装方式。
---
## 总结
- 你得到一个**独立的项目**,不是覆盖原有 README,而是新建一个基于 deep agent 的完整应用。
- 后端使用 `create_deep_agent`,保留了模板的规划、委派、批评、最终确定能力。
- 前端通过 HTTP 调用,与深度智能体对话。
- 你可以在此基础上任意扩展工具和子智能体。
如果你在安装 `deepagents` 时遇到问题,或者希望我提供一个**纯 `langgraph` 版本**(手动模拟计划-委派-批评流程),请告诉我,我可以再给你一套备选方案。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)