《SpringAI 入门教程》9. 模型配置选项 ChatOptions 使用

88 阅读1分钟

在SpringAI中,ChatOptions封装了大模型的可选参数,比如:

  • 模型选择(model)
  • 温度(temperature,控制随机性)
  • topP/topK(采样方式)
  • 最大输出长度(maxTokens)
  • 惩罚项(presencePenalty/FrequencyPenalty):控制模型生成时的重复问题,数值越大,模型越倾向于往“新话题”拓展。

ChatOptions可以


import lombok.AllArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@AllArgsConstructor
@RestController
public class PromptChatOptionsController {

    private final OllamaChatModel chatModel;

    @RequestMapping(value = "/promptChatOptions", produces = "text/stream;charset=UTF-8")
    public Flux<String> promptChatOptions(@RequestParam("userInput") String userInput) {
        String prompt = """
                # 角色说明
                你是一名专业的法律顾问AI,请根据用户提出的问题,按下列要求做出回答。
                                        
                ## 回复格式
                1. 问题分析
                2. 相关一句
                3. 梳理和建议
                                        
                ** 特别注意: **
                - 不承担律师责任。
                - 不生成涉敏、虚假内容。
                                        
                当前服务的用户:
                用户: {name},年龄:{age}, 性别:{sex}
                """;
        ChatClient chatClient = ChatClient.builder(chatModel)
                //.defaultSystem(prompt)
                .defaultOptions(ChatOptions.builder()
                        .model("gemma3:270m") // 指定模型
                        .temperature(0.5) // 发散水平
                        .maxTokens(300) // 允许输出的最大token数
                        .presencePenalty(0.6) // 避免模型一直围绕相同主题
                        .frequencyPenalty(0.8) // 避免句子重复用词
                        .build())
                .build();
        return chatClient.prompt()
                .system(p -> p.text(prompt).param("name", "张三").param("age", "18").param("sex", "男"))
                .user(userInput)
                .stream()
                .content();
    }
}