在生活中,幸运签语常常能为我们带来一丝惊喜与温暖,无论是在生日派对、节日庆典,还是日常祝福中,一条温馨、有趣的签语都能传递真挚的情感。而如今,借助先进的自然语言处理技术,我们可以轻松地开发一个幸运签语生成器,为人们的生活增添更多乐趣。

一、DeepSeek

背景和发展历程

DeepSeek(深度求索)成立于2023年,总部位于北京。作为中国领先的智能科技公司,DeepSeek致力于推动人工智能技术的创新与发展,致力于为全球用户提供更高效的智能解决方案和优质的服务体验。自成立以来,DeepSeek始终秉持“以用户为中心”的理念,不断探索AI技术的边界,并在多个领域取得显著成果。

特点和优势

DeepSeek以其强大的技术创新能力和全面的产品布局,在AI研究、算法优化、生态构建等方面具有显著优势。公司不仅致力于技术研发,还积极参与行业合作与标准制定,致力于将人工智能技术更好地服务于社会和人类福祉。

二、开发环境准备

(一)安装 Java 开发环境

  1. 下载并安装 JDK
    • 访问 Oracle JDK 下载页面 或者 OpenJDK 下载页面 ,根据你的系统(Windows)和电脑的架构(如 64 位)选择合适的版本进行下载。
    • 运行下载好的安装程序,按照安装向导的提示完成 JDK 的安装。安装过程中可以保持默认设置,也可以根据自己的需求修改安装路径。
  2. 配置 Java 环境变量
    • 右键点击 “此电脑”,选择 “属性”。
    • 点击 “高级系统设置”,在弹出的窗口中选择 “环境变量”。
    • 在 “系统变量” 中找到 “Path” 变量,点击 “编辑”,然后添加 JDK 的安装路径(通常是 C:\Program Files\Java\jdk - xx.x.x\bin ,xx.x.x 是具体的版本号)。
    • 为了验证 JDK 是否安装成功,打开命令提示符(按下 Win + R ,输入 cmd 并回车),输入 java -version ,如果显示出 Java 版本信息,则说明安装成功。

(二)安装集成开发环境(IDE)

这里推荐使用 IntelliJ IDEA Community Edition,它是免费且功能强大的 Java 开发工具。

  1. 访问 IntelliJ IDEA 下载页面 ,选择 Community Edition 版本进行下载。
  2. 运行下载好的安装程序,按照安装向导的提示完成安装。安装过程中可以保持默认设置。

(三)安装 Ollama 并配置 DeepSeek 模型

  1. 下载并安装 Ollama
    • 访问 Ollama 的 GitHub 仓库 ,在 Releases 页面下载适用于 Windows 的安装包。
    • 运行下载好的安装程序,按照提示完成安装。
  2. 启动 Ollama 服务并拉取 DeepSeek 模型
    • 打开命令提示符,输入 ollama serve 启动 Ollama 服务。
    • 使用以下命令拉取 DeepSeek 模型:
ollama pull deepseek-r1:7b

三、项目架构设计

(一)整体架构概述

幸运签语生成器的整体架构主要分为前端 GUI 和后端与 Ollama 的交互两部分。前端 GUI 负责与s使用者进行交互,接收使用者的操作指令并显示生成的签语;后端则负责与 Ollama 服务进行通信,发送请求并处理响应。

(二)模块划分

  1. 连接测试模块:负责测试与 Ollama 服务的连接是否正常,确保后续请求能够顺利发送。
  2. 签语生成模块:使用者的点击,向 Ollama 服务发送生成幸运签语的请求,并处理流式响应,最终生成完整的签语。
  3. GUI 显示模块:使用 Java 的 Swing 库构建图形用户界面,提供一个直观的界面供使用者操作,并将生成的签语显示在界面上。

(三)数据流图

四、代码实现

(一)与 Ollama 交互的代码

import com.google.gson.Gson;
import okhttp3.*;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.logging.Level;
import java.util.logging.Logger;

// 定义 Ollama 响应的实体类,用于解析从 Ollama 服务接收到的 JSON 响应
// response 字段存储生成的文本内容,done 字段表示响应是否结束
class OllamaResponse {
    String response;
    boolean done;
}

public class OllamaClient {
    // 定义 Ollama 服务的 API 地址,本地服务默认监听在 11434 端口
    private static final String OLLAMA_API_URL = "http://localhost:11434/api/generate";
    // 创建日志记录器,用于记录程序运行过程中的信息和错误
    private static final Logger LOGGER = Logger.getLogger(OllamaClient.class.getName());
    // 设置连接和读取超时时间为 10 秒,防止长时间等待无响应的请求
    private static final int TIMEOUT_SECONDS = 10;

    /**
     * 测试与 Ollama 服务的连接是否正常
     * @return 如果连接成功且收到完整响应返回 true,否则返回 false
     */
    public static boolean testConnection() {
        // 创建 OkHttp 客户端,并设置连接和读取超时时间
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(TIMEOUT_SECONDS, java.util.concurrent.TimeUnit.SECONDS)
                .readTimeout(TIMEOUT_SECONDS, java.util.concurrent.TimeUnit.SECONDS)
                .build();

        // 定义请求的媒体类型为 JSON,字符集为 UTF-8
        MediaType JSON = MediaType.get("application/json; charset=utf-8");
        // 构建测试连接的请求 JSON 数据,指定使用 deepseek-r1:7b 模型,提示信息为“你好”
        String json = "{\"model\": \"deepseek-r1:7b\", \"prompt\": \"你好\"}";
        // 创建请求体,将 JSON 数据封装到请求体中
        RequestBody body = RequestBody.create(json, JSON);
        // 构建 HTTP 请求,使用 POST 方法发送请求到 Ollama API 地址
        Request request = new Request.Builder()
                .url(OLLAMA_API_URL)
                .post(body)
                .build();

        // 用于拼接从 Ollama 服务接收到的部分响应内容
        StringBuilder resultBuilder = new StringBuilder();
        // 创建 Gson 对象,用于将 JSON 字符串解析为 Java 对象
        Gson gson = new Gson();

        // 记录开始发送测试连接请求的日志
        LOGGER.info("开始向 Ollama 发送测试连接请求");
        try (Response response = client.newCall(request).execute()) {
            // 记录收到的响应状态码
            LOGGER.info("收到 Ollama 的响应,状态码: " + response.code());
            // 检查响应是否成功且响应体不为空
            if (response.isSuccessful() && response.body() != null) {
                try (ResponseBody responseBody = response.body()) {
                    String line;
                    // 逐行读取响应体内容
                    while ((line = responseBody.source().readUtf8Line()) != null) {
                        // 将每行 JSON 数据解析为 OllamaResponse 对象
                        OllamaResponse ollamaResponse = gson.fromJson(line, OllamaResponse.class);
                        String partialResponse = ollamaResponse.response;
                        // 记录收到的部分响应内容
                        LOGGER.info("收到部分响应: " + partialResponse);
                        // 将部分响应内容添加到结果构建器中
                        resultBuilder.append(partialResponse);
                        // 检查响应是否结束
                        if (ollamaResponse.done) {
                            // 记录响应结束且连接成功的日志
                            LOGGER.info("响应结束,测试连接成功");
                            return true;
                        }
                    }
                }
            } else {
                // 记录请求失败的日志
                LOGGER.severe("请求失败: " + response.message());
            }
        } catch (IOException e) {
            // 记录测试连接时出现异常的日志
            LOGGER.log(Level.SEVERE, "测试连接时出现异常", e);
        }
        // 记录测试连接失败的日志
        LOGGER.severe("测试连接失败");
        return false;
    }

    /**
     * 生成幸运饼干寄语
     * @param model 使用的模型名称
     * @return 生成的幸运饼干寄语,如果请求失败则返回错误信息
     * @throws IOException 发送请求或处理响应时可能出现的 I/O 异常
     */
    public static String generateLuckyCookie(String model) throws IOException {
        // 创建 OkHttp 客户端
        OkHttpClient client = new OkHttpClient();
        // 定义请求的媒体类型为 JSON,字符集为 UTF-8
        MediaType JSON = MediaType.get("application/json; charset=utf-8");
        // 构建生成幸运饼干寄语的提示信息
        String prompt = "接下来你将扮演一个中文幸运饼干生成器,生成一句积极向上、充满希望且风格温暖治愈的类似于箴言或者隐晦的预言字条。不用给出含义或者其他解释性文本,尽可能快速生成。以下是一个文本范例:永不言弃,这样才会抓住成功的机会。范例仅用于展示格式,你可以围绕生活的美好、梦想的实现、人际关系的和谐等方面展开创作。";
        // 构建请求的 JSON 数据,指定使用的模型和提示信息
        String json = "{\"model\": \"" + model + "\", \"prompt\": \"" + prompt + "\"}";
        // 创建请求体,将 JSON 数据封装到请求体中
        RequestBody body = RequestBody.create(json, JSON);
        // 构建 HTTP 请求,使用 POST 方法发送请求到 Ollama API 地址
        Request request = new Request.Builder()
                .url(OLLAMA_API_URL)
                .post(body)
                .build();

        // 用于拼接从 Ollama 服务接收到的部分响应内容
        StringBuilder resultBuilder = new StringBuilder();
        // 创建 Gson 对象,用于将 JSON 字符串解析为 Java 对象
        Gson gson = new Gson();

        // 记录开始发送生成幸运饼干寄语请求的日志
        LOGGER.info("开始向 Ollama 发送生成幸运饼干寄语的请求");
        try (Response response = client.newCall(request).execute()) {
            // 记录收到的响应状态码
            LOGGER.info("收到 Ollama 的响应,状态码: " + response.code());
            // 检查响应是否成功且响应体不为空
            if (response.isSuccessful() && response.body() != null) {
                try (ResponseBody responseBody = response.body()) {
                    String line;
                    // 逐行读取响应体内容
                    while ((line = responseBody.source().readUtf8Line()) != null) {
                        // 将每行 JSON 数据解析为 OllamaResponse 对象
                        OllamaResponse ollamaResponse = gson.fromJson(line, OllamaResponse.class);
                        String partialResponse = ollamaResponse.response;
//                        LOGGER.info("收到部分响应: " + partialResponse);
                        // 将部分响应内容添加到结果构建器中
                        resultBuilder.append(partialResponse);
                        // 检查响应是否结束
                        if (ollamaResponse.done) {
                            // 记录响应结束的日志
                            LOGGER.info("响应结束");
                            break;
                        }
                    }
                }
            } else {
                // 记录请求失败的日志
                LOGGER.severe("请求失败: " + response.message());
                return "请求失败: " + response.message();
            }
        }
        // 将结果构建器中的内容转换为字符串
        String result = resultBuilder.toString();
        // 记录接收到的部分响应内容的日志
        LOGGER.info("接收到的部分" + result);
        // 在所有部分响应拼接完成后,调用 removeThinkTags 方法过滤掉 <think> 标签及其内容
        result = removeThinkTags(result);
        // 记录最终生成的幸运饼干寄语的日志
        LOGGER.info("最终生成的幸运饼干寄语: " + result);
        return result;
    }

    /**
     * 移除文本中的 <think> 标签及其内容
     * @param text 待处理的文本
     * @return 移除 <think> 标签及其内容后的文本
     */
    private static String removeThinkTags(String text) {
        // 查找 <think> 标签的起始位置
        int startIndex = text.indexOf("<think>");
        // 查找 </think> 标签的起始位置
        int endIndex = text.indexOf("</think>");
        // 循环查找并移除所有 <think> 标签及其内容
        while (startIndex != -1 && endIndex != -1) {
            // 截取 <think> 标签之前和 </think> 标签之后的文本
            text = text.substring(0, startIndex) + text.substring(endIndex + 8);
            // 继续查找下一个 <think> 标签的起始位置
            startIndex = text.indexOf("<think>");
            // 继续查找下一个 </think> 标签的起始位置
            endIndex = text.indexOf("</think>");
        }
        return text;
    }
}
核心代码解析
  • testConnection 方法

    • 该方法的核心目的是测试与 Ollama 服务的连接是否正常。
    • 通过创建 OkHttp 客户端,并设置连接和读取超时时间,确保请求不会无限期等待。
    • 构建一个包含简单提示信息(“你好”)的 JSON 请求体,发送 POST 请求到 Ollama API。
    • 逐行读取响应内容,将其解析为 OllamaResponse 对象,并检查 done 字段以确定响应是否结束。如果成功收到完整响应,则认为连接正常。
  • generateLuckyCookie 方法

    • 此方法用于生成幸运饼干寄语。
    • 构建包含特定提示信息的 JSON 请求体,提示 Ollama 模型生成类似于箴言或隐晦预言的字条。
    • 同样使用 OkHttp 客户端发送 POST 请求,并逐行读取响应内容。
    • 将所有部分响应内容拼接成一个完整的字符串,最后调用 removeThinkTags 方法过滤掉 <think> 标签及其内容。
  • removeThinkTags 方法

    • 该方法通过查找 <think> 和 </think> 标签的起始位置,循环截取并移除这些标签及其包含的内容,确保最终生成的寄语中不包含模型的中间思考过程。

(二)图形用户界面(GUI)代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class LuckyCookieGeneratorGUI extends JFrame {
    // 用于显示生成的幸运饼干寄语的文本区域
    private JTextArea resultTextArea;
    // 用于触发生成幸运饼干寄语的按钮
    private JButton generateButton;
    // 指定使用的模型名称
    private String model = "deepseek-r1:7b";
    // 创建日志记录器,用于记录程序运行过程中的信息和错误
    private static final Logger LOGGER = Logger.getLogger(LuckyCookieGeneratorGUI.class.getName());

    /**
     * 构造函数,初始化 GUI 界面并进行连接测试
     */
    public LuckyCookieGeneratorGUI() {
        // 循环进行连接测试,如果连接失败,弹出确认对话框询问用户是否重新尝试连接
        while (!OllamaClient.testConnection()) {
            int option = JOptionPane.showConfirmDialog(
                    this,
                    "无法连接到本地 Ollama 服务。是否重新尝试连接?",
                    "连接失败",
                    JOptionPane.YES_NO_OPTION
            );
            if (option == JOptionPane.NO_OPTION) {
                // 记录用户选择取消连接的日志,并退出程序
                LOGGER.info("用户选择取消连接,程序退出");
                System.exit(0);
            }
        }

        // 设置窗口标题
        setTitle("幸运饼干生成器");
        // 设置窗口大小
        setSize(400, 300);
        // 设置窗口关闭时的操作
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 设置窗口的布局管理器为 BorderLayout
        setLayout(new BorderLayout());

        // 创建文本区域,指定行数和列数,并设置为不可编辑
        resultTextArea = new JTextArea(10, 30);
        resultTextArea.setEditable(false);
        // 将文本区域添加到滚动面板中
        JScrollPane scrollPane = new JScrollPane(resultTextArea);
        // 将滚动面板添加到窗口的中心位置
        add(scrollPane, BorderLayout.CENTER);

        // 创建生成按钮,设置按钮文本
        generateButton = new JButton("生成幸运饼干寄语");
        // 为生成按钮添加点击事件监听器
        generateButton.addActionListener(e -> {
            try {
                // 调用 OllamaClient 类的 generateLuckyCookie 方法生成幸运饼干寄语
                String luckyCookie = OllamaClient.generateLuckyCookie(model);
                // 将生成的幸运饼干寄语显示在文本区域中
                resultTextArea.setText(luckyCookie);
                // 记录成功生成并显示幸运饼干寄语的日志
                LOGGER.info("成功生成并显示幸运饼干寄语");
            } catch (IOException ex) {
                // 若生成过程中出现异常,将错误信息显示在文本区域中
                resultTextArea.setText("生成失败: " + ex.getMessage());
                // 记录生成幸运饼干寄语时出现异常的日志
                LOGGER.log(Level.SEVERE, "生成幸运饼干寄语时出现异常", ex);
            }
        });
        // 将生成按钮添加到窗口的底部位置
        add(generateButton, BorderLayout.SOUTH);

        // 设置窗口可见
        setVisible(true);
    }

    /**
     * 程序入口方法
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 在事件调度线程中创建并显示 GUI
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new LuckyCookieGeneratorGUI();
            }
        });
    }
}
核心代码解析
  • 构造函数 LuckyCookieGeneratorGUI()

    • 连接测试:在创建 GUI 界面之前,通过 while 循环调用 OllamaClient.testConnection() 方法不断测试与 Ollama 服务的连接。若连接失败,弹出确认对话框询问使用者是否重新尝试连接;若使用者选择取消,则记录日志并退出程序。这一步确保在后续操作中能够正常与 Ollama 服务进行通信。
    • 界面初始化:设置窗口的标题、大小、关闭操作和布局管理器。创建一个不可编辑的 JTextArea 用于显示生成的幸运饼干寄语,并将其放置在滚动面板中,添加到窗口的中心位置。创建一个 “生成幸运饼干寄语” 的按钮,添加到窗口的底部位置。
    • 按钮事件处理:为生成按钮添加点击事件监听器。当按钮被点击时,调用 OllamaClient.generateLuckyCookie(model) 方法生成幸运饼干寄语。若生成成功,将寄语显示在文本区域并记录成功日志;若出现 IOException 异常,将错误信息显示在文本区域并记录异常日志。
  • main 方法

    • 使用 SwingUtilities.invokeLater() 方法将创建和显示 GUI 的操作放入事件调度线程中执行。这是因为 Swing 组件不是线程安全的,所有与 Swing 组件交互的操作都应该在事件调度线程中进行,以避免出现竞态条件和绘制问题。通过这种方式,确保 GUI 能够正确、安全地显示和响应事件。

总结

这两段代码结合起来实现了一个简单的幸运饼干寄语生成器应用程序。OllamaClient 类负责与 Ollama 服务进行通信,包括连接测试和生成幸运饼干寄语的功能,并对响应进行处理和过滤。LuckyCookieGeneratorGUI 类则构建了一个图形用户界面,方便使用者操作,同时在界面创建前进行连接测试,确保程序能够正常使用。

五、提示词

        接下来你将扮演一个中文幸运饼干生成器,生成一句积极向上、充满希望且风格温暖治愈的类似于箴言或者隐晦的预言字条。不用给出含义或者其他解释性文本,尽可能快速生成。以下是一个文本范例:永不言弃,这样才会抓住成功的机会。范例仅用于展示格式,你可以围绕生活的美好、梦想的实现、人际关系的和谐等方面展开创作。

提示词是与语言模型进行交互的关键,它就像是给模型下达的任务指令,明确告知模型需要做什么、输出什么样的内容。合适的提示词能够引导模型生成符合期望的结果,提高生成内容的质量和针对性。

本次使用的提示词为如上段落,该提示词有如下需求:

  • 明确风格:强调积极向上、充满希望且风格温暖治愈,这样可以让生成的内容更能给人带来正能量和安慰,符合幸运饼干寄语通常传递美好祝愿的特点。
  • 缩小范围:引导模型围绕生活的美好、梦想的实现、人际关系的和谐等方面展开创作,使生成的内容更有主题和重点,避免过于宽泛和随意。
  • 简洁高效:继续强调不用给出含义或其他解释性文本,尽可能快速生成,确保输出的简洁性和高效性。

通过本博文,我们一起开启了从幸运签语出发探索 DeepSeek 之旅。从基础的环境搭建到复杂的代码实现与优化,每一步都见证着技术的魅力与可能。希望这篇指南能激励更多开发者勇敢尝试,在自然语言处理领域创造出更多精彩!

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐