
一、学习路线梳理多轮对话背景知识、基础工作原理动手编写多轮对话入门 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有效管理上下文为构建更复杂的对话系统奠定了基础。