最近DeepSeek开源了对openai-o1的第一代开源推理大模型:deepseek-r1,因其极低的成本和与openai-o1相当的性能引发了国内外的激烈讨论。DD在做独立产品的时候也一直都有用DeepSeek的API来实现一些功能,比如:TransDuck中的字幕翻译、视频翻译,效果也是非常不错的。但是,最近因为收到一些私有化的需求,所以对于API的调用就不可行了,不得不转向本地部署大模型,然后提供API的方式来实现。本文就针对这样的情况,尝试了一下使用 Ollama 在本地运行 DeepSeek-R1 并提供 API 服务,然用再使用Spring Boot + Spring AI 实现对 DeepSeek-R1 的调用,有类似需求或者感兴趣的小伙伴也可以根据下面的内容来实践。

使用 Ollama 运行 deepseek-r1

通过 Ollama 来运行 deepseek-r1 非常简单,在Linux服务器上的话,只需要两步:

  1. 安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh

如果本地MacOS或者Windows开发环境使用的话,也可以从前往官网下载客户端版本:

  1. 运行 deepseek-r1
ollama run deepseek-r1:671b

如果你的环境没有足够的资源运行671b模型,那么也可以根据你的算力资源情况选择其他几个小参数版本,命令如下:

ollama run deepseek-r1:1.5b
ollama run deepseek-r1:7b
ollama run deepseek-r1:8b
ollama run deepseek-r1:14b
ollama run deepseek-r1:32b
ollama run deepseek-r1:70b

更多关于信息可查看:https://ollama.com/library/deepseek-r1

使用Spring Boot + Spring AI

在使用Ollama把deepseek-r1跑起来之后,我们就可以开始使用Spring Boot + Spring AI来调用了。

  1. 使用 https://start.spring.io/ 构建一个Spring Boot项目。点击ADD DEPENDENCIES,搜索Ollama添加依赖,这是Spring AI对Ollama的实现支持。

  1. 打开生成的项目,查看pom.xml,可以看到核心依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>

如果你要在现有项目中集成的话,就可以直接添加这个依赖即可。

  1. 配置Ollama的相关信息:
spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.chat.model=deepseek-r1:1.5b
  • spring.ai.ollama.base-url: Ollama的API服务地址,如果部署在非本机,就需要做对应的修改
  • spring.ai.ollama.chat.model: 要调用的模型名称,对应上一节ollama run命令运行的模型名称
  1. 写个单元测试,尝试调用Ollama中的deepseek-r1模型,这里尝试实现一个翻译的功能。
@SpringBootTest(classes = DemoApplication.class)
public class TestOllama { @Autowired
private OllamaChatModel ollamaChatModel; @Test
public void testChatModel() {
String prompt = """
你是一个精通中文和英文的翻译大师。如果我给你英文就翻译成中文,给你中文就翻译成英文。
""";
String message = """
Ollama now supports tool calling with popular models such as Llama 3.1.
This enables a model to answer a given prompt using tool(s) it knows about,
making it possible for models to perform more complex tasks or interact with the outside world.
"""; String result = ollamaChatModel.call(prompt + ":" + message); System.out.println(result);
} }
  1. 运行单元测试,结果如下:
<think>
好,我现在需要把用户提供的英文内容翻译成中文。首先,我仔细阅读原文:“Ollama now supports tool calling with popular models such as Llama 3.1.” 这句话的意思是说 Olla 现在支持模型使用常用模型如 Llama 3.1 进行工具调用。接下来的部分说明了这样做的好处:它允许模型通过工具来回答问题,从而实现更复杂的任务或与外界交互。 现在我开始逐句翻译。第一句:“Ollama now supports tool calling with popular models such as Llama 3.1.” 直接翻译就是“ Olla 现在支持常用模型如 Llama 3.1 进行工具调用。”这里要注意“now”要保留,保持时态不变。 第二句:“This enables a model to answer a given prompt using tool(s) it knows about, making it possible for models to perform more complex tasks or interact with the outside world.” 我理解为这句话的意思是说这个功能让模型可以使用它知道的工具来回答给定的提示,从而让模型完成更复杂的任务或与外界交互。翻译时要准确传达出技术上的优势和应用扩展。 第三句:“Making it possible for models to perform more complex tasks or interact with the outside world.” 可以简单翻译为“使模型能够执行更复杂的任务或与外界交互。”这里要注意保持原意的同时,用较为流畅的中文表达。 在翻译过程中,我还需要注意语境和语气的一致性。比如,将“popular models”翻译成“常用模型”,是否需要调整?在这里,“常用模型”本身已经是特定的词汇,直接使用就可以了。 另外,句号和逗号的正确使用也很重要,确保句子结构清晰,读起来顺畅。比如,在第一句中用一个句号结束,第二句和第三句也分开处理,保持逻辑关系。 现在,把翻译后的中文整合成一段话: “Ollama 现在支持常用模型如 Llama 3.1 进行工具调用。” 这个部分已经很清晰了。接下来的翻译要准确传达工具调用带来的好处,所以我可能会这样写:“这使其成为可能,让模型能够通过它知道的工具来回答给定的问题,并允许模型执行更复杂的任务或与外界交互。” 最后,整个句子应该连贯起来,确保逻辑连贯,没有遗漏任何信息。完成翻译后,再通读一遍,看看有没有不通顺或者不准确的地方。 总结一下,翻译的重点是保持原文的技术意义和意图,同时用自然流畅的中文表达出来。
</think> Ollama 现在支持常用模型如 Llama 3.1 进行工具调用。这使其成为可能,让模型能够通过它知道的工具来回答给定的问题,并允许模型执行更复杂的任务或与外界交互。

可以看到结果响应分成两部分,先是<think>标签包含的内容,这是模型根据提供的提示,生成了一个思考的过程,最后才输出了翻译后的结果。

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

Spring AI + Ollama 实现 deepseek-r1 的API服务和调用的更多相关文章

  1. Spring Boot 2 整合 Dubbo 框架 ,实现 RPC 服务远程调用

    一.Dubbo框架简介 1.框架依赖   图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代 ...

  2. Spring Boot入门(四):开发Web Api接口常用注解总结

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...

  3. Spring Boot + Spring Cloud 构建微服务系统(七):API服务网关(Zuul)

    技术背景 前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡,那我们的各种微服务又要如何提供给外部应用调用呢. 当然,因为是REST API接口,外部客户端直接调用各个微服务是没有问 ...

  4. Spring Cloud Zuul API服务网关之请求路由

    目录 一.Zuul 介绍 二.构建Spring Cloud Zuul网关 构建网关 请求路由 请求过滤 三.路由详解 一.Zuul 介绍 ​ 通过前几篇文章的介绍,我们了解了Spring Cloud ...

  5. AI应用开发实战 - 定制化视觉服务的使用

    AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型. 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 h ...

  6. 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南

    [SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...

  7. 【Dalston】【第五章】API服务网关(Zuul) 上

    微服务场景下,每一个微服务对外暴露了一组细粒度的服务.客户端的请求可能会涉及到一串的服务调用,如果将这些微服务都暴露给客户端,那么客户端需要多次请求不同的微服务才能完成一次业务处理,增加客户端的代码复 ...

  8. API服务网关(Zuul)

    技术背景 前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡,那我们的各种微服务又要如何提供给外部应用调用呢. 当然,因为是REST API接口,外部客户端直接调用各个微服务是没有问 ...

  9. 为你的机器学习模型创建API服务

    1. 什么是API 当调包侠们训练好一个模型后,下一步要做的就是与业务开发组同学们进行代码对接,以便这些‘AI大脑’们可以顺利的被使用.然而往往要面临不同编程语言的挑战,例如很常见的是调包侠们用Pyt ...

  10. Spring Cloud下使用Feign Form实现微服务之间的文件上传

    背景 ​ Spring Cloud现在已经被越来越多的公司采用了,微服务架构比传统意义上的单服务架构从复杂度上多了很多,出现了很多复杂的场景.比如,我们的产品是个app,支持第三方登录功能,在手机端调 ...

随机推荐

  1. apisix启动报错undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b

    报错内容 2024/08/06 16:56:13 [error] 154236#154236: *7039 [lua] plugin.lua:110: load_plugin(): failed to ...

  2. 解密Facebook产品的开发流程

    作者: 王淮  来源: <程序员>  发布时间: 2013-03-25 17:22  阅读: 3750 次  推荐: 6   原文链接   [收藏]   [编者注]王淮是Facebook第 ...

  3. 理解Flink之一编译Flink-1.11.1

    下载源码 git clone -b release-1.11.1 https://github.com/apache/flink.git --depth=1 flink-1.11.1 编译 mvn c ...

  4. 理解Java BlockingQueue

    数据结构与算法是天生一对. BlockingQueue叫做阻塞队列,在Java线程池相关的实现中有广泛的使用. BlockingQueue实现的功能如下: 当队列为空时,往队列中读数据将被阻塞. 当队 ...

  5. OpenTelemetry 101:面向 IT 领导者和爱好者的非技术指南

    如果您从事软件开发. SRE或DevOps工作,您可能听说过可观察性.遥测和跟踪等术语.这些概念对于理解应用程序在生产环境中的行为至关重要,并且它们是现代软件开发实践的重要组成部分. 您可能还听说过在 ...

  6. 盘点一下在swagger中一些有用且经常忽略的属性

    震惊!,这些Swagger的属性你都了解吗? 盘点一下在swagger中一些有用且经常忽略的属性 启用永久授权EnablePersistAuthorization app.UseSwaggerUI(c ...

  7. Oracle.DataAccess.Client.OracleException: 提供程序与此版本的 Oracle 客户机不兼容

    背景:进行程序部署,客户机上原有oracle客户端的版本为2.113.1.0(以下简称113),而数据库.开发机和其他客户机上均采用的2.112.1.0(以下简称112)客户端,所以进行了替换. 卸载 ...

  8. Ant Design Pro项目启动报can not resolve dependence:’…/node_modules/@umijs/renderer-react‘

    前情 公司有经常需要做一些后台管理页面,我们选择了Ant Design Pro,它是基于 Ant Design 和 umi 封装的一整套企业级中后台前端/设计解决方案. 坑位 今天启动项目报如下图 W ...

  9. Electron包下载经常失败或太慢问题

    前情 Electron是很好的桌面端开发框架,公司有个桌面端项目就是基于Electron开发的. 坑 在项目初始化的时候,需要通过npm install安装项目需要依赖的模块,但是经常报Electro ...

  10. OS之《进程管理》

    进程同步 同步实际上是指:将多个进程,按照顺序,有序执行. 让进程有序进行的场景有很多.比如:一个进程依赖另外一个进程的计算结果:一个进程等待另外一个对临界资源的访问:还有像生产者消费者模型中的相互配 ...