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