生成建议问
简介
在现代对话系统中,为了更好地满足用户需求,常常需要根据先前的对话上下文为用户生成一些后续的建议问题(suggestions),帮助用户更深入地与大模型或搜索引擎进行交互。本文将介绍如何基于大模型来生成这些建议问,并通过示例代码演示具体的实现方法和使用流程。
核心思路
预设 Prompt
提前编写一个 Prompt(suggestion_generator_prompt.txt
),用以向大模型描述具体的任务目标和输出格式。
该 Prompt 中指定了以下要点:- 需要生成 4-5 条建议问(suggestions)。
- 建议问需与对话上下文紧密相关,且对用户来说具有实用价值。
- 每条建议问需要具备中等长度、信息量适中并能够进一步引导用户与大模型的对话。
- 最终的输出格式需要用特定 XML 标签(
<suggestions>
和</suggestions>
)将所有建议问包裹起来。
对话上下文输入
在调用大模型进行生成时,会将先前的对话历史(histories
)一并传入,让大模型知道目前的对话场景和用户的意图。结果解析
生成完成后,需要对大模型返回的文本结果进行解析,从其中提取<suggestions>
标签中的内容(即建议问)。然后,将这些建议问返回或处理后用于后续的对话或界面展示。
代码实现
以下代码示例演示了如何结合大模型接口及预设 Prompt 来生成建议问,并将其应用到 Java 项目中。示例使用了自定义的 OpenAiClient
、ChatMessage
、ChatResponseVo
等类,分别实现大模型的请求、消息结构封装和响应解析等功能。
1. suggestion_generator_prompt.txt
You are an AI suggestion generator for an AI powered search engine. You will be given a conversation below. You need to generate 4-5 suggestions based on the conversation. The suggestion should be relevant to the conversation that can be used by the user to ask the chat model for more information.
You need to make sure the suggestions are relevant to the conversation and are helpful to the user. Keep a note that the user might use these suggestions to ask a chat model for more information.
Make sure the suggestions are medium in length and are informative and relevant to the conversation.
Provide these suggestions separated by newlines between the XML tags <suggestions> and </suggestions>. For example:
<suggestions>
Tell me more about SpaceX and their recent projects
What is the latest news on SpaceX?
Who is the CEO of SpaceX?
</suggestions>
Conversation:
该文件中规定了生成建议问所需的上下文,以及输出格式要求。大模型会根据其中的指令来返回相应的建议问。
2. SuggestionQuesionService
类
该类主要功能是调用大模型接口,并将预设好的 Prompt 与对话上下文拼接后发送给大模型,最终从返回的内容中抽取出建议问。
package com.litongjava.open.chat.services.ai;
import java.util.List;
import com.jfinal.template.Engine;
import com.litongjava.openai.chat.ChatMessage;
import com.litongjava.openai.chat.ChatResponseVo;
import com.litongjava.openai.client.OpenAiClient;
import com.litongjava.openai.constants.OpenAiModels;
import com.litongjava.tio.utils.tag.TagUtils;
public class SuggestionQuesionService {
private String prompt = Engine.use().getTemplate("suggestion_generator_prompt.txt").renderToString();
public String generate(List<ChatMessage> histories) {
// 调用大模型,传入模型名称、Prompt 与对话历史
ChatResponseVo chatResponseVo = OpenAiClient.chatComplections(OpenAiModels.gpt_4o_mini, prompt, histories);
String content = chatResponseVo.getChoices().get(0).getMessage().getContent();
// 使用 TagUtils 工具类从返回文本中提取 <suggestions> ... </suggestions> 内容
return TagUtils.extractSuggestions(content).get(0);
}
}
- Prompt 读取:使用
Engine
读取并渲染suggestion_generator_prompt.txt
文件内容。 - 向大模型发送请求:利用
OpenAiClient.chatComplections
方法,将模型名称、Prompt 与对话历史一起传递给大模型。 - 解析返回结果:大模型的返回结果会是一个包含若干回复选项的 JSON 对象。在这里通过
getChoices().get(0).getMessage().getContent()
获取到第一个回复的正文,然后调用TagUtils.extractSuggestions(content)
方法提取<suggestions>
标签中的建议问并返回给调用方。
3. SuggestionQuesionServiceTest
测试类
下面演示如何在单元测试中使用 SuggestionQuesionService
来生成建议问。示例通过 histories.add(ChatMessage.buildUser("How was the professor Tong Li"));
的方式模拟用户的一次对话输入,查看大模型给出的建议问输出。
package com.litongjava.open.chat.services.ai;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.open.chat.config.EnjoyEngineConfig;
import com.litongjava.openai.chat.ChatMessage;
import com.litongjava.tio.utils.environment.EnvUtils;
public class SuggestionQuesionServiceTest {
@Test
public void test() {
// 加载环境变量或配置信息
EnvUtils.load();
// 配置模板引擎
new EnjoyEngineConfig().config();
// 构造一段对话历史
List<ChatMessage> histories = new ArrayList<>();
histories.add(ChatMessage.buildUser("How was the professor Tong Li"));
// 调用 SuggestionQuesionService 进行建议问生成
String generate = Aop.get(SuggestionQuesionService.class).generate(histories);
// 输出结果
System.out.println(generate);
}
}
运行测试后,控制台可能会输出类似以下内容:
What are some notable contributions of Professor Tong Li in their field?
Can you provide a biography or background information on Professor Tong Li?
What are the key research areas that Professor Tong Li specializes in?
What is the impact of Professor Tong Li's work on their academic community?
Are there any famous publications or works by Professor Tong Li that I should know about?
这些建议问有助于用户进一步了解对话主题,或深入挖掘教授的研究方向、成就以及相关文献,从而丰富后续的交互体验。
示例输出解读
通过上述实现,最终我们可以得到一批符合指定格式、与对话内容密切相关的建议问。用户可以基于这些问题向大模型发起新的请求,进行更深入的探讨。此外,开发者或前端也可将这些建议问以合适的方式展示给用户,帮助引导或提示用户进行更有价值的后续对话。
总结
在对话系统或搜索系统中生成建议问的关键要点是:上下文理解 + 明确的任务指令 + 预期格式化输出。
通过预先编写并封装一个合适的 Prompt,将对话历史和格式化要求一起传递给大模型,再配合解析流程从文本中提取最终结果,就能轻松实现“自动生成建议问”这一功能。此做法既能提升用户体验,也为进一步挖掘用户需求与提供个性化服务奠定了基础。