【项目实训8】基于上下文的记忆化功能上线
—— written by Unalome (2025.06.09)
本次优化主要针对对话上下文的记忆功能,添加相关代码后实现了查询时对上下问的关联,对真实的对话场景有更好的表现力。
一、追问意图识别机制
在对话系统中,用户的后续提问往往依赖于历史对话内容(如“请举个例子”)。为实现对这类追问的精准处理,系统需通过关键词匹配机制识别用户的追问意图类型(如详细说明、简化解释等)。这一机制为后续提示词构建提供了意图分类依据,是上下文记忆化的起点。
def classify_follow_up_intent(self, query: str) -> Optional[str]:
detail_keywords = ["详细", "更多信息", "再讲一遍", "补充", "继续", "扩展", "深入", "再说一遍", "重复一下"]
simplify_keywords = ["通俗一点", "简单一点", "简略一点", "别太专业", "小白解释", "用比喻", "用例子", "别用术语"]
example_keywords = ["举个例子", "具体点", "案例", "实例"]
summary_keywords = ["总结", "概括", "归纳"]
pronoun_keywords = ["它", "它们", "那些", "这个", "那个", "这些", "这点", "那点"]
query = query.lower()
def contains_keyword(q, keywords):
return any(k in q for k in keywords)
if contains_keyword(query, simplify_keywords):
return "simplify"
elif contains_keyword(query, detail_keywords):
return "detail"
elif contains_keyword(query, example_keywords):
return "example"
elif contains_keyword(query, summary_keywords):
return "summary"
elif contains_keyword(query, pronoun_keywords):
return "pronoun"
return None
解析:
- 功能:通过关键词匹配识别用户的追问意图类型。
- 实现细节:
- 关键词分类:定义了5类追问意图(详细说明、简化解释、举例、总结、代词指代),每类对应一组关键词。
- 模糊匹配:将用户输入转换为小写后,使用
contains_keyword检查是否包含任一类关键词。 - 优先级处理:关键词匹配顺序决定了意图优先级(如简化 > 详细)。
- 作用:为后续构建上下文提示词提供意图类型,例如用户问“用例子说明”,系统会识别为
example类型。
二、上下文存储与传递
上下文记忆化的核心在于存储最近生成的内容,以便后续查询时复用。系统通过 _last_generation_result 变量记录最近一次生成结果,使得后续追问能够基于上文内容动态调整响应策略。这一机制解决了多轮对话中上下文丢失的问题。
_last_generation_result = None
解析:
- 功能:存储最近一次生成的文本内容,作为后续查询的上下文。
- 作用场景:
- 当用户提出追问时(如“详细说明上文”),系统会从
_last_generation_result中获取上文内容。
- 当用户提出追问时(如“详细说明上文”),系统会从
- 实现细节:
- 在流式生成结束后更新值(见(四)的代码)。
- 若为空,则返回错误信息(“当前没有可用的上文信息”)。
三、追问意图的提示词构建
在识别用户追问意图后,系统需结合上文内容动态构建提示词。这一过程通过拼接 _last_generation_result 的上下文与当前问题实现,确保生成内容与历史对话紧密相关。例如,用户问“总结上文”,系统会基于上文内容生成摘要。
follow_up_type = engine.classify_follow_up_intent(query)
processed_query = chinese_text_processor(query)
generation_result = "" # 用于拼接最终生成内容
if follow_up_type:
context = engine._last_generation_result if engine._last_generation_result else ""
if not context:
yield "data: 当前没有可用的上文信息\n"
yield "data: [DONE]\n"
return
if follow_up_type == "detail":
prompt = f"基于以下内容,请进一步详细说明:\n{context}\n问题: {processed_query}"
elif follow_up_type == "simplify":
prompt = f"请用更简单易懂的语言解释以下内容:\n{context}\n问题: {processed_query}"
elif follow_up_type == "example":
prompt = f"请基于以下内容举一个具体例子:\n{context}\n问题: {processed_query}"
elif follow_up_type == "summary":
prompt = f"请对以下内容进行简要总结:\n{context}\n问题: {processed_query}"
elif follow_up_type == "pronoun":
prompt = f"基于以下内容,请解释‘{processed_query}’所指的具体内容:\n{context}\n问题: {processed_query}"
解析:
- 功能:根据追问类型动态构建提示词,结合上下文生成针对性响应。
- 实现细节:
- 上下文拼接:将
_last_generation_result的上文内容与当前问题拼接为提示词模板。 - 意图适配:不同意图对应不同模板(如
detail强调扩展,simplify强调简化)。 - 流式输出:提示词通过
AsyncOpenAI调用模型并流式返回结果。
- 上下文拼接:将
四、生成结果的持久化更新
为支持多轮对话,系统需在每次生成后更新上下文存储。这一过程通过 engine._last_generation_result = generation_result.strip() 实现,确保后续追问始终基于最新的生成内容,形成上下文记忆的闭环。
engine._last_generation_result = generation_result.strip()
解析:
- 功能:将每次生成的内容保存到
_last_generation_result,供后续追问使用。 - 实现细节:
- 在流式生成结束后执行(
finally块中),确保即使出错也能更新状态。 - 使用
strip()去除首尾空格,避免干扰后续处理。
- 在流式生成结束后执行(
- 作用:
- 用户连续追问时,上下文始终基于最新生成内容更新(如多轮对话中逐步细化)。
这一机制显著提升了系统的对话连贯性与交互效率,尤其适用于需要多轮细化或关联推理的场景。

浙公网安备 33010602011771号