【项目实训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() 去除首尾空格,避免干扰后续处理。
  • 作用
    • 用户连续追问时,上下文始终基于最新生成内容更新(如多轮对话中逐步细化)。

这一机制显著提升了系统的对话连贯性与交互效率,尤其适用于需要多轮细化或关联推理的场景。

posted @ 2025-06-10 12:54  Unalome  阅读(58)  评论(0)    收藏  举报