deepseek-r1 学习 spring ai + ollama 组合项目

下载

环境配置成功之后
运行效果


img.png

然后可以访问 http://127.0.0.1:11434/

Ollama is running

spring boot 项目

创建一个简单的spring boot 项目

pox 文件修改

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

添加包

<dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
        </dependency>

配置文件

spring.application.name=deepseek_01
server.port=8081
spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.chat.model=deepseek-r1:7b

自己封装一下


import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;

import java.util.ArrayList;
import java.util.List;

/**
 * 存入上下文信息,并调用接口进行聊天
 */
@Component
public class Completion {
    /**
     * 最大消息记录数
     */
    private final static Integer MAX_SIZE = 10;

    @Resource
    private OllamaChatModel aiClient;
    /**
     * 消息记录
     */
    private List<Message> messages = new ArrayList<>();


    /**
     * 初始化存入系统消息
     */
    @PostConstruct
    private void addSystemMessage() {
        String message = "李白(701年2月28日—762年12月),字太白,号青莲居士,出生于蜀郡绵州昌隆县(今四川省绵阳市江油市青莲镇),一说出生于西域碎叶 ,祖籍陇西成纪(今甘肃省秦安县)。唐朝伟大的浪漫主义诗人,凉武昭王李暠九世孙 。" +
                "为人爽朗大方,乐于交友,爱好饮酒作诗,名列“酒中八仙” 。曾经得到唐玄宗李隆基赏识,担任翰林供奉,赐金放还后,游历全国,先后迎娶宰相许圉师、宗楚客的孙女。唐肃宗李亨即位后,卷入永王之乱,流放夜郎,辗转到达当涂县令李阳冰家。上元二年,去世,时年六十二 。" +
                "著有《李太白集》,代表作有《望庐山瀑布》《行路难》《蜀道难》《将进酒》《早发白帝城》《黄鹤楼送孟浩然之广陵》等。李白所作词赋,就其开创意义及艺术成就而言,享有极为崇高的地位,后世誉为“诗仙”,与诗圣杜甫并称“李杜”。";
        Message systemMessage = new SystemMessage(message);
        messages.add(systemMessage);

        String message1 = "乐观开发者是一个博主。";
        Message systemMessage1 = new SystemMessage(message1);
        messages.add(systemMessage1);
    }

    /**
     * 存储用户发送的消息
     */
    private void addUserMessage(String message) {
        Message userMessage = new UserMessage(message);
        messages.add(userMessage);
    }

    /**
     * 存储AI回复的消息
     */
    private void addAssistantMessage(String message) {
        Message assistantMessage = new AssistantMessage(message);
        messages.add(assistantMessage);
    }

    /**
     * 聊天接口
     */
    public String chat(String message) {
        addUserMessage(message);
        String result = aiClient.call(new Prompt(messages)).getResult().getOutput().getText();
        addAssistantMessage(result);
        update();
        return result;
    }

    /**
     * 流式聊天接口
     */
    public Flux<String> chatStream(String message) {
        addUserMessage(message);

        StringBuffer fullReply = new StringBuffer();

        Flux<String> fluxResult = aiClient.stream(new Prompt(messages))
                .flatMap(response -> {
                    String reply = response.getResult().getOutput().getText();

                    //拼接回复内容
                    fullReply.append(reply);

                    return Flux.just(reply);
                })
                .doOnComplete(() -> {
                    //监听流式响应完成,完整回复存入消息记录
                    System.out.println(fullReply);
                    addAssistantMessage(String.valueOf(fullReply));
                });

        update();
        return fluxResult;
    }

    /**
     * 更新消息记录
     */
    private void update() {
        if (messages.size() > MAX_SIZE) {
            messages = messages.subList(messages.size() - MAX_SIZE, messages.size());
        }
    }
}

controller 中配置

@RestController
public class DemoController {

    @Resource
    private OllamaChatModel ollamaChatModel;

    @Resource
    private Completion completion;

    @GetMapping("/")
    public String hello() {
        return "hello";
    }

    @GetMapping("/talk")    public String talk(String s) {
        String called = completion.chat(s);
        System.out.println(called);
        return called;
    }

    @GetMapping("/chatStream")
    public Flux<String> chatStream(String s) {
        return completion.chatStream(s);
    }

    /**
     * 简单调用
     */
    @PostMapping(value = "/ai/ask")
    public Object ask(String msg) {
        String called = ollamaChatModel.call(msg);
        System.out.println(called);
        return called;
    }

}

效果

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容