生成问题标题
一、背景介绍
在问答系统或对话系统中,需要将用户的问题或请求进行简短的概括(尤其用于标题或列表显示),但同时要遵循一定的限制(如字数限制、禁用某些词)。而针对并非真正问题的情况(如纯文本写作需求或简单的招呼问候),我们又希望能够统一返回某个占位值以标识此类请求无需生成相应的短标题。
为此,我们引入了一个简单而有效的做法:通过一个预先设计好的提示词模版(Prompt),由大模型(如 OpenAI 的 GPT 系列模型)来生成符合我们需求的简短概括或返回 not_needed
。
二、核心思路
Prompt 设计
- 我们在
summary_question_prompt.txt
文件中,编写了非常具体的指令(Prompt),指示大模型要生成一个 3-5 个单词的短语,且不能包含“title”这一单词。 - 如果发现用户输入并非问题,而是类似写作或打招呼等场景,需要直接返回
not_needed
。
- 我们在
限制条件
- 3-5 个单词的短语。
- 不允许出现“title”一词。
- 对于非问题情况返回
not_needed
。
输入与输出示例
- 示例输入:
What is the first day of sjsu in Fall 2024
- 示例输出:
Fall 2024 Start Date
- 示例输入:
三、汇总提示词
summary_question_prompt.txt
Create a concise, 3-5 word phrase as a header for the above query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title'
If it is a writing task or a simple hi, hello rather than a question, you need to return `not_needed` as the response.
Question: #(query)
Summary:
四、执行流程
渲染模板 通过
Engine
渲染模板文件summary_question_prompt.txt
,将用户输入(question
)填充到预先设计好的 Prompt 中。模型推理 将渲染后的 Prompt 发送给大模型(如 OpenAI 的 ChatGPT、GPT-3.5/4 等)进行推理,获取模型返回的结果。
结果处理
- 若模型返回
not_needed
,则说明当前输入不是需要生成简短标题的问题,而是写作或招呼等场景;因此我们直接把原始问题返回或做其他逻辑处理。 - 若返回的并非
not_needed
,则将模型返回内容作为最终的简短概括。
- 若模型返回
五、代码实现与说明
以下展示了 SummaryQuestionService
的核心实现,该类通过整合模板渲染和大模型推理,完成对用户问题的简短概括功能。
package com.litongjava.open.chat.services;
import java.util.HashMap;
import java.util.Map;
import com.jfinal.template.Engine;
import com.jfinal.template.Template;
import com.litongjava.openai.chat.OpenAiChatResponseVo;
import com.litongjava.openai.client.OpenAiClient;
public class SummaryQuestionService {
public String summary(String question) {
// 1. 渲染模板
Engine engine = Engine.use();
Template template = engine.getTemplate("summary_question_prompt.txt");
Map<String, Object> values = new HashMap<>();
values.put("query", question);
String prompt = template.renderToString(values);
// 2. 调用大模型进行推理
OpenAiChatResponseVo chatCompletions = OpenAiClient.chatWithRole("system", prompt);
String content = chatCompletions.getChoices().get(0).getMessage().getContent();
// 3. 判断结果并返回
if ("not_needed".equals(content)) {
return question; // 或者根据实际需求,直接返回 "not_needed"
}
return content;
}
}
1. 模板渲染
Template template = engine.getTemplate("summary_question_prompt.txt");
values.put("query", question);
String prompt = template.renderToString(values);
- 将用户输入
question
插入到模板summary_question_prompt.txt
中。 - 模板中包含了大模型所需的所有指令,确保返回 3-5 个单词的概括或
not_needed
。
2. 大模型推理
OpenAiChatResponseVo chatCompletions = OpenAiClient.chatWithRole("system", prompt);
String content = chatCompletions.getChoices().get(0).getMessage().getContent();
- 使用自定义的
OpenAiClient
来发送请求并获取大模型的响应。 chatWithRole
方法表明,我们可能在提示语(Prompt)之外,设置了一个系统角色上下文,以更好地引导大模型输出。
3. 结果处理逻辑
if ("not_needed".equals(content)) {
return question;
}
return content;
- 如果输出是
not_needed
,代表当前并非真正的问题场景,可以将原始输入返回或处理为占位值。 - 否则,模型给出的 3-5 个单词短语就是最终结果。
五、使用示例
假设我们有如下输入:
What is the first day of sjsu in Fall 2024
通过上述流程,最终得到的大模型输出为:
Fall 2024 Start Date
该简短短语正好包含 4 个单词,满足 3-5 个单词的限制,不包含“title”一词,并且可直观概括原始问题。