聊天向量化
免责声明
使用本扩展并不保证带来更好的聊天体验或任何形式的记忆改善。仅在你充分理解使用向量数据库的全部影响时才使用。
聊天向量化会在当前聊天记录中搜索与你最近消息看似相关的消息。它会临时将这些最相关的消息移动到聊天记录的开头或结尾。此操作发生在生成模型对你上一条消息的回复时。
聊天记录开头和结尾的消息通常对模型的回复影响最大。因此,将相关消息移动到这些位置,有助于模型在回复时聚焦于相关信息。
尤其是,聊天向量化能够找到那些在消息历史中位置过于靠后、无法放入请求上下文的相关消息。将这些消息移入上下文,可以为模型提供原本无法获取的信息。
聊天向量化是一种检索增强生成(RAG)。检索增强生成通过在提示词中提供额外的相关信息,来提升模型生成回复的质量。
- 检索:使用最近的消息来检索相关的过往消息
- 增强:以有用的方式插入过往消息,从而增强模型的上下文
- 生成:指示模型在生成回复时使用这些过往消息
一些术语:
向量(vector) 是一组数字,可以表示一段文本的主题、内容、风格或其他特征。
向量化(Vectorization) 是计算表示一段文本的向量的过程。这由向量化模型来完成。正如文本生成模型从文本生成文本一样,向量化模型从文本生成向量。
向量搜索(Vector search) 通过比较向量而非关键词等方式来查找相关结果。如果我们计算出搜索查询的向量,就可以将它与一组文本片段所存储的向量进行比较。这能找出集合中与搜索查询文本最相似的文本。在聊天向量化的场景中,"搜索查询"是最近的 2 条消息,而"集合中的文本"是聊天中的所有其他消息。
设置
提示词缓存兼容性
与任何动态提示词来源(世界书、摘要等)一样,聊天向量化会在 LLM 调用之间重组提示词前缀,这可能导致频繁的缓存未命中。与缓存配合使用时,向量化往往适得其反,因为修改后的提示词极少命中缓存——实际上令缓存形同虚设。你只能在两者中二选一,不可兼得。
要启用聊天向量化,请选择 "Extensions" > "Vector Storage" > "Enabled for chat messages"。
配置向量化来源和向量化模型。聊天向量化使用与数据银行相同的向量来源,因此你可能已经配置过。Vectorization Source 和 Vectorization Model 的设置说明请参阅数据银行。
聊天向量化使用与数据银行相同的向量存储,但这一项无需单独设置或配置。关于向量存储的更多信息也可在数据银行中找到。
聊天向量化不会使用数据银行来存储聊天消息。消息存储在对话中。
为搜索准备聊天消息(向量存储)
为了能够搜索聊天消息,每条消息都会计算一个向量并存储起来。
每当发送或接收消息时,向量化都会在后台进行。
每条消息都单独存储,以便在生成时能够单独找到并移动。
大消息会被拆分为多个"块",以便向模型提供长消息中最相关的部分。块大小为 400 个字符。你可以通过 "Chunk size (chars)" 修改此值。
消息会通过查找分块边界(如段落分隔、换行或单词间的空格)来拆分为块。这是为了让所有块尽可能都是有意义的内容。如果你的聊天消息有其他标记自然切分点的方式(例如 ----),可以将其添加到 "Chunk boundary" 中。"Chunk boundary" 的设置与数据银行共享。
向量存储控制项
要为当前对话中的所有消息计算向量,而无需等待它们在后台处理,请从设置中选择 "Vectorize All"。
要查看当前对话中有多少消息已被向量化,请选择 "View Stats"。它会显示已存储向量的总数,还会通过绿色圆球标记具体哪些聊天消息已被向量化。
要删除当前对话中消息的所有向量,请选择 "Purge Vectors"。
聊天向量化中的 "Vectorize All" 和 "Purge Vectors" 控制项仅影响当前对话已存储的向量。但文件向量化中也有相同的按钮,会影响数据银行中文件的向量。请确保你清除的是你打算清除的向量。
查找要移动的相关消息(向量检索)
要查找聊天历史中最相关的消息,会将最近的消息转换(向量化)为一个查询向量。默认使用最近的 2 条消息。要修改此值,请更改 "Query messages" 的值。该值也用于从数据银行查找相关内容。
过往消息的相关度分数必须至少达到 25% 才会被纳入。你可以通过 "Score threshold" 修改此值。分数阈值的设置与数据银行共享。
聊天历史中最相关的 3 条消息会被移动。你可以通过 "Insert#" 修改此值。
为避免打扰对话中最近的事件,最近的 5 条消息不会被移动。要修改此值,请更改 "Retain#" 的值。
移动消息(增强生成)
消息会被移动到以下 3 个位置之一:
- 对话顶部,位于 Main Prompt / Story String 之后(默认)
- 对话顶部,且位于 Main Prompt / Story String 之前
- 对话末尾,在最后 2 条消息之前("In-chat @ Depth 2")。由于你刚发送了一条消息,此位置通常就在模型上一条回复之前。
你可以通过 "Injection Position" 和 "Depth" 修改此设置。
消息按相关度顺序纳入,相关度更高的消息显示在相关度较低的消息之后。
每条消息都会包含发送者(人物或角色)的名称。
消息会以"过往事件"的形式展示给模型。这有助于模型理解这些消息包含的信息来自聊天历史中不同于其插入位置的时间点。你可以通过 "Injection Template" 修改此设置。
你可以通过提示词分项弹窗、终端日志或浏览器控制台日志查看最终发给模型的提示词。浏览器控制台日志有助于理解聊天向量化各个步骤的具体行为。
向量摘要
向量摘要旨在使聊天消息的向量搜索更有效。它通过在向量化之前引入一个摘要步骤来实现这一点。摘要步骤会提取消息中最重要的部分,使生成的向量更能指示消息所涉及的内容。
向量摘要也可能使向量搜索效果变差。
要对聊天历史中的消息进行摘要,并为每条摘要后的消息生成向量,请选择 "Summarize chat messages for vector generation"。
摘要后的消息不会替换对话中的原始消息。如果向量搜索匹配到某条摘要消息的向量,则会从聊天历史中检索原始消息并将其移入上下文。消息的摘要版本会保留在向量存储中,这对调试可能有用。
要对用于搜索聊天历史的消息内容(默认为最后 2 条消息)进行摘要,请选择 "Summarize chat messages when sending"。
每次为向量化而对消息进行摘要时,都会向摘要模型发起一个单独的请求。你可以通过 "Summarize with" 选择使用哪个摘要来源。选择 "Main API" 将使用你用于生成聊天或文本补全的相同模型和连接设置来生成摘要。
该请求由原始消息内容以及关于模型应如何生成摘要的指令组成。你可以通过 "Summary Prompt" 修改该指令。