AI智能体(Agent)大模型入门【6】--编写fasteAPI后端请求接口实现页面聊天

目录

前言

安装fastapi框架及初始化和部署

创建聊天接口的请求接口

示例代码(初版)

示例代码(升级版)

运行演示

后言


前言

根据之前的专栏文章,想必你也学习到了如何在编译软件内使用大模型对话了,我们现在需要在页面实现对话,那么就需要创建聊天的请求接口。

本篇章很简单,将会教学如何实现fastapi接口实现页面对话的请求接口。只写后端代码,不写前端界面,因为大语言模型的重要点都是在后端的请求接口和代码的处理上,前端可以使用ai辅助工具进行编写。

如果你是刚接触这篇文章的,对之前的内容不太了解,可以查看本专栏内的文章内容,或者点击该链接进行快速创建原始框架文件:AI智能体(Agent)大模型入门【2】--基于llamaindx部署本地的聊天模型。-CSDN博客

安装fastapi框架及初始化和部署

安装指令

bash 复制代码
pip install fastapi

光有fastapi框架的话还不行,还需要一个用来启动的服务部署模块

bash 复制代码
     pip install uvicorn

也可以通过一下指令进行两个快速安装。

bash 复制代码
     pip install fastapi uvicorn

初始化

python 复制代码
from fastapi import FastAPI, Form, UploadFile, File, Depends,Request
from fastapi.middleware.cors import CORSMiddleware
import uvicorn

需要导入以上的模块包

然后创建fastapi实例化对象及配置全局域

python 复制代码
app = FastAPI()

# 配置 CORS
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

创建服务启动

python 复制代码
if __name__ == '__main__':
    uvicorn.run(app, host="127.0.0.1", port=8060)

那么我们的fastapi也就初始化完成了,接下来就是创建聊天请求接口了

创建聊天接口的请求接口

关于对话的就是使用llamindex框架的几句话进行优化编写

也就是如何对这几句话进行处理和编写

不过目前还不需要你们编写文件和创建向量节点,所以总的来说你该如何创建聊天引擎和请求的方式来进行响应输出。

示例代码(初版)

我这里编写了请求代码的初版

python 复制代码
llm = qwen_llm()

class ChatRequest(BaseModel):
    message: str

class ChatResponse(BaseModel):
    reply: str
    
@app.post("/chat_post")
async def chat_post(request: ChatRequest):
    msg = ChatMessage(role="user", content=request.message)
    response = await llm.achat([msg])
    return ChatResponse(reply=response.message.content)    

没错就是导入聊天引擎,创建聊天请求类,然后进行接受,然后响应返回输出。

这代码很简单,但实际上我们页面传递的数据不可能是这么简单的处理,参考市面上的ai应用kimi,qwen,deepseek,我们还需要对传入的数据进行存储,以便于查看历史对话。

OK那么我们就需要使用mysql来进行聊天接口的升级。

示例代码(升级版)

关于数据库的链接和创建我就不赘述了,直接上代码

python 复制代码
class ChatRequest(BaseModel):
    session_id: int | None =  None
    message: str

class ChatResponse(BaseModel):
    session_id: int
    reply: str

@app.post("/chat_post")
async def chat_post(session_id: int | None = Depends(parse_session_id),
       message: str = Form(...)):
    """
    最基本的聊天模式请求,只调用了大模型,进行简单的会话处理
    不支持文件上传回答
    :param request:
    :return:
    """
    with closing(get_conn()) as conn:
        with conn.cursor() as cur:
            # --- 1. session ---
            if session_id is None:
                title = message[:15] + "..." if len(message) > 15 else message
                cur.execute("INSERT INTO ChatList (title) VALUES (%s)", (title,))
                session_id = cur.lastrowid

                # 对于新会话,也需要调用模型生成回复
                msg = ChatMessage(role="user", content=message)
                response = llm.chat([msg])
                reply = response.message.content

                # 保存用户消息
                cur.execute(
                    "INSERT INTO ChatHistory (chat_list_id, msg_seq, role, message) "
                    "VALUES (%s,%s,'user',%s)",
                    (session_id, 1, message)
                )

                # 保存助手回复
                cur.execute(
                    "INSERT INTO ChatHistory (chat_list_id, msg_seq, role, message) "
                    "VALUES (%s,%s,'assistant',%s)",
                    (session_id, 2, reply)
                )
            else:
                session_id = session_id

                # --- 2. seq ---
                cur.execute("SELECT MAX(msg_seq) mx FROM ChatHistory WHERE chat_list_id=%s", (session_id,))
                seq = (cur.fetchone()["mx"] or 0) + 1

                # --- 3. 用户消息 ---
                cur.execute(
                    "INSERT INTO ChatHistory (chat_list_id, msg_seq, role, message) "
                    "VALUES (%s,%s,'user',%s)",
                    (session_id, seq, message)
                )

                # --- 4. 调模型(同步方法) ---
                msg = ChatMessage(role="user", content=message)
                response = llm.chat([msg])
                reply = response.message.content

                # --- 5. 助手消息 ---
                cur.execute(
                    "INSERT INTO ChatHistory (chat_list_id, msg_seq, role, message) "
                    "VALUES (%s,%s,'assistant',%s)",
                    (session_id, seq + 1, reply)
                )
                cur.execute(
                    "UPDATE ChatList SET updated_at = NOW() WHERE id = %s",
                    (session_id,)
                )
            conn.commit()
    return ChatResponse(session_id=session_id, reply=reply)

代码很简单,在上一版的代码进行了升级,进行了角色的区分,以及插入的顺序啊,为之后的聊天读取什么的方式进行了预留。

运行演示

在fastapi的docs服务端页面,进行接口的调用

结果

后言

本篇幅很长,但是内容很简单,只是稍加理解就能实现,主要是对后续的思考和前端界面的对接需要考虑一扇门方式进行参数的传递,以及该对话接口是很初始的。需要思考如何进行对文件读取,以及依据文件来进行思考回答和处理,集中于后续的升级处理。

相关推荐
2601_95674368几秒前
上海GEO优化公司名单(2026年10月更新):GEO是什么业务、上海主流服务商盘点与选型避坑指南
大数据·人工智能·技术分享·geo·上海
倔强的石头1063 分钟前
Qwen系列解析_阿里巴巴大模型技术路线
人工智能·大模型
liuchangng17 分钟前
类Jev项目Kev从入门到实战(6):Jev / Kev / Laya 对比
人工智能·jev·kev
Rocky Ding*19 分钟前
深入浅出完整解析FLUX.2、Seedream(即梦)、Z-image、Qwen-Image、GLM-Image核心基础知识
论文阅读·人工智能·深度学习·机器学习·aigc·扩散模型·ai-native
能源革命24 分钟前
AI 日报 · 2026-10-05
人工智能
Ivanqhz34 分钟前
MLA、DSA、CSA、HCA
人工智能·算法·机器学习
网络毒刘35 分钟前
GPT-6.1 Sol 定位速读:成本效率型编码模型与「何时该换本地 Agent」
人工智能·gpt·openai·agent·cursor
后端小肥肠1 小时前
Claude Opus 5.5 做视频:从口播稿到成片,全流程跑通
人工智能·aigc·agent
网络毒刘1 小时前
Manual 模式精修补丁:在 Agent 提案后用最小编辑完成高风险改动
安全·agent·ai编程·cursor
VIP_CQCRE1 小时前
在 Visual Studio 里接入 Ace Data Cloud:让 LMLocal 调用 OpenAI 兼容模型
openai·ai编程·开发工具·visual studio·ace data cloud