Java 开发者实战:基于 Ollama 与 Solon AI 快速集成 Qwen3 大模型
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 即可看到模型响应。

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());
}
}

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();
}
}

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 方法,然后将结果整合后返回给用户。
