首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Agent 全栈开发实战:构建智能助手从后端到前端

Agent 全栈开发实战:构建智能助手从后端到前端

原创
作者头像
资源大佬 jzit-top
发布2026-08-24 13:34:15
发布2026-08-24 13:34:15
410
举报

Agent 全栈开发实战:构建智能助手从后端到前端

随着大语言模型(LLM)能力的增强,AI Agent 成为新一代应用的核心形态。Agent 能够理解用户意图、规划任务、调用外部工具并返回结果。本文将使用 LangChain + FastAPI + React 构建一个全栈智能助手,展示 Agent 开发的完整技术链路。

一、系统架构

代码语言:javascript
复制
用户浏览器(React) 
    ↓ HTTP/WebSocket
FastAPI 后端 
    ↓ 调用
LangChain Agent(核心推理循环)
    ↓ 按需调用
工具(天气查询、计算器、数据库查询)

前端负责交互界面,后端提供 API 并管理 Agent 生命周期,Agent 通过 LangChain 实现工具调用与多步推理。

二、后端实现:LangChain Agent + FastAPI

首先安装依赖:

代码语言:javascript
复制
pip install langchain langchain-openai fastapi uvicorn python-dotenv

定义工具(以天气查询和计算器为例):

代码语言:javascript
复制
from langchain.tools import Tool
from langchain_community.utilities import OpenWeatherMapAPIWrapper
import requests

# 自定义计算工具
def calculator(expression: str) -> str:
    try:
        result = eval(expression)  # 生产环境应使用安全解析
        return f"计算结果: {result}"
    except Exception as e:
        return f"计算错误: {str(e)}"

calculator_tool = Tool(
    name="Calculator",
    func=calculator,
    description="当需要进行数学计算时使用,输入数学表达式字符串"
)

# 天气查询工具(需设置OPENWEATHERMAP_API_KEY)
weather = OpenWeatherMapAPIWrapper()
weather_tool = Tool(
    name="Weather",
    func=weather.run,
    description="当询问天气时使用,输入城市名称"
)

tools = [calculator_tool, weather_tool]

初始化 Agent:

代码语言:javascript
复制
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
import os
from dotenv import load_dotenv

load_dotenv()

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个乐于助人的智能助手,可以使用工具来回答问题。"),
    ("user", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad"),
])

agent = create_openai_tools_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

创建 FastAPI 端点:

代码语言:javascript
复制
from fastapi import FastAPI
from pydantic import BaseModel
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

class Query(BaseModel):
    message: str

@app.post("/api/chat")
async def chat(query: Query):
    try:
        response = agent_executor.invoke({"input": query.message})
        return {"reply": response["output"]}
    except Exception as e:
        return {"reply": f"出错了: {str(e)}"}

启动后端:

代码语言:javascript
复制
uvicorn main:app --reload --port 8000

三、前端实现:React 对话界面

使用 Vite 初始化 React 项目并安装 axios:

代码语言:javascript
复制
npm create vite@latest client -- --template react
cd client && npm install axios

修改 App.jsx

代码语言:javascript
复制
import React, { useState } from 'react';
import axios from 'axios';

function App() {
  const [messages, setMessages] = useState([]);
  const [input, setInput] = useState('');
  const [loading, setLoading] = useState(false);

  const sendMessage = async () => {
    if (!input.trim()) return;
    const userMsg = { role: 'user', content: input };
    setMessages([...messages, userMsg]);
    setInput('');
    setLoading(true);
    try {
      const res = await axios.post('http://localhost:8000/api/chat', {
        message: input
      });
      setMessages([...messages, userMsg, { role: 'assistant', content: res.data.reply }]);
    } catch (err) {
      setMessages([...messages, userMsg, { role: 'assistant', content: '请求失败,请稍后重试' }]);
    }
    setLoading(false);
  };

  return (
    <div style={{ maxWidth: '600px', margin: '0 auto', padding: '20px' }}>
      <h1>AI 智能助手</h1>
      <div style={{ height: '400px', overflowY: 'auto', border: '1px solid #ccc', padding: '10px' }}>
        {messages.map((msg, idx) => (
          <div key={idx} style={{ textAlign: msg.role === 'user' ? 'right' : 'left', margin: '5px' }}>
            <span style={{ background: msg.role === 'user' ? '#007bff' : '#f1f1f1', color: msg.role === 'user' ? '#fff' : '#000', padding: '8px', borderRadius: '8px', display: 'inline-block' }}>
              {msg.content}
            </span>
          </div>
        ))}
        {loading && <div>思考中...</div>}
      </div>
      <div style={{ display: 'flex', marginTop: '10px' }}>
        <input
          style={{ flex: 1, padding: '8px' }}
          value={input}
          onChange={(e) => setInput(e.target.value)}
          onKeyPress={(e) => e.key === 'Enter' && sendMessage()}
          placeholder="请输入问题..."
        />
        <button onClick={sendMessage} style={{ padding: '8px 15px' }}>发送</button>
      </div>
    </div>
  );
}

export default App;

启动前端:

代码语言:javascript
复制
npm run dev

访问 http://localhost:5173,即可与 Agent 对话。例如输入“北京今天天气怎么样?”Agent 会调用天气工具;输入“计算 25*4+10”,Agent 会调用计算器。

四、关键设计要点

  1. 工具描述至关重要:工具的 description 必须清晰说明何时使用、输入格式,否则 LLM 可能不调用或调用错误。
  2. 错误处理:Agent 执行工具可能失败,需要在工具内部捕获异常并返回可读信息,避免整个流程中断。
  3. 安全防护:生产环境应使用安全的表达式解析库(如 numexpr 或自定义解析器),避免 eval 注入风险。
  4. 状态管理:本示例为无状态对话,实际应用可引入会话管理,使用 ConversationBufferMemory 保存上下文。
  5. 性能优化:长时间运行的工具应异步执行,或使用 WebSocket 流式返回结果,提升用户体验。

五、扩展方向

  • 接入向量数据库实现私有知识问答(RAG)
  • 添加数据库工具进行业务数据查询
  • 使用 LangGraph 实现更复杂的多步工作流
  • 部署时使用 Docker + Nginx 进行容器化和反向代理

总结

本文构建了一个完整的 AI Agent 全栈应用,从工具定义、Agent 推理到前后端交互,展示了核心开发模式。掌握这些技术后,开发者可以快速将 Agent 能力集成到自己的产品中,无论是智能客服、数据分析助手还是自动化办公工具。Agent 全栈开发正成为下一波应用开发的主流范式,值得深入实践。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • Agent 全栈开发实战:构建智能助手从后端到前端
    • 一、系统架构
    • 二、后端实现:LangChain Agent + FastAPI
    • 三、前端实现:React 对话界面
    • 四、关键设计要点
    • 五、扩展方向
    • 总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档