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