Spring AI 实现ChatGPT的人设(角色)设置

1,598 阅读3分钟

上篇文章我们成功让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();
    }

}

image.png

通过测试可以看到,大模型并不返回你期望的内容,就主打一个懒字。如果我们将defaultSystem()设置的内容注释掉,然后在测试,大模型返回的结果如下图所示;

image.png

代码示例

github.com/fangjieDevp…

总结

本文对 Spring AI 实现 ChatGPT角色设定原理进行说明,主要利用了OpenAIMessage类型进行实现。在对Message类型复习一下。

  • UserMessage:用户消息,指用户输入的消息,比如提问的问题。
  • SystemMessage:系统限制性消息,这种消息比较特殊,权重很大,AI会优先依据SystemMessage里的内容进行回复。在设定Chat角色时,可以用的到,下篇文章分析
  • AssistantMessage:大模型回复的消息。
  • FunctionMessage:函数调用消息,开发中一般使用不到,一般无需关心。