know-engine

问题重写支持多轮对话

✅如何针对用户的问题做重写? 我们之前介绍过很多问题重写的方案以及要解决的问题,包括分解、富化、多样化、回溯提示等等。都是很有用的方法,但是实际在应用时,我们并不会让每一个改写都处理一遍,至少不会每一个方案都调用一次LLM,那样就太…

TL;DR

✅如何针对用户的问题做重写? 我们之前介绍过很多问题重写的方案以及要解决的问题,包括分解、富化、多样化、回溯提示等等。都是很有用的方法,但是实际在应用时,我们并不会让每一个改写都处理一遍,至少不会每一个方案都调用一次LLM,那样就太…

✅如何针对用户的问题做重写?

我们之前介绍过很多问题重写的方案以及要解决的问题,包括分解、富化、多样化、回溯提示等等。都是很有用的方法,但是实际在应用时,我们并不会让每一个改写都处理一遍,至少不会每一个方案都调用一次LLM,那样就太慢了。一般是组合处理的。 这几种重写方 LLMentor 前面讲了问题重写,主要做了简洁改写、抽象概念改写、错别字改写等。但是这种改写他只支持单轮对话中,在多轮对话场景中就gg了。 那么为了支持多轮对话,我们需要通过注入历史对话上下文 的方式让 LLM 在改写时能理解多轮对话的语境。 在 KnowEngineQueryTransformer 实现中,首先提示词要改,增加关于上下文融合的提示词:

...
5、结合历史对话和最新提问,识别出所有相关的细节、术语和上下文信息。最后,将这条提问重新组织成一个清晰、简洁且独立完整的格式,以便于进行信息检索。
...
上面是5种改写策略,需要逐一使用最终给出一个统一的改写结果。直接输出改写后的结果,不需要输出思考过程及额外的多余内容。如果不需要改写,则直接输出原问题即可。
...
### 历史对话内容
{{chatMemory}}

### 用户问题:
{{query}}


### 要求:
非常重要的一点是:你只需要提供重新组织后的提问,不要包含任何其他内容!绝对不要在提问前添加任何多余的文字!

在代码中增加如下代码,来获取并替换提示词中的chatMemory

List<ChatMessage> chatMemory = query.metadata().chatMemory();
String response = chatModel.chat(createPrompt(query, format(chatMemory)).text());
protected Prompt createPrompt(Query query, String chatMemory) {
    Map<String, Object> variables = new HashMap<>();
    variables.put("query", query.text());
    variables.put("chatMemory", chatMemory);
    return promptTemplate.apply(variables);
}
版本提示

模型、框架与接口会持续变化。涉及版本号、参数与生产配置时,请在实践前对照对应官方文档。

LLMentor系统化学习大模型应用工程

内容来自个人课程知识库备份,并经过结构化整理。技术版本持续演进,生产使用前请结合官方文档验证。