当前位置:首页 > 技术 > 正文内容

Java 开发者实战:基于 Ollama 与 Solon AI 快速集成 Qwen3 大模型

访客 技术 2026年9月14日 13

Qwen3 模型的发布为开发者带来了更强大的本地大模型体验。本文将介绍如何结合 Ollama 环境,利用 Java 生态中的 Solon AI 框架快速接入 Qwen3,并实现流式输出、RAG(检索增强生成)以及 Tool Call(工具调用)等进阶功能。

1. 环境准备:通过 Ollama 部署 Qwen3

在本地环境中,推荐使用 Qwen3 的 4b 版本,它在保持较低资源占用的同时,能提供非常出色的响应效果。执行以下命令拉取并运行模型:

ollama run qwen3:4b

2. 基础接入:Hello Qwen3

通过 Solon Initializr 创建一个 Solon AI 模板项目。首先在 app.yml 配置文件中定义模型连接信息:

solon.ai.chat:
  qwen3_service:
    apiUrl: "http://127.0.0.1:11434/api/chat"
    provider: "ollama"  # 指定服务提供商以匹配特定 API 格式
    model: "qwen3:4b"

接下来,编写配置类将配置信息注入并构建为 ChatModel 实例:

@Configuration
public class AiBeanConfig {
    @Bean
    public ChatModel qwenModel(@Inject("${solon.ai.chat.qwen3_service}") ChatConfig config) {
        return ChatModel.of(config).build();
    }
}

创建一个简单的控制器处理用户请求:

@Controller
public class ChatController {
    @Inject
    private ChatModel qwenModel;

    @Mapping("ask")
    public String ask(String input) {
        return qwenModel.prompt(input).call().getMessage().getContent();
    }
}

访问 http://localhost:8080/ask?input=hello 即可看到模型响应。

Qwen3 基础响应示例

3. 实现流式响应 (SSE)

为了提升用户体验,模拟打字机的交互效果,可以将输出改为 SSE(Server-Sent Events)格式。Solon AI 对此提供了原生支持:

@Controller
public class StreamController {
    @Inject
    private ChatModel qwenModel;

    @Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE) 
    @Mapping("stream")
    public Flux<String> stream(String input) {
        return Flux.from(qwenModel.prompt(input).stream())
                .filter(resp -> resp.hasChoices())
                .map(resp -> resp.getMessage().getContent());
    }
}

SSE 流式输出示例

4. RAG 实战:接入联网搜索知识库

RAG 能够通过外部知识扩展模型的认知边界。这里我们以联网搜索作为动态知识库。首先在 app.yml 中配置搜索服务:

solon.ai.repo:
  search_engine:
    apiUrl: "https://api.bochaai.com/v1/web-search"
    apiKey: "your_api_key_here"

更新配置类和控制器逻辑,实现"先搜索、后生成":

@Configuration
public class RagConfig {
    @Bean
    public Repository searchRepo(@Inject("${solon.ai.repo.search_engine}") AiConfig config) {
        return new WebSearchRepository(null, config);
    }
}

@Controller
public class RagController {
    @Inject
    private ChatModel qwenModel;
    @Inject
    private Repository searchRepo;

    @Mapping("search_chat")
    public String searchChat(String question) {
        // 执行外部检索
        List<Document> docs = searchRepo.search(new QueryCondition(question).limit(3));
        
        // 增强上下文消息
        ChatMessage augmentedMsg = UserMessage.augment(question, docs);

        return qwenModel.prompt(augmentedMsg).call().getMessage().getContent();
    }
}

RAG 联网检索示例

5. 进阶功能:Tool Call(函数调用)

Tool Call 允许大模型在需要时主动调用我们定义的 Java 方法。通过在配置 ChatModel 时注册工具类即可实现:

@Configuration
public class ToolConfig {
    @Bean
    public ChatModel qwenWithTools(@Inject("${solon.ai.chat.qwen3_service}") ChatConfig config) {
        return ChatModel.of(config)
                .defaultToolsAdd(new WeatherService())
                .build();
    }

    public static class WeatherService {
        @ToolMapping(description = "获取目标城市的实时天气情况")
        public String queryWeather(@ToolParam(description = "城市名称") String location) {
            // 此处可接入真实的天气 API
            return location + "当前天气:晴,气温 24 摄氏度";
        }
    }
}

当用户询问"杭州今天天气怎么样?"时,模型会自动识别并调用 queryWeather 方法,然后将结果整合后返回给用户。

Tool Call 运行结果

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。