大模型多轮对话功能开发全过程
一、学习路线梳理多轮对话背景知识、基础工作原理动手编写多轮对话入门 Demo使用 Redis 完成对话消息持久化保存聊天记录开发核心接口创建会话、会话列表、发送消息、查询历史消息多轮对话逻辑优化滑动窗口 历史消息压缩解决上下文 token 过长问题提示词组成原理、提示词工程实战二、核心代码片段FastAPI Redis简易示例1. Redis 存储聊天消息消息持久化import redis import json from typing import List, Dict # 连接本地Redis部署到服务器后修改host redis_client redis.Redis( host127.0.0.1, port6379, db0, decode_responsesTrue ) # 保存单条聊天消息 def save_message(session_id: str, role: str, content: str): :param session_id: 会话唯一ID :param role: user / assistant :param content: 对话内容 msg_item json.dumps({ role: role, content: content }) # 列表存储有序保存对话 redis_client.rpush(fchat:session:{session_id}, msg_item) # 获取会话全部历史消息 def get_history(session_id: str) - List[Dict]: raw_list redis_client.lrange(fchat:session:{session_id}, 0, -1) return [json.loads(item) for item in raw_list] # 清空某个会话历史 def clear_history(session_id: str): redis_client.delete(fchat:session:{session_id})# 连接redisr redis.Redis(host127.0.0.1, port6379, db0, decode_responsesTrue)保存消息 将对话放到我们定义的列表中将2. 创建会话、获取会话列表简单接口新建会话本质就是生成唯一 ID每一个聊天窗口对应一个 session_id。from fastapi import FastAPI import uuid from redis_util import redis_client app FastAPI(title多轮对话学习Demo) # 创建新会话 app.post(/session/create) def create_new_session(): session_id str(uuid.uuid4()) return { code: 200, msg: 创建会话成功, data: {session_id: session_id} } # 获取当前所有会话列表 app.get(/session/list) def get_session_list(): # 匹配所有会话key all_keys redis_client.keys(chat:session:*) session_ids [k.replace(chat:session:, ) for k in all_keys] return { code: 200, data: session_ids }3.发送消息 查询历史对话接口实现用户提问拼接历史上下文传给大模型拿到回复并存入 Redisfrom redis_util import save_message, get_history import openai # 配置大模型API密钥 openai.api_key 你的key openai.base_url 模型接口地址 # 查询会话历史消息 app.get(/chat/history/{session_id}) def query_chat_history(session_id: str): history get_history(session_id) return {code: 200, data: history} # 用户发送消息获取AI回复 app.post(/chat/send) def send_message(session_id: str, user_content: str): # 1. 保存用户消息 save_message(session_id, user, user_content) # 2. 读取完整历史 history get_history(session_id) # 3. 请求大模型 resp openai.ChatCompletion.create( modelgpt-3.5-turbo, messageshistory ) ai_reply resp[choices][0][message][content] # 4. 保存AI回复 save_message(session_id, assistant, ai_reply) return { code: 200, reply: ai_reply }调用大模型 将我们前面输出的内容全部放到redis缓存中 这样对话输出的时候可以直接从redis中来获取我们回答的数据 以此实现对话的效果4 滑动窗口优化限制上下文长度重点直接把所有历史传给大模型存在严重问题对话轮次越多上下文越长token 消耗飙升甚至超出模型最大上下文限制。 课程提供两种方案滑动窗口截断 历史消息摘要压缩。 先实现简易滑动窗口只保留最近 N 轮对话。def get_window_history(session_id: str, max_round: int 6): 滑动窗口只保留最近max_round轮问答 full_history get_history(session_id) if len(full_history) max_round: return full_history # 截取末尾最新消息 return full_history[-max_round:]二、知识点学习总结多轮对话的原理1.大模型本身没有记忆能力所谓的上下文就是将历史记录放大redis中 然后再从redis中去获取之前的记录来实现上下文联动的效果的我们将每条用户的问题 以及 ai的回答每次成功后编组 发送到redis中 记录单挑的回答 最后将redis整个数据输出出来一个列表 就能看见什么时候问的什么问题 ai的回答内容了2.提示词的重要性同样的提问系统提示词不同AI 回答风格、准确性差距非常明显。学习了提示词基础组成角色定义、任务要求、输出格式、约束条件。后续还需要持续练习提示词工程。3.消息存储ai无法存储那么多数据的时候 就可以用到我们的临死数据库 redis———————————————————————————————————————————本文介绍了一个基于FastAPI和Redis的多轮对话系统实现方案。主要内容包括1学习路线从多轮对话原理到Redis消息持久化再到接口开发和优化2核心代码实现使用Redis存储聊天记录提供创建会话、发送消息、查询历史等接口3性能优化采用滑动窗口和历史消息压缩解决token过长问题4关键知识点大模型无记忆需依赖外部存储提示词工程的重要性以及Redis作为临时数据库的优势。该系统实现了基本的对话功能并通过Redis有效管理上下文为构建更复杂的对话系统奠定了基础。

相关新闻

从商品推荐到 Agent:RAG 与长期记忆为什么都像一套召回排序系统

从商品推荐到 Agent:RAG 与长期记忆为什么都像一套召回排序系统

做商品推荐时,我们面对的是一个经典问题:商品很多,但用户在当前时刻真正感兴趣的只有少数几个。系统需要从海量商品中找出候选,过滤无效内容,按用户兴趣排序,并通过后续点击和购买持续修正结果。 RAG 和 Ag…

2026/10/13 7:26:48 阅读更多 →
别再死记复杂度!手把手带你推导所有经典案例 —数据结构壹

别再死记复杂度!手把手带你推导所有经典案例 —数据结构壹

你好,我是林森lsjs 我的Github 地址:sqyCoder (Qiyang) GitHub 以博文记录成长,用心打磨代码与思维 目录 一、集合类引入 1.与数据结构的联系 二、时间复杂度 1.概念 2.计算 1.1 例1:O (N) 1.2 例2:O(MN) 1.3…

2026/10/13 7:27:10 阅读更多 →
RK3568笔记131:正点原子RK3568开发板蓝牙音箱完整实现指南

RK3568笔记131:正点原子RK3568开发板蓝牙音箱完整实现指南

若该文为原创文章,转载请注明原文出处。 一、前言 基于正点原子RK3568开发板的硬件平台,结合BlueALSA音频桥接方案,将开发板打造成一个功能完整的蓝牙音箱。实现手机蓝牙连接、A2DP音频播放,并优化了音质与连接稳定性。 技术架构 二、环境确认 项目 信息 开发板 正点原子…

2026/9/23 8:23:20 阅读更多 →

最新新闻

C盘爆红不用慌:用Codex定位AppData 87.8GB占用并安全清理

C盘爆红不用慌:用Codex定位AppData 87.8GB占用并安全清理

C盘爆红是个老话题了,但每次有人遇到还是会慌,尤其是系统提示“磁盘空间不足”的那一刻,电脑卡顿、软件闪退、保存文件失败一起涌过来,非常糟心。我这次遇到的更离谱——C盘只剩不到2GB可用空间,整个系统处于随时可能罢…

2026/10/13 7:27:03 阅读更多 →
SpringBoot实战:从零搭建一套滑雪场管理系统毕业设计完整方案

SpringBoot实战:从零搭建一套滑雪场管理系统毕业设计完整方案

作为给多届毕业设计学生看过代码、也亲手维护过几个业务系统的人,我听到“滑雪场管理系统”这个题目时的第一反应是:终于有人不从图书管理系统里选题了。滑雪场的日常运营链条足够长——线上购票、现场核销、雪具租赁、押金结算、教练预约、会员储值、日…

2026/10/13 7:27:03 阅读更多 →
PyCharm 本地接入 DeepSeek:基于 CodeGPT 与 Ollama 的离线 AI 编码实践

PyCharm 本地接入 DeepSeek:基于 CodeGPT 与 Ollama 的离线 AI 编码实践

简介:这份PDF资料面向希望提升编码效率的Python开发者与AI工具爱好者,聚焦于将本地部署的DeepSeek大模型接入PyCharm这一实用场景,帮助读者在保证数据安全的前提下获得智能代码生成辅助。资源包内含1个PDF文件,大小约1.44MB&#…

2026/10/13 7:27:03 阅读更多 →
CodeWhisperer免费AI编程助手:代码补全、安全扫描与使用指南

CodeWhisperer免费AI编程助手:代码补全、安全扫描与使用指南

前两天刷动态,看到实时 AI 编程助手 Amazon CodeWhisperer 对个人开发者免费开放的消息,第一反应是“又来一个试用噱头”。但真正把插件装上、在 VS Code 里写了半小时代码之后,我承认这次确实香。CodeWhisperer 不是那种给你补个变量名、自动…

2026/10/13 7:27:03 阅读更多 →
不止是文本工具:Antigravity编辑器项目管理中枢实战

不止是文本工具:Antigravity编辑器项目管理中枢实战

这个系列写到这里,终于轮到编辑器了。前几篇我们聊了环境准备、项目描述文件、构建流程和部署配置,都是偏“管道”层面的内容,真正让我每天对着屏幕敲上几个小时的是这一篇要讲的编辑器。Antigravity 体系里的编辑器不是普通的文本工具&#…

2026/10/13 7:27:03 阅读更多 →
网上宠物店系统实战:SpringBoot+Vue3+MyBatis前后端分离部署

网上宠物店系统实战:SpringBoot+Vue3+MyBatis前后端分离部署

做这套网上宠物店系统,起因其实挺简单——有位做校园实训项目的朋友问我要一套完整的前后端分离案例,既要有电商的业务逻辑,又要覆盖主流技术栈。想着与其临时拼凑,不如把平时积累的东西整理成一套能跑、可扩展的系统。于是就有了…

2026/10/13 7:26:02 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →