LlamaIndex 框架中的一个 高级多轮对话引擎——CondensePlusContextChatEngine

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 改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值