from llama_index.core.chat_engine import CondensePlusContextChatEngine
从 llama_index.core.chat_engine
这个模块中,导入了一个聊天引擎类:CondensePlusContextChatEngine
。
✅ 什么是 CondensePlusContextChatEngine
?
这是 LlamaIndex 框架中的一个 高级多轮对话引擎,它的核心功能是:
在用户提问时,先自动总结当前聊天历史,再结合检索到的上下文信息一起传入 LLM(大语言模型)进行回答。
它是下面这两个功能的组合:
功能 | 描述 |
---|---|
💡 Condense Question | 自动把“用户带历史的 follow-up 问题”转换成一个独立完整的问题(例如 “他是谁?” → “Elon Musk 是谁?”) |
🔍 Plus Context | 在提问时,会结合向量索引中检索出来的上下文,比如 PDF、网页、文档内容等 |
📌 所以这个引擎特别适合问答系统中的 带历史记忆 + 文档知识问答 场景。
✅ 运行流程图(简化版)
用户问题 + 聊天历史
↓
[Condense] → 转换为完整问题
↓
[Context Retrieval] → 向量数据库检索文档片段
↓
[Final Prompt] → 把“重写后的问题 + 检索内容”拼到 prompt 里
↓
[LLM Answer] → 调用大模型,返回回答
✅ 示例代码
假设你已经构建好了 index
(索引),下面是怎么创建并使用这个引擎:
from llama_index.core import VectorStoreIndex
from llama_index.core.chat_engine import CondensePlusContextChatEngine
# 假设你已经有一个 index(向量索引)
index = VectorStoreIndex.from_documents(documents)
# 创建 Chat Engine
chat_engine = CondensePlusContextChatEngine.from_defaults(index=index)
# 开始对话(带记忆)
response = chat_engine.chat("乔布斯是哪一年出生的?")
print(response)
之后你可以继续调用 .chat(...)
实现多轮问答,它会自动带上历史消息,还会调用文档索引做上下文补充。
总结一句话:
CondensePlusContextChatEngine
是一个适合多轮对话的问答引擎,会“自动补全问题 + 利用文档上下文 + 聊天历史”,适合构建 RAG(Retrieval-Augmented Generation)类型的聊天机器人。
补充:
[Final Prompt] → 把“重写后的问题 + 检索内容”拼到 prompt 里
那么这里 " 重写后的问题 " 是怎么重写的呢?
🌱 总结:
“重写后的问题”是由大模型(LLM)根据当前用户提问 和之前的对话历史上下文,自动生成的一个完整、独立的问题句子。
这一步称为:
🔁 Condense Question(问题重写)
📌 为什么要重写问题?
在多轮聊天中,用户常说“他是谁?”、“那个公司还在吗?”、“继续说”——这些话如果脱离上下文,大模型无法理解:
举个例子:
用户第一问:乔布斯是谁?
用户第二问:他什么时候去世的?
我们不能直接拿“他什么时候去世的?”去检索知识或者问模型 —— 它根本不知道“他”是谁。
所以我们要把它自动转换成:
“乔布斯是什么时候去世的?”
这样模型才能准确回答!
🛠️ 怎么实现的?
在 CondensePlusContextChatEngine
中,这一步由一个专门的 Prompt Template + LLM 完成。
🔨 主要函数:
from llama_index.core.chat_engine.condense import CondenseQuestionAgent
它内部使用了一个提示词(prompt),示例大致如下:
Given the following conversation history and a follow-up question,
rewrite the follow-up question to be a standalone question.
Chat History:
User: 乔布斯是谁?
Assistant: 他是苹果公司创始人之一...
Follow-up question:
他什么时候去世的?
Rewritten standalone question:
乔布斯是什么时候去世的?
这个 prompt 会发送给大语言模型(比如 OpenAI GPT-3.5/4,或者你自己的模型),然后模型生成一个 可独立理解的问题。
✏️ 实际例子:
假设用户对话历史是:
User: 请告诉我 OpenAI 的 CEO 是谁?
Assistant: 是 Sam Altman。
User: 他之前是做什么的?
那么 condense 后的提问就是:
Sam Altman 之前是做什么的?
🔄 工作流程在代码中的体现:
在 CondensePlusContextChatEngine
中,这一步由 CondenseQuestionAgent
自动处理,具体你可以查看这个类:
from llama_index.core.chat_engine.condense import CondenseQuestionAgent
你也可以自定义 condense 逻辑,比如换成中文 prompt、换 LLM、调整历史上下文数量等。
🧠 记忆点
名词 | 作用 |
---|---|
CondenseQuestionAgent | 负责把“模糊问题”转换成“清晰独立问题” |
CondensePlusContextChatEngine | 整合了 Condense + 上下文检索 + 聊天引擎 |
“重写问题” | 是 RAG 成功的第一步:让模型能看懂你到底问什么 |
我们也可以看它内部的源码自己动手改对prompt 改进。