如何基于Replit DB实现虚拟Therapist电话对话跨会话记忆?
实现虚拟心理咨询师的对话记忆方案(基于Replit DB)
核心逻辑梳理
每次来电时,通过Twilio获取来电手机号作为唯一标识,从Replit DB读取该号码的历史对话;将历史对话与本次用户输入拼接后传给ChatGPT,生成回复;通话结束后,把本次对话追加到该号码的记录中,实现跨会话的记忆功能。
分步实现代码与说明
1. 获取来电手机号(Twilio请求解析)
Twilio触发的来电请求会携带来电号码,用Flask即可快速提取:
from flask import Flask, request from replit import db import os import openai app = Flask(__name__) # 用Replit Secrets存储API密钥,避免硬编码 openai.api_key = os.getenv("OPENAI_API_KEY") @app.route("/incoming-call", methods=["POST"]) def handle_call(): # 提取Twilio传入的来电号码(格式为带国家码的字符串,如+86138xxxxxxx) caller_number = request.form.get("From") # 后续对话逻辑写在这里 return "OK", 200
2. 设计对话存储结构
不要用纯字符串存储,改用角色+内容的列表字典结构,适配ChatGPT的messages参数格式:
# 示例存储结构(自动序列化/反序列化,Replit DB直接支持) conversation_history = [ {"role": "user", "content": "我最近工作压力好大"}, {"role": "assistant", "content": "能具体说说压力主要来自哪些方面吗?"} ]
3. 读取历史对话
每次来电先检查DB中是否存在该号码的记录,无则初始化空列表:
# 读取历史对话,不存在则创建空列表 if caller_number in db: history = db[caller_number] else: history = []
4. 传递历史对话给ChatGPT
将历史对话与本次用户输入拼接后调用API,实现上下文延续:
# 假设user_input是Whisper转录的用户语音文本 user_input = "最近天天加班到凌晨,身体也吃不消" # 追加本次用户输入到历史 history.append({"role": "user", "content": user_input}) # 调用ChatGPT,直接传入包含历史的messages参数 response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=history ) # 提取助理回复并追加到历史 assistant_reply = response.choices[0].message["content"] history.append({"role": "assistant", "content": assistant_reply})
5. 保存更新后的对话到DB
通话结束(或每轮交互后),将更新后的历史记录存回DB:
# 覆盖原记录,保存最新对话历史 db[caller_number] = history
新手必看注意事项
- 密钥安全:所有API密钥(OpenAI、Twilio、ElevenLabs)都要存在Replit左侧栏的「Secrets」中,用
os.getenv("密钥名称")读取,绝对不能硬编码。 - 号码格式一致性:不要修改Twilio返回的号码格式(如删除+号),否则同一个用户的号码会被识别为不同键,导致历史记录错乱。
- 上下文长度限制:ChatGPT有token数量上限(gpt-3.5-turbo为4096),对话过长会触发报错,可简单截断历史:
# 只保留最近20条消息(10轮对话),避免超出限制 if len(history) > 20: history = history[-20:] - DB测试:可在Replit Shell中直接测试DB读写,比如输入
from replit import db,然后db['+86138xxxxxxx'] = [{"role":"user","content":"测试"}],再print(db['+86138xxxxxxx'])验证功能。
内容的提问来源于stack exchange,提问作者Alessandro David
相关产品推荐
相关产品推荐

