Solon AI 开发学习4 - chat - 模型实例的构建和简单调用

聊天模型接口(ChatModel)支持:

  • 同步调用(call),一次性返回结果
  • 支流式调用(stream,基于 reactivestreams 规范)。通过 ssex-ndjson 流式返回结果。
  • Tool Call(或 Function Call) 与本地数据互动(需要 llm 支持)
  • 提示语多消息输入输出(记忆体)
  • 带图片消息
  • 与 solon-flow 结合使用

1、聊天模型的构建

  • 配置方式构建
yaml 复制代码
solon.ai.chat:
  demo:
    apiUrl: "http://127.0.0.1:11434/api/chat" # 使用完整地址(而不是 api_base)
    provider: "ollama" # 使用 ollama 服务时,需要配置 provider
    model: "llama3.2"
    headers:
      x-demo: "demo1"
java 复制代码
import org.noear.solon.ai.chat.ChatConfig;
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;

@Configuration
public class DemoConfig {
    @Bean
    public ChatModel build(@Inject("${solon.ai.chat.demo}") ChatConfig config) {
        return ChatModel.of(config).build();
    }
}
  • 手动方式构建
java 复制代码
@Configuration
public class DemoConfig {
    @Bean
    public ChatModel build() {
        return ChatModel.of("http://127.0.0.1:11434/api/chat") //使用完整地址(而不是 api_base)
                .provider("ollama")
                .model("llama3.2")
                .headerSet("x-demo", "demo1")
                .defaultOptionAdd("stream_options", Utils.asMap("include_usage", true))
                .build();
    }
}

2、同步调用(call)

java 复制代码
public void case1() throws IOException {
    ChatResponse resp = chatModel.prompt("hello").call();

    //打印消息
    log.info("{}", resp.getMessage());
}

3、异步流式或响应式调用(stream)

流式返回为 org.reactivestreams.Publisher(reactivestreams 规范)

java 复制代码
public void case2() throws IOException {
  Publisher<ChatResponse> publisher = chatModel.prompt(ChatMessage.ofUser("hello")).stream();
  
  //return publisher; //使用 solon-web-rx 时可直接返回;或者对接 solon-web-sse 或 websocket

  publisher.subscribe(new SimpleSubscriber<ChatResponse>()
          .doOnNext(resp -> {
              log.info("{}", resp.getMessage());
          }).doOnComplete(() -> {
              log.debug("::完成!");
          }).doOnError(err -> {
              log.error("{}", err);
          }));
}

可以直接订阅消费(如上)。也可对接各种流行的响应式框架,比如 mutiny、rxjava 或 reactor:

java 复制代码
@Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE)
@Mapping("case2")
public Flux<SseEvent> case2(String prompt) throws IOException {
    return Flux.from(chatModel.prompt(prompt).stream())
            .map(resp -> resp.getMessage())
            .map(msg -> new SseEvent().data(msg.getContent()))
            .doOnError(err->{
                 log.error("{}", err);
            });
}

4、模型日志

内部默认会打印 llm 请求与响应的日志,分别以 ai-request:ai-response: 开头。日志级别为:DEBUG。

相关推荐
唐青枫1 小时前
Java Spring WebFlux 实战指南:用 Mono、Flux 和 WebClient 写响应式接口
java·spring
doiito1 小时前
【Agent Harness】Gliding Horse 记忆系统深度剖析:像 CPU 一样思考的 AI 记忆架构
ai·rust·架构设计·系统设计·ai agent
mobility13 小时前
免费AI视频生成器:我如何用零成本做出带旁白字幕的多场景AI视频
ai·vibe coding
小bo波15 小时前
使用Thread子类创建线程 VS 使用Runnable接口创建线程的区别
java·多线程·thread·并发编程·runnable
SamDeepThinking15 小时前
高并发场景下,CompletableFuture与ForkJoinPool该如何取舍?
java·后端·面试
doiito17 小时前
【Agent Harness】Gliding Horse 给 Agent OS 装上双曲空间引擎与默克尔树边云同步
ai·rust·架构设计·系统设计·ai agent
张不才18 小时前
CPU 100% 了怎么办?Java 性能排障的标准化操作
java·后端
knqiufan19 小时前
从 Python 到 TypeScript,用 GLM-5.2 跑通 PowerMem SDK 的长程任务工程
ai·memory·agentic·powermem
shepherd11119 小时前
吞吐量提升 10 倍:高并发大批量数据处理任务的架构演进与性能调优
java·后端·架构
plainGeekDev1 天前
单例模式 → object 声明
android·java·kotlin