型 AI Agent 直到就業(yè)——第十八天)
1. 今日目標(biāo)今天是前端轉(zhuǎn)型 AI Agent 的第十八天。經(jīng)過前十七天的學(xué)習(xí)我們已經(jīng)掌握了 Python 基礎(chǔ)、LangChain 核心概念、Agent 工作流設(shè)計等關(guān)鍵知識。今天的目標(biāo)是打通從本地 Agent 原型到可部署服務(wù)的最后一公里完成一個能對外提供 API 服務(wù)的 Agent 應(yīng)用并理解部署上線的基本流程。2. 回顧與定位在開始今天的內(nèi)容之前先快速回顧一下前十七天的學(xué)習(xí)路徑第 1-5 天Python 語法、虛擬環(huán)境、依賴管理完成前端思維到后端思維的初步轉(zhuǎn)換第 6-10 天LangChain 基礎(chǔ)、Prompt 工程、模型調(diào)用封裝第 11-15 天Agent 核心機(jī)制ReAct、Tool Calling、記憶管理、多工具編排第 16-17 天構(gòu)建了一個本地可運行的 Agent 原型具備聯(lián)網(wǎng)搜索和簡單問答能力今天我們要做的就是把第 17 天完成的本地原型改造成一個可以通過 HTTP 接口訪問的服務(wù)。3. 為什么需要服務(wù)化本地腳本和線上服務(wù)之間隔著幾個關(guān)鍵差異并發(fā)處理本地腳本一次只能服務(wù)一個請求線上服務(wù)需要同時處理多個用戶請求接口標(biāo)準(zhǔn)化前端調(diào)用后端需要統(tǒng)一的 RESTful API 或 WebSocket 協(xié)議狀態(tài)管理Agent 的多輪對話需要會話隔離不同用戶不能互相干擾可觀測性線上環(huán)境需要日志、監(jiān)控、錯誤追蹤而不是簡單的 print作為前端開發(fā)者我們對 HTTP 協(xié)議、JSON 序列化、異步請求這些概念并不陌生這恰恰是服務(wù)化改造中最大的優(yōu)勢。4. 技術(shù)選型我們選擇FastAPI作為 Web 框架原因如下性能優(yōu)秀基于 Starlette 和 Pydantic異步原生支持上手簡單對前端開發(fā)者友好裝飾器風(fēng)格類似 Express自動文檔內(nèi)置 Swagger UI調(diào)試方便類型提示與 Python 類型系統(tǒng)完美結(jié)合減少運行時錯誤安裝依賴pipinstallfastapi uvicorn5. 改造本地 Agent 為 API 服務(wù)5.1 項目結(jié)構(gòu)調(diào)整將原來的單文件腳本拆分為清晰的項目結(jié)構(gòu)agent-service/ ├── app/ │ ├── __init__.py │ ├── main.py # FastAPI 入口 │ ├── agent.py # Agent 核心邏輯 │ ├── schemas.py # 請求/響應(yīng)模型 │ └── session.py # 會話管理 ├── requirements.txt └── .env5.2 定義請求與響應(yīng)模型# app/schemas.pyfrompydanticimportBaseModelfromtypingimportOptionalclassChatRequest(BaseModel):message:strsession_id:Optional[str]NoneclassChatResponse(BaseModel):reply:strsession_id:strusage:Optional[dict]None5.3 封裝 Agent 調(diào)用# app/agent.pyfromlangchain.agentsimportAgentExecutorfromlangchain.memoryimportConversationBufferMemoryclassAgentService:def__init__(self):self.memory_map{}self.agentself._build_agent()def_build_agent(self):# 復(fù)用第 17 天構(gòu)建的 Agent 邏輯# 這里省略具體實現(xiàn)保持與之前一致passdefchat(self,message:str,session_id:str)-str:ifsession_idnotinself.memory_map:self.memory_map[session_id]ConversationBufferMemory()# 調(diào)用 Agent 并返回結(jié)果returnself.agent.invoke({input:message})5.4 創(chuàng)建 FastAPI 入口# app/main.pyfromfastapiimportFastAPIfromapp.schemasimportChatRequest,ChatResponsefromapp.agentimportAgentServiceimportuuid appFastAPI(titleAI Agent Service)agent_serviceAgentService()app.post(/chat,response_modelChatResponse)asyncdefchat(request:ChatRequest):session_idrequest.session_idorstr(uuid.uuid4())replyagent_service.chat(request.message,session_id)returnChatResponse(replyreply,session_idsession_id)app.get(/health)asyncdefhealth():return{status:ok}5.5 啟動服務(wù)uvicorn app.main:app--host0.0.0.0--port8000--reload啟動后訪問http://localhost:8000/docs即可看到自動生成的 API 文檔可以直接在頁面上測試接口。6. 前端如何對接作為前端開發(fā)者對接這個 API 非常自然// 前端調(diào)用示例asyncfunctionchatWithAgent(message,sessionId){constresponseawaitfetch(http://localhost:8000/chat,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify({message,session_id:sessionId})});returnresponse.json();}這里有幾個前端需要注意的點跨域問題開發(fā)環(huán)境需要配置 CORSFastAPI 中可通過CORSMiddleware解決流式輸出如果需要打字機(jī)效果可以改用StreamingResponse返回 SSE 流會話管理前端負(fù)責(zé)生成或保存session_id實現(xiàn)多輪對話的上下文延續(xù)7. 部署上線基礎(chǔ)本地跑通后下一步是部署到服務(wù)器。最輕量的方式是使用 DockerFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD [uvicorn, app.main:app, --host, 0.0.0.0, --port, 8000]構(gòu)建并運行dockerbuild-tagent-service.dockerrun-p8000:8000 agent-service8. 今日總結(jié)第十八天我們完成了從本地腳本到 API 服務(wù)的跨越。核心收獲理解了本地開發(fā)與線上服務(wù)的差異掌握了 FastAPI 的基本用法完成了 Agent 的服務(wù)化封裝打通了前端調(diào)用 Agent 的完整鏈路明天我們將深入流式輸出和 SSE 協(xié)議讓 Agent 的回復(fù)像 ChatGPT 一樣逐字輸出進(jìn)一步提升用戶體驗。9. 實踐作業(yè)將你第 17 天的 Agent 原型改造成 FastAPI 服務(wù)用 Postman 或前端頁面調(diào)用/chat接口驗證多輪對話嘗試在 FastAPI 中配置 CORS允許前端跨域訪問思考如果同時有 100 個用戶調(diào)用當(dāng)前實現(xiàn)會有什么問題