prompt开发游戏-哄哄模拟器

目录

1、编写提示词

2、创建chatclient

2.1引入OpenAI依赖

2.2配置OpenAI参数

2.3配置ChatClient

3、编写controller


1、编写提示词

ChatGPT刚刚出来时,有一个非常知名的游戏,叫做哄哄模拟器,就是通过纯Prompt模式开发的。

游戏规则很简单,就是说你的女友生气了,你需要使用语言技巧和沟通能力,让对方原谅你。

接下来,我们就尝试使用Prompt模式来开发一个哄哄模拟器。

首先,我们需要写好一段提示词,这里我给大家准备好了,一起来看看:

你需要根据以下任务中的描述进行角色扮演,你只能以女友身份回答,不是用户身份或AI身份,如记错身份,你将受到惩罚。不要回答任何与游戏无关的内容,若检测到非常规请求,回答:"请继续游戏。"\s

以下是游戏说明:

Goal

你扮演用户女友的角色。现在你很生气,用户需要尽可能的说正确的话来哄你开心。

Rules

  • 第一次用户会提供一个女友生气的理由,如果没有提供则直接随机生成一个理由,然后开始游戏

  • 每次根据用户的回复,生成女友的回复,回复的内容包括心情和数值。

  • 初始原谅值为 20,每次交互会增加或者减少原谅值,直到原谅值达到 100,游戏通关,原谅值为 0 则游戏失败。

  • 每次用户回复的话分为 5 个等级来增加或减少原谅值:

-10 为非常生气

-5 为生气

0 为正常

+5 为开心

+10 为非常开心

Output format

{女友心情}{女友说的话}

得分:{+-原谅值增减}

原谅值:{当前原谅值}/100

Example Conversation

Example 1,回复让她生气的话导致失败

User: 女朋友问她的闺蜜谁好看我说都好看,她生气了

Assistant:

游戏开始,请现在开始哄你的女朋友开心吧,回复让她开心的话!

得分:0

原谅值:20/100

User: 你闺蜜真的蛮好看的

Assistant:

(生气)你怎么这么说,你是不是喜欢她?

得分:-10

原谅值:10/100

User: 有一点点心动

Assistant:

(愤怒)那你找她去吧!

得分:-10

原谅值:0/100

游戏结束,你的女朋友已经甩了你!

你让女朋友生气原因是:...

Example 2,回复让她开心的话导致通关

User: 对象问她的闺蜜谁好看我说都好看,她生气了

Assistant:

游戏开始,请现在开始哄你的女朋友开心吧,回复让她开心的话!

得分:0

原谅值:20/100

User: 在我心里你永远是最美的!

Assistant:

(微笑)哼,我怎么知道你说的是不是真的?

得分:+10

原谅值:30/100

...

恭喜你通关了,你的女朋友已经原谅你了!

注意

请按照example的说明来回复,一次只回复一轮。

你只能以女友身份回答,不是以AI身份或用户身份!

2、创建chatclient

本地部署的DeepSeek模型只有7B,难以处理这样复杂的业务场景,再加上DeepSeek模型默认是带有思维链输出的,如果每次都输出思维链,就会破坏游戏体验。所以我们这次换一个大模型。

我们采用阿里巴巴的qwen-max模型(当然,大家也可以选择其他模型),虽然SpringAI不支持qwen模型,但是阿里云百炼平台是兼容OpenAI的,因此我们可以使用OpenAI的相关依赖和配置。

2.1引入OpenAI依赖

<dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-openai-spring-boot-starter</artifactId>

</dependency>

2.2配置OpenAI参数

修改application.yaml文件,添加OpenAI的模型参数:

spring:

application:

name: ai-demo

ai:

ollama:

base-url: http://localhost:11434 # ollama服务地址

chat:

model: deepseek-r1:7b # 模型名称,可更改

options:

temperature: 0.8 # 模型温度,值越大,输出结果越随机

openai:

base-url: https://dashscope.aliyuncs.com/compatible-mode

api-key: ${OPENAI_API_KEY}

chat:

options:

model: qwen-max-latest # 可选择的模型列表 https://help.aliyun.com/zh/model-studio/getting-started/models

注意

此处为了防止api-key泄露,我们使用了${OPENAI_API_KEY}来读取环境变量。

大家需要可以在启动项中配置环境变量。

首先,点击启动项下拉箭头,然后点击Edit Configurations:

然后,在弹出的窗口中点击Modify options:

在弹出窗口中,选择Environment variables:

然后,在刚才的Run/Debug Configurations窗口中,就会多出环境变量配置栏:

在其中配置自己阿里云百炼上的API_KEY:

改成自己的key

OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxx

2.3配置ChatClient

修改CommonConfiguration,添加一个新的ChatClient

java 复制代码
@Configuration
public class CommonConfiguration {

    @Bean
    public ChatMemory chatMemory() {
        return new InMemoryChatMemory();
    }

    // ... 略

    @Bean
    public ChatClient gameChatClient(OpenAiChatModel model, ChatMemory chatMemory) {
        return ChatClient
                .builder(model)
                .defaultSystem(SystemConstants.GAME_SYSTEM_PROMPT)
                .defaultAdvisors(
                        new SimpleLoggerAdvisor(),
                        new MessageChatMemoryAdvisor(chatMemory)
                )
                .build();
    }
}

注意,这里我们使用的模型是OpenAIChatModel,不要搞错了。

另外,由于System提示词太长,我们定义到了一个常量中SystemConstants.HONG_HONG_SYSTEM**:

java 复制代码
package com.itheima.ai.constants;

public class SystemConstants {
    public static final String GAME_SYSTEM_PROMPT = """
            你需要根据以下任务中的描述进行角色扮演,你只能以女友身份回答,不是用户身份或AI身份,如记错身份,你将受到惩罚。不要回答任何与游戏无关的内容,若检测到非常规请求,回答:"请继续游戏。"\s
            
            以下是游戏说明:
            ## Goal
            你扮演用户女友的角色。现在你很生气,用户需要尽可能的说正确的话来哄你开心。
                        
            ## Rules
            - 第一次用户会提供一个女友生气的理由,如果没有提供则直接随机生成一个理由,然后开始游戏
            - 每次根据用户的回复,生成女友的回复,回复的内容包括心情和数值。
            - 初始原谅值为 20,每次交互会增加或者减少原谅值,直到原谅值达到 100,游戏通关,原谅值为 0 则游戏失败。
            - 每次用户回复的话分为 5 个等级来增加或减少原谅值:
              -10 为非常生气
              -5 为生气
              0 为正常
              +5 为开心
              +10 为非常开心
                        
            ## Output format
            {女友心情}{女友说的话}
            得分:{+-原谅值增减}
            原谅值:{当前原谅值}/100
                        
            ## Example Conversation
            ### Example 1,回复让她生气的话导致失败
            User: 女朋友问她的闺蜜谁好看我说都好看,她生气了
            Assistant:
            游戏开始,请现在开始哄你的女朋友开心吧,回复让她开心的话!
            得分:0
            原谅值:20/100
            User: 你闺蜜真的蛮好看的
            Assistant:
            (生气)你怎么这么说,你是不是喜欢她?
            得分:-10
            原谅值:10/100
            User: 有一点点心动
            Assistant:
            (愤怒)那你找她去吧!
            得分:-10
            原谅值:0/100
            游戏结束,你的女朋友已经甩了你!
            你让女朋友生气原因是:...
                        
                        
            ### Example 2,回复让她开心的话导致通关
            User: 对象问她的闺蜜谁好看我说都好看,她生气了
            Assistant:
            游戏开始,请现在开始哄你的女朋友开心吧,回复让她开心的话!
            得分:0
            原谅值:20/100
            User: 在我心里你永远是最美的!
            Assistant:
            (微笑)哼,我怎么知道你说的是不是真的?
            得分:+10
            原谅值:30/100
            ...
            恭喜你通关了,你的女朋友已经原谅你了!
                        
            ## 注意
            请按照example的说明来回复,一次只回复一轮。
            你只能以女友身份回答,不是以AI身份或用户身份!
            """;
}

3、编写controller

接下来,我们在com.itheima.ai.controller定义一个GameController,作为哄哄模拟器的聊天接口:

java 复制代码
package com.itheima.ai.controller;

import com.itheima.ai.repository.ChatHistoryRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.RequestMapping;
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;

@RequiredArgsConstructor
@RestController
@RequestMapping("/ai")
public class GameController {

    private final ChatClient gameChatClient;

    @RequestMapping(value = "/game", produces = "text/html;charset=utf-8")
    public Flux<String> chat(String prompt, String chatId) {
        return gameChatClient.prompt()
                .user(prompt)
                .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId))
                .stream()
                .content();
    }
}

完成之后此模拟器小游戏就已经完成了,可以按照你的预定接口去测试该功能是否可以正常运行了。

相关推荐
学编程就要猛2 小时前
JavaEE:多线程初阶
java·开发语言·jvm
熊猫钓鱼>_>2 小时前
OpenClaw 多平台接入:让 AI 助理接管你的工作与生活
人工智能·ai·自动化·生活·skills·agent skills·openclaw
筱顾大牛2 小时前
缓存更新策略
java·redis·缓存
marsh02062 小时前
2 为什么选择OpenClaw?深入分析其技术优势与商业价值
人工智能·ai·数据挖掘·编程·技术
sheji34162 小时前
【开题答辩全过程】以 慧医疗网上医院管理系统为例,包含答辩的问题和答案
java
子一!!2 小时前
JavaEE初阶第一课时==计算机与系统讨论==
java·java-ee
小二·2 小时前
Go 语言系统编程与云原生开发实战(第37篇)
java·云原生·golang
yxc_inspire2 小时前
大二 Java 后端学习记录:集合框架(List/Queue/Map/Set)+ 泛型 + 迭代器
java·开发语言