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接口供前端调用。
importosfromdotenvimportload_dotenvfromflaskimportFlask,request,jsonifyfromflask_corsimportCORSfromlangchain_openaiimportChatOpenAI# 如果你用其他模型,可改为 ChatAnthropicfromdeepagentsimportcreate_deep_agentfromdeepagents.middlewareimportSubAgentMiddlewarefromlangchain_core.toolsimporttool load_dotenv()# ---------- 配置模型(使用通义千问或 OpenAI 兼容服务)----------api_key=os.getenv("DASHSCOPE_API_KEY")base_url=os.getenv("DASHSCOPE_BASE_URL")ifnotapi_keyornotbase_url:# 如果没有配置 DashScope,尝试用 Anthropicapi_key=os.getenv("ANTHROPIC_API_KEY")ifnotapi_key:raiseValueError("请设置 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)----------@tooldefget_weather(city:str)->str:"""获取指定城市的天气(模拟)"""returnf"🌤️{city}今天天气晴朗,气温 22°C,适合出行。"# ---------- 构建 Deep Agent ----------# create_deep_agent 会自动包含:计划、委派、批评、最终确定四步流程# 同时内置了 execute 和 write_file 工具,并自动添加了两个子智能体:researcher 和 criticdeep_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"])defchat():data=request.get_json()user_message=data.get("message","")ifnotuser_message:returnjsonify({"error":"消息不能为空"}),400try:# 调用 deep agent(使用 invoke,它会完整执行 plan->delegate->...->finalize)response=deep_agent.invoke({"messages":[("user",user_message)]})# 提取最后一条 AI 消息的内容final_message=response["messages"][-1].contentreturnjsonify({"response":final_message})exceptExceptionase:returnjsonify({"error":str(e)}),500if__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)
与之前相似,提供简洁的聊天界面。
<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="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 12pxrgba(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><divclass="chat-container"><divclass="messages"id="messages"><divclass="message assistant-message"><divclass="bubble assistant-bubble">👋 你好!我是深度智能体,支持计划、委派、批评和最终解答。试试问我“西安天气”或“分析一下人工智能的未来趋势”。</div></div></div><divclass="input-area"><inputtype="text"id="userInput"placeholder="输入消息..."onkeypress="handleKeyPress(event)"><buttonid="sendBtn">发送</button></div></div><script>constmessagesDiv=document.getElementById('messages');constuserInput=document.getElementById('userInput');constsendBtn=document.getElementById('sendBtn');constAPI_URL='http://127.0.0.1:5000/chat';functionaddMessage(content,isUser){constmessageDiv=document.createElement('div');messageDiv.className=`message${isUser?'user-message':'assistant-message'}`;constbubble=document.createElement('div');bubble.className=`bubble${isUser?'user-bubble':'assistant-bubble'}`;bubble.textContent=content;messageDiv.appendChild(bubble);messagesDiv.appendChild(messageDiv);messagesDiv.scrollTop=messagesDiv.scrollHeight;}functionshowLoading(){constloadingDiv=document.createElement('div');loadingDiv.id='loading';loadingDiv.className='loading';loadingDiv.textContent='🤔 深度思考中(计划→委派→批评→最终回答)...';messagesDiv.appendChild(loadingDiv);messagesDiv.scrollTop=messagesDiv.scrollHeight;}functionhideLoading(){constloadingDiv=document.getElementById('loading');if(loadingDiv)loadingDiv.remove();}asyncfunctionsendMessage(){constmessage=userInput.value.trim();if(!message)return;userInput.value='';addMessage(message,true);showLoading();try{constresponse=awaitfetch(API_URL,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:message}),});hideLoading();if(!response.ok){consterrorData=awaitresponse.json();addMessage(`❌ 错误:${errorData.error||'请求失败'}`,false);return;}constdata=awaitresponse.json();addMessage(data.response,false);}catch(error){hideLoading();addMessage(`❌ 网络错误:${error.message}`,false);}}functionhandleKeyPress(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-xxxxxx4. 依赖文件 (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 安装:
pipinstallgit+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` 版本**(手动模拟计划-委派-批评流程),请告诉我,我可以再给你一套备选方案。