Prompt 提示词
在 Agents-Flex 中,提示词(Prompt)是程序和大模型交互的 “编程语言”,是让大语言模型理解的指令。
目前,Agents-Flex 支持一下几种类型的提示词:
- TextPrompt: 文本提示词,用于向大语言模型发送文本指令。
- FunctionPrompt: 函数提示词,用于向大语言模型发送带有 Function Calling 的提示词。
- ImagePrompt: 图像提示词,用于向大语言模型发送带有图像的提示词。
- ToolPrompt: 工具提示词,当本地执行完 Function 后,告知大模型结果的提示词。
- HistoriesPrompt: 带有历史记录的提示词,用于向大语言模型发送历史信息。
TextPrompt
TextPrompt 是最基本的提示词,用于向大语言模型发送文本指令。
示例代码:
java
@Test()
public void testChat() {
OpenAILlmConfig config = new OpenAILlmConfig();
config.setApiKey("sk-rts5NF6n*******");
Llm llm = new OpenAILlm(config);
TextPrompt prompt = new TextPrompt("请问你叫什么名字");
String response = llm.chat(prompt);
System.out.println(response);
}
FunctionPrompt
FunctionPrompt 用于向大语言模型发送带有 Function Calling 的提示词。
示例代码:
java
@Test()
public void testFunctionCalling() throws InterruptedException {
OpenAILlmConfig config = new OpenAILlmConfig();
config.setApiKey("sk-rts5NF6n*******");
OpenAILlm llm = new OpenAILlm(config);
FunctionPrompt prompt = new FunctionPrompt("今天北京的天气怎么样", WeatherFunctions.class);
AiMessageResponse response = llm.chat(prompt);
System.out.println(response.callFunctions());
// "Today it will be dull and overcast in 北京"
}
ImagePrompt
ImagePrompt 用于向大语言模型发送带有图像的提示词。
示例代码:
java
@Test()
public void testChatWithImage() {
OpenAILlmConfig config = new OpenAILlmConfig();
config.setApiKey("sk-5gqOcl*****");
config.setModel("gpt-4-turbo");
Llm llm = new OpenAILlm(config);
ImagePrompt prompt = new ImagePrompt("What's in this image?");
prompt.setImageUrl("https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg");
AiMessageResponse response = llm.chat(prompt);
System.out.println(response);
}
ToolPrompt
ToolPrompt 用于向大语言模型发送带有工具调用的提示词。
示例代码:
java
@Test()
public void testFunctionCalling2() throws InterruptedException {
OpenAILlmConfig config = new OpenAILlmConfig();
config.setApiKey("sk-rts5NF6n*******");
OpenAILlm llm = new OpenAILlm(config);
FunctionPrompt prompt = new FunctionPrompt("今天北京的天气怎么样", WeatherFunctions.class);
AiMessageResponse response = llm.chat(prompt);
if (response.isFunctionCall()) {
AiMessageResponse response1 = llm.chat(ToolPrompt.of(response));
System.out.println(response1.getMessage().getContent());
} else {
System.out.println(response);
}
}
HistoriesPrompt
HistoriesPrompt 用于向大语言模型发送带有历史对话的提示词。
示例代码:
java
public static void main(String[] args) {
OpenAILlmConfig config = new OpenAILlmConfig();
config.setApiKey("sk-rts5NF6n*******");
OpenAILlm llm = new OpenAILlm(config);
//第一步:创建一个 HistoriesPrompt
HistoriesPrompt prompt = new HistoriesPrompt();
System.out.println("您想问什么?");
Scanner scanner = new Scanner(System.in);
String userInput = scanner.nextLine();
while (userInput != null) {
// 第二步:将用户输入添加到 HistoriesPrompt 中
prompt.addMessage(new HumanMessage(userInput));
// 第三步:调用 chatStream 方法,进行对话
llm.chatStream(prompt, (context, response) -> {
System.out.println(">>>> " + response.getMessage().getContent());
});
userInput = scanner.nextLine();
}
}
TextPromptTemplate
TextPromptTemplate 文本提示词模板,用于格式化提示词内容。
示例代码:
java
@Test
public void test() {
Map<String, Object> map = new HashMap<>();
map.put("useName", "Michael");
map.put("aaa", "星期3");
TextPromptTemplate promptTemplate = TextPromptTemplate.create("你好 {{ useName }},今天是星期: {{aaa }}");
String string = promptTemplate.formatToString(map);
System.out.println(string);
//输出: 你好 Michael,今天是星期: 星期3
}
在 {\{}}
双括号语法中,支持通过 .
访问对象属性,或者访问 map 的子 map 等,也支持通过 ??
设置默认值。
示例代码:
java
@Test
public void test() {
String templateStr = "你好 {{ user.name ?? '匿名' }}," +
"欢迎来到 {{ site ?? 'AgentsFlex.com' }}!";
TextPromptTemplate template = new TextPromptTemplate(templateStr);
Map<String, Object> params = new HashMap<>();
params.put("site", "AIFlowy.tech");
Map<String, Object> user = new HashMap<>();
user.put("name", "Michael");
params.put("user", user);
System.out.println(template.format(params));
// 输出:你好 Michael,欢迎来到 AIFlowy.tech!
System.out.println(template.format(new HashMap<>()));
// 输出:你好 匿名,欢迎来到 AgentsFlex.com!
}
模板缓存
每次执行 new TextPromptTemplate(templateStr)
时,都会创建一个新的模板对象,同时会进行模板解析,有一定的性能开销,所以建议使用模板缓存,减少模板解析的次数。
在 Agents-Flex 中,内置了 TextPromptTemplate.of(templateStr)
方法,用于缓存模板对象,避免重复解析模板。
示例代码:
java
@Test
public void test() {
String templateStr = "你好 {{ user.name ?? '匿名' }}," +
"欢迎来到 {{ site ?? 'AgentsFlex.com' }}!";
TextPromptTemplate template = TextPromptTemplate.of(templateStr);
Map<String, Object> params = new HashMap<>();
params.put("site", "AIFlowy.tech");
Map<String, Object> user = new HashMap<>();
user.put("name", "Michael");
params.put("user", user);
System.out.println(template.format(params));
// 输出:你好 Michael,欢迎来到 AIFlowy.tech!
System.out.println(template.format(new HashMap<>()));
// 输出:你好 匿名,欢迎来到 AgentsFlex.com!
}