qwen3 惊喜发布,用 ollama + solon ai (java) 尝个鲜

qwen3 惊喜发布了,帅!我们用 ollama 和 solon ai (java) 也来尝个鲜。

1、先用 ollama 拉取模型

听说,在个人电脑上用 4b 的参数,效果就很好了。

arduino 复制代码
ollama run qwen3:4b

2、试试:Hello qwen3

用 solon-initializr ( solon.noear.org/start/ ),生成一个 solon-ai 模板项目。之后:

  • 在应用属性里添加配置(app.yml)
yaml 复制代码
solon.ai.chat:
  qwen3:
    apiUrl: "http://127.0.0.1:11434/api/chat" # 使用完整地址(而不是 api_base)
    provider: "ollama"  # ollama 是有自己的专有接口格式,通过配置 provider 可识别方言
    model: "qwen3:4b"
  • 用配置器类构建通用聊天模型
java 复制代码
@Configuration
public class DemoConfig {
    @Bean
    public ChatModel chatModel(@Inject("${solon.ai.chat.qwen3}") ChatConfig config) {
        return ChatModel.of(config).build();
    }
}
  • 添加测试用的控制器
java 复制代码
@Controller
public class DemoController {
    @Inject
    ChatModel chatModel;

    @Mapping("hello")
    public String hello(String message) throws IOException {
        return chatModel.prompt(message).call().getMessage().getContent();
    }
}
  • 测试一下

启动项目。打开浏览器地址:http://localhost:8080/hello?message=hello。效果良好:

3、尝试把输出改成 sse,方便打字效果的聊天窗口开发

java 复制代码
@Controller
public class DemoController {
    @Inject
    ChatModel chatModel;

    @Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE) //这个很重要,申明用 sse 格式渲染
    @Mapping("hello")
    public Flux<String> hello(String message) throws IOException {
        return Flux.from(chatModel.prompt(message).stream())
                .filter(resp -> resp.hasChoices())
                .map(resp -> resp.getMessage().getContent());
    }
}
  • 测试一下

启动项目。再次打开浏览器地址:http://localhost:8080/hello?message=hello。效果良好:

4、现在开始 RAG,以 "联网搜索" 作为知识库

这里把"联网搜索",做为一个知识库使用(内部是动态搜索的)。用它作为 RAG 的外部检索支持。

  • 应用属性加一块配置
yaml 复制代码
solon.ai.chat:
  qwen3:
    apiUrl: "http://127.0.0.1:11434/api/chat" # 使用完整地址(而不是 api_base)
    provider: "ollama"  # ollama 是有自己的专有接口格式,通过配置 provider 可识别方言
    model: "qwen3:4b"
    
solon.ai.repo:
  websearch:
    apiUrl: "https://api.bochaai.com/v1/web-search" # 使用完整地址(而不是 api_base)
    apiKey: "sk-demo..."
  • 配置器类也调整下
java 复制代码
@Configuration
public class DemoConfig {
    @Bean
    public ChatModel chatModel(@Inject("${solon.ai.chat.qwen3}") ChatConfig config) {
        return ChatModel.of(config).build();
    }
    
    @Bean
    public Repository repository(@Inject("${solon.ai.repo.websearch}") AiConfig config) {
        return new WebSearchRepository(null, config);
    }
}
  • 再改改控制器(输出重新写回简单的方式,不然不好截图)
java 复制代码
@Controller
public class DemoController {
    @Inject
    ChatModel chatModel;

    @Inject
    Repository repository;

    @Mapping("hello")
    public String hello(String message) throws IOException {
        //检索
        List<Document> context = repository.search(new QueryCondition(message).limit(4));

        //消息增强
        ChatMessage chatMessage = UserMessage.augment(message, context);

        //提交大模型并简单返回(不然,截图不好截)
        return chatModel.prompt(chatMessage).call().getMessage().getContent();
    }
}
  • 测试一下

启动项目。打开浏览器地址:http://localhost:8080/hello?message=solon%20%E6%98%AF%E8%B0%81%E5%BC%80%E5%8F%91%E7%9A%84%EF%BC%9F。效果良好:

5、再试个 Tool Call(即 Function Call)

修改下刚才的配置器,加个模型的默认工具。

java 复制代码
@Configuration
public class DemoConfig {
    @Bean
    public ChatModel chatModel(@Inject("${solon.ai.chat.qwen3}") ChatConfig config) {
        return ChatModel.of(config)
                .defaultToolsAdd(new Tools())
                .build();
    }

    public static class Tools {
        @ToolMapping(description = "获取指定城市的天气情况")
        public String get_weather(@ToolParam(description = "根据用户提到的地点推测城市") String location) {
            return "晴,24度";
        }
    }
}
  • 测试一下

启动项目。再次打开浏览器地址:http://localhost:8080/hello?message=杭州今天的天气如何?。效果良好:

相关推荐
摆烂工程师1 小时前
GPT-Image-2 真有点夯:中文不乱码了!GPT-Image-2的入口在哪?教你如何确认自己是否被灰度推送了 GPT-Image-2
gpt·chatgpt·openai
MY_TEUCK2 小时前
Sealos 平台部署实战指南:结合 Cursor 与版本发布流程
java·人工智能·学习·aigc
我爱cope2 小时前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
朝新_3 小时前
【Spring AI 】图像与语音模型实战
java·人工智能·spring
RH2312113 小时前
2026.4.16Linux 管道
java·linux·服务器
zmsofts3 小时前
java面试必问13:MyBatis 一级缓存、二级缓存:从原理到脏数据,一篇讲透
java·面试·mybatis
aq55356005 小时前
编程语言三巨头:汇编、C++与PHP大比拼
java·开发语言
我是无敌小恐龙5 小时前
Java SE 零基础入门Day01 超详细笔记(开发前言+环境搭建+基础语法)
java·开发语言·人工智能·opencv·spring·机器学习
心态与习惯6 小时前
Julia 初探,及与 C++,Java,Python 的比较
java·c++·python·julia·比较
刘大猫.6 小时前
华为昇腾芯片将为DeepSeek-V4推理,通往国产算力自由
华为·ai·大模型·算力·deepseek·deepseek-v4·昇腾芯片