3. Ollama 安装,流式输出,多模态,思考模型
<h1 id="3-ollama-安装流式输出多模态思考模型">3. Ollama 安装,流式输出,多模态,思考模型</h1><p>@</p><div class="toc"><div class="toc-container-header">目录</div><ul><li>3. Ollama 安装,流式输出,多模态,思考模型<ul><li><ul><li>接入ollama本地模型<ul><li>本地大模型安装</li><li>基于spring-ai使用 上我们在 Ollama 本地模型部署的大模型</li><li>关闭 thingking</li><li>ollama流式输出</li><li>多模态</li></ul></li></ul></li></ul></li><li>最后:</li></ul></div><p></p>
<h3 id="接入ollama本地模型">接入ollama本地模型</h3>
<p><font style="color: rgba(6, 8, 31, 0.88)">ollama是大语言模型的运行环境 , 支持将开源的大语言模型以离线的方式部署到本地,进行私有化部署。 这也是企业中常用的方案, 因为本地化部署能保证企业级的数据安全, 降低企业使用成本。</font></p>
<p><font style="color: rgba(6, 8, 31, 0.88)">可以将我们的 ollama 理解为是我们的 Docker 容器(Docker 拉取的是镜像),而 Ollama 拉取的就是大模型的镜像,同时运行大模型</font></p>
<h4 id="本地大模型安装">本地大模型安装</h4>
<ol>
<li>
<p>https://ollama.com/download</p>
</li>
<li>
<p>点击下载, 一直下一步即可非常简单</p>
</li>
</ol>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711534-2124965136.png" class="lazyload"></p>
<ol>
<li>安装完后运行cmd --> ollama list 查看已安装的大模型(开始肯定什么都没有)</li>
<li>拉取模型 ollama run qwen3:4b</li>
</ol>
<p>https://ollama.com/library/qwen3</p>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711528-1587759810.png" class="lazyload"></p>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711658-65020861.png" class="lazyload"></p>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711681-358262479.png" class="lazyload"></p>
<pre><code>1. 这里的4b=40亿参数 对应gpu显存差不多是4G ,当然8B也可以只是比较卡
</code></pre>
<ol start="3">
<li>测试</li>
</ol>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711532-872574135.png" class="lazyload"></p>
<h4 id="基于spring-ai使用-上我们在-ollama-本地模型部署的大模型">基于spring-ai使用 上我们在 Ollama 本地模型部署的大模型</h4>
<ol>
<li>添加依赖(添加 ollama 的 SDK 依赖)</li>
</ol>
<pre><code class="language-xml"><dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
</code></pre>
<ol>
<li>配置(配置 ollama 的配置,注意:ollama 是不需要配置 api_key 的,因为只有云端大模型才需要根据你的 api_key 计费算钱,授权。本地大模型是不需要的)。ollama 的默认端口 11434 。</li>
</ol>
<p>ollama 是可以拉取配置运行多个本地大模型的,所以这里需要配置指明我们使用的是 ollama 本地当中的那个大模型</p>
<pre><code class="language-bash">ollama list # 查看 ollama 当前含有配置拉取的有那些大模型
</code></pre>
<pre><code class="language-properties">spring.ai.ollama.base-url= http://localhost:11434# 默认端口是:11434
spring.ai.ollama.chat.model= qwen3:4b
</code></pre>
<ol>
<li>测试</li>
</ol>
<pre><code class="language-java">/**
* @author
*/
@SpringBootTest
public class OllamaTest {
@Test
public void testChat(
// 自动装配了 OllamaChatModel 配置类
@Autowired OllamaChatModel ollamaChatModel) {
String text = ollamaChatModel.call("你是谁");
System.out.println(text);
}
}
</code></pre>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711538-1522240441.png" class="lazyload"></p>
<h4 id="关闭-thingking">关闭 thingking</h4>
<p>因为我们的 qwen3 大模型是一个思考模型(存在一个深度思考的过程),所以可能会思考的比较久,这里我们可以关闭 ollama 当中的大模型思考(深度思考)模式</p>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711571-28236655.png" class="lazyload"></p>
<p>可以通过 在提示词结尾加入“/no_think” 指令</p>
<pre><code class="language-java">String text = ollamaChatModel.call("你是谁/no_think");// 你的提示词上加上 /no_think 软关闭,深度思考过程
System.out.println(text);
</code></pre>
<p>但是依然有<think>标签, 暂时可以前端单独处理下</think></p>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711663-1646225998.png" class="lazyload"></p>
<p>ollama 0.9.0 支持了关闭think。但是在spring1.0版本还不兼容。(就是 ollama 虽然关闭了深度思考,但是我们项目的 Spring 1.0 还不兼容,所以是无效的。就是 OllamaOptions.builder().think()没有这个配置项,应该后面的 Spirng 1.1.x 就可能会有了)</p>
<pre><code class="language-bash">ollama run qwen3:4b # 进入到对应要不关闭深度思考的大模型
/set nothink#关闭该大模型的深度思考
</code></pre>
<p>https://ollama.com/blog/thinking</p>
<h4 id="ollama--流式输出">ollama流式输出</h4>
<p>stream + tools BUG 修复 spring ai 1.0 ollama 修改了</p>
<p>springai 1.0 小 BUG 使用stream + tools ,会报一个 #3372</p>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711726-245174316.png" class="lazyload"></p>
<pre><code class="language-java">@Test
public void testStream(@Autowired OllamaChatModel chatModel) {
Flux<String> stream = chatModel.stream("你是谁/no_think");
// 阻塞输出
stream.toIterable().forEach(System.out::println);
}
</code></pre>
<p>ollama 0.8.0之前的版本不支持 stream+ollama</p>
<p>https://ollama.com/blog/streaming-tool 0.8.0+支持stream+ollama . 但是和springai1.0有兼容问题:https://github.com/spring-projects/spring-ai/issues/3369</p>
<h4 id="多模态">多模态</h4>
<p><strong>注意:多模态是识别,多中不同文件的内容,理解不同文件的内容,而不是生成</strong>。</p>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711693-1469027389.png" class="lazyload"></p>
<p>目前ollama支持的多模态模型:</p>
<ul>
<li>Meta Llama 4</li>
<li>Google Gemma 3</li>
<li>Qwen 2.5 VL</li>
<li>Mistral Small 3.1</li>
<li><font style="color: rgba(0, 0, 0, 1)">and more </font>vision models<font style="color: rgba(0, 0, 0, 1)">.</font></li>
</ul>
<p><font style="color: rgba(0, 0, 0, 1)">这里我们使用 ollama 拉取一个 gemma3:1b 的大模型测试:附上地址</font></p>
<pre><code class="language-java">/**
* 多模态图像识别,采用的gemma3
* @param ollamaChatModel
*/
@Test
public void testMultimodality(@Autowired OllamaChatModel ollamaChatModel) {
// 指定读取文件的路径
var imageResource = new ClassPathResource("gradle.png");
// 指定大模型的配置项,这里使用 ollama 拉取当中的 gemma3 大模型
OllamaOptions ollamaOptions = OllamaOptions.builder()
.model("gemma3")
.build();
// 说明读取的是那个类型的多模态文件类型,这里是图片 img
Media media = new Media(MimeTypeUtils.IMAGE_PNG, imageResource);
ChatResponse response = ollamaChatModel.call(
new Prompt(
UserMessage.builder().media(media)
.text("识别图片").build(), // 写明提示词
ollamaOptions
)
);
System.out.println(response.getResult().getOutput().getText());
}
</code></pre>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201711669-1665064859.png" class="lazyload"></p>
<h1 id="最后">最后:</h1>
<blockquote>
<p>“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”</p>
<p><img alt="在这里插入图片描述" loading="lazy" src="https://img2024.cnblogs.com/blog/3084824/202509/3084824-20250926201712394-1501537699.gif" class="lazyload"></p>
</blockquote><br><br>
来源:https://www.cnblogs.com/TheMagicalRainbowSea/p/19114179
頁:
[1]