FastAPI 多轮对话实现指南:从场景基础到实战代码
1. 多轮对话的场景与基础多轮对话Multi-turn Dialogue是指用户与系统之间进行多次连续交互系统能够记住上下文并根据历史对话内容进行响应的能力。这是构建智能客服、聊天机器人、任务型助手等应用的核心。1.1 核心场景任务型对话用户分步骤完成一个复杂任务如订餐、订票系统需要记住用户已提供的信息如时间、地点、偏好。上下文问答用户基于前文进行追问如“上面提到的那个函数怎么用”系统需要理解指代关系。知识库聊天围绕一个主题进行深入探讨对话历史用于优化检索和生成质量。调试/故障排查技术客服逐步引导用户提供更多日志、截图等信息以定位问题。1.2 技术基础实现多轮对话通常需要解决以下三个核心问题会话管理如何为每个用户/对话创建独立的会话标识Session ID并存储和检索对应的对话历史。上下文维护如何组织、存储和传递历史消息通常为 [{role: user, content: ...}, {role: assistant, content: ...}] 格式。状态管理对于任务型对话如何维护对话状态Dialog State例如当前步骤、已填写的槽位Slots。2. 使用 FastAPI 实现多轮对话FastAPI 凭借其异步特性、高性能和简洁的依赖注入系统非常适合构建多轮对话 API。下面我们将分步骤实现一个完整的示例。2.1 项目结构与依赖首先创建项目并安装依赖mkdir fastapi-multiturn-chat cd fastapi-multiturn-chat python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install fastapi uvicorn python-dotenv redis创建requirements.txtfastapi0.104.1 uvicorn[standard]0.24.0 python-dotenv1.0.0 redis5.0.12.2 核心实现会话管理与存储我们使用 Redis 作为后端存储来维护会话和对话历史。创建app/main.pyfrom fastapi import FastAPI, HTTPException, Depends from pydantic import BaseModel from typing import List, Optional import redis import json import uuid from datetime import datetime, timedelta app FastAPI(title多轮对话 API) Redis 连接生产环境应使用连接池 redis_client redis.Redis(hostlocalhost, port6379, db0, decode_responsesTrue) 数据模型 class Message(BaseModel): role: str # user 或 assistant content: str class ChatRequest(BaseModel): session_id: Optional[str] None # 为空则创建新会话 message: str max_history: Optional[int] 10 # 保留的最大历史消息数 class ChatResponse(BaseModel): session_id: str response: str history: List[Message] 依赖项获取或创建会话 def get_or_create_session(session_id: Optional[str] None): if not session_id: session_id str(uuid.uuid4()) # 检查会话是否存在不存在则初始化 if not redis_client.exists(fsession:{session_id}): redis_client.setex(fsession:{session_id}, timedelta(hours24), json.dumps([])) return session_id 核心对话端点 app.post(/chat, response_modelChatResponse) async def chat(request: ChatRequest): 1. 会话管理 session_id get_or_create_session(request.session_id) 2. 获取历史 history_json redis_client.get(fsession:{session_id}) history json.loads(history_json) if history_json else [] 3. 添加用户新消息 user_msg {role: user, content: request.message} history.append(user_msg) 4. 模拟 AI 回复此处可替换为真实 LLM 调用 简单回复回显用户消息并提及历史长度 assistant_response f我已收到您的消息{request.message}。当前会话历史共有 {len(history)} 条消息。 assistant_msg {role: assistant, content: assistant_response} history.append(assistant_msg) 5. 限制历史长度 if request.max_history and len(history) request.max_history * 2: # 乘以2因为每条对话含user和assistant history history[-request.max_history * 2:] 6. 保存更新后的历史 redis_client.setex(fsession:{session_id}, timedelta(hours24), json.dumps(history)) return ChatResponse( session_idsession_id, responseassistant_response, history[Message(**msg) for msg in history] ) 获取会话历史 app.get(/session/{session_id}/history) async def get_history(session_id: str): history_json redis_client.get(fsession:{session_id}) if not history_json: raise HTTPException(status_code404, detailSession not found) return json.loads(history_json) 删除会话 app.delete(/session/{session_id}) async def delete_session(session_id: str): deleted redis_client.delete(fsession:{session_id}) if not deleted: raise HTTPException(status_code404, detailSession not found) return {message: Session deleted} if name main: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)2.3 运行与测试确保 Redis 服务已启动然后运行uvicorn app.main:app --reload --port 8000使用 curl 或 Postman 测试多轮对话# 第一轮创建新会话 curl -X POST http://localhost:8000/chat \ -H Content-Type: application/json \ -d {message: 你好我想了解FastAPI} 响应会返回 session_id例如{session_id: abc-123, response: ..., history: [...]} 第二轮使用上轮的 session_id 继续对话 curl -X POST http://localhost:8000/chat -H Content-Type: application/json -d { session_id: abc-123, message: 多轮对话怎么实现 }3. 进阶集成真实 LLM 与状态管理3.1 集成 OpenAI GPT安装 openai 库并修改/chat端点import openai import os from dotenv import load_dotenv load_dotenv() openai.api_key os.getenv(OPENAI_API_KEY) 在 /chat 端点中替换模拟回复部分 async def generate_with_gpt(history_messages): # 格式化历史消息为 OpenAI 格式 messages [ {role: msg[role], content: msg[content]} for msg in history_messages ] response await openai.ChatCompletion.acreate( modelgpt-3.5-turbo, messagesmessages, max_tokens500, temperature0.7 ) return response.choices[0].message.content/code/pre 3.2 任务状态管理 对于订餐等任务型对话可扩展会话存储以包含状态 class DialogState(BaseModel): current_step: str greeting slots: dict {} # 例如 {food_type: , quantity: 0, address: } 在 Redis 中存储状态 def update_dialog_state(session_id: str, state: DialogState): redis_client.setex( fstate:{session_id}, timedelta(hours24), state.json() ) 4. 生产环境注意事项 存储选择高并发场景考虑 Redis Cluster 或数据库如 PostgreSQL。 会话过期根据业务设置合理的 TTL如 30 分钟无活动后清除。 上下文窗口LLM 有 token 限制需设计历史摘要或滑动窗口策略。 安全性对用户输入进行过滤防止注入攻击会话 ID 应不可预测。 可观测性记录对话日志监控会话增长和 API 延迟。 5. 总结 通过 FastAPI 实现多轮对话的核心在于 为每个对话分配唯一的 session_id。 使用 Redis 等存储维护 session_id → 对话历史 的映射。 在每次请求中获取历史、添加新消息、调用 LLM、保存更新后的历史。 根据业务需求可扩展加入对话状态管理、历史摘要、流式响应等高级功能。 本文提供的代码是一个可直接运行的基础框架你可以在此基础上集成真实的 LLM 服务如 OpenAI、文心一言、通义千问并添加业务逻辑快速构建出功能完整的多轮对话应用。

相关新闻

抖音批量下载终极指南:免费工具一键搞定无水印视频

抖音批量下载终极指南:免费工具一键搞定无水印视频

抖音批量下载终极指南:免费工具一键搞定无水印视频 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…

2026/8/11 3:37:26 阅读更多 →
CORNERSPEED SUSPENSION × 2026金卡纳赛事|弯道即主场

CORNERSPEED SUSPENSION × 2026金卡纳赛事|弯道即主场

CORNERSPEED SUSPENSION 2026金卡纳赛事|弯道即主场 8月15日,佛山潭州国际会展中心将举办一场金卡纳赛事,现场将展示赛道级避震技术。参与者有机会近距离了解Racing Series竞技避震与I-1 Series单筒倒叉等产品。 该技术源自荷兰&#xff0…

2026/8/11 3:36:25 阅读更多 →
2026年3月.NET技术热点:MAUI整合、SQLSugar与工业物联网

2026年3月.NET技术热点:MAUI整合、SQLSugar与工业物联网

1. 2026年3月C#/.NET技术热点全景扫描2026年3月的第一周,.NET技术生态呈现出明显的多领域爆发态势。从最新的热词分布来看,三大主线尤为突出:首先是.NET Core 10.0的深度应用,特别是MAUI与Prism框架的整合方案成为企业级开发的新宠…

2026/8/11 3:36:25 阅读更多 →

最新新闻

中科大大数据学院保研实战:从核心课复习到面试策略的完整指南

中科大大数据学院保研实战:从核心课复习到面试策略的完整指南

1. 项目概述:一场关于选择与准备的硬仗又到了一年一度保研季的尾声,看着学弟学妹们开始在各大论坛上寻找经验贴,我不禁回想起自己两年前那段兵荒马乱的时光。我的背景是某中游985的计算机科学与技术专业,排名在10%左右&#xff0c…

2026/8/11 4:29:56 阅读更多 →
Raylib C++游戏开发入门:从零构建跨平台2D游戏原型

Raylib C++游戏开发入门:从零构建跨平台2D游戏原型

1. 项目概述:为什么选择 Raylib 开启你的 C 游戏之旅?如果你对 C 有一定了解,想亲手做出一个能跑起来的游戏,但又对 Unity、Unreal 这类重型引擎的复杂性和漫长的学习曲线感到望而却步,那么 Raylib 几乎是为这个场景量…

2026/8/11 4:29:56 阅读更多 →
Unity动态生成最小字体集:解决TMP中文显示模糊与乱码

Unity动态生成最小字体集:解决TMP中文显示模糊与乱码

1. 项目概述:为什么我们需要动态生成最小字体集?如果你在Unity项目里用过TextMeshPro(简称TMP)做中文本地化,大概率踩过这两个坑:一是字体边缘发虚、模糊,像蒙了一层雾;二是运行时突…

2026/8/11 4:29:56 阅读更多 →
Windows 10/11 系统下 Hadoop 3.1.3 伪分布式环境部署与配置实战指南

Windows 10/11 系统下 Hadoop 3.1.3 伪分布式环境部署与配置实战指南

1. 为什么在Windows上部署Hadoop是个技术活? 如果你是一名数据开发工程师或者大数据方向的学生,大概率已经习惯了在Linux服务器上鼓捣Hadoop。但很多时候,我们的第一台开发机就是Windows笔记本。直接在Windows上搭建一个Hadoop伪分布式环境&a…

2026/8/11 4:29:56 阅读更多 →
从提示工程到循环工程:AI应用开发范式的演进与实战

从提示工程到循环工程:AI应用开发范式的演进与实战

1. 项目概述:当AI开发从“指令”走向“循环”最近和几个圈内的老朋友聊天,话题总绕不开一个词:变味。不是指什么不好的变化,而是整个AI应用开发的范式,正在发生一种底层逻辑的迁移。过去一年,大家张口闭口都…

2026/8/11 4:29:56 阅读更多 →
编程基础:分支与循环结构深度解析与应用

编程基础:分支与循环结构深度解析与应用

1. 程序逻辑的基石:分支与循环的本质解析在编程世界里,分支和循环就像空气和水一样基础却不可或缺。我至今记得初学编程时,老师用交通信号灯比喻条件分支,用流水线作业解释循环结构——这种具象化的理解方式让我受益至今。作为程序…

2026/8/11 4:28:56 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →