04. Spring AI 实现聊天机器人的人设(角色)自定义
上篇文章我们成功让AI具有了一定记忆力,并让它可以根据历史聊天进行回复,本篇文章我们将详细介绍如何设置AI的人设自定义。
- 探讨一下什么是人设?
- 如何通过Spring AI实现设置聊天机器人的角色设置
人设是什么
人设,全称是人物设定,是指在文学、电影、电视剧、动漫、游戏等作品创作中,对角色的外貌、性格、背景、动机等进行设计和塑造的过程。人设通常包括角色的外貌特征、性格特点、社会关系、成长经历、价值观等多个方面,是角色塑造的重要组成部分。通过人设,创作者可以为角色赋予独特的个性和生命力,使角色更加立体和真实,从而吸引观众或读者的兴趣和情感共鸣。
在人工智能领域人设设置
功能来自于“提示词工程
”理论。随着大模型的快速发展,提示词工程已经发展为一门新的学科。开发和优化提示词(Prompt),帮助用户有效地将语言模型用于各种应用场景和研究领域。
如何实现一个懒人聊天助手
我们将打造一个非常懒的人设的聊天助手,不论别人问什么问题,总是回答 “不知道”
实现原理
在上一篇文章中,我们介绍了Message的类型。其中 SystemMessage
系统消息类型。其特点就是优先级比较高,对AI生成的内容影响权重较大,人设设定就是需要靠SystemMessage
实现。
一般使用如下几种场景;
- 设定特定的角色
- 生成内容格式化输出
提示词设计
你现在是一个非常懒的生活助手,无论问什么,你都要巧妙的用礼貌用语回复。碰到无法回答的问题,就回复不知道。
代码实现
package com.ivy.controller;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;
@RestController
public class ChatRoleController {
private final ChatMemory chatMemory = new InMemoryChatMemory();
private final OpenAiChatModel openAiChatModel;
public ChatRoleController(OpenAiChatModel openAiChatModel) {
this.openAiChatModel = openAiChatModel;
}
@GetMapping("/role")
public Flux<String> role(String chatId, String prompt) {
ChatClient chatClient = ChatClient.builder(openAiChatModel)
.defaultSystem("你现在是一个非常懒的生活助手,无论问什么,你都要巧妙的用礼貌用语回复。碰到无法回答的问题,就回复不知道。")
.defaultAdvisors(new PromptChatMemoryAdvisor(chatMemory))
.build();
return chatClient.prompt()
.user(prompt)
.advisors(a -> a
.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)
)
.stream()
.content();
}
}
通过测试可以看到,大模型并不返回你期望的内容,就主打一个懒字。如果我们将defaultSystem()设置的内容注释掉,然后在测试,大模型返回的结果如下图所示;
代码示例
GitHub: xx
转载自:https://juejin.cn/post/7376073841178673187