当前位置: 首页 > article >正文

大模型LLM之SpringAI:Web+AI(二)

2.2.2、ChatModel API(聊天模型API)

聊天模型太多了,这里只写OpenAI和Ollama

ChatModel和ChatClient区别:ChatClient针对的是所有模型,共用一个客户端。而ChatModel是针对各个模型实现的。

(1)OpenAI
自动配置
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
重试属性
属性名称 描述 默认值
spring.ai.retry.max-attempts 重试尝试的最大次数。 10
spring.ai.retry.backoff.initial-interval 指数退避策略的初始休眠持续时间。 2 sec.
spring.ai.retry.backoff.multiplier 回退间隔乘数。 5
spring.ai.retry.backoff.max-interval 最大回退持续时间。 3 min.
spring.ai.retry.on-client-errors 如果为 false,则引发 NonTransientAiException,并且不要尝试重 4xx 试客户端错误代码 false
spring.ai.retry.exclude-on-http-codes 不应触发重试的 HTTP 状态代码列表(例如,抛出 NonTransientAiException)。 empty
spring.ai.retry.on-http-codes 应触发重试的 HTTP 状态代码列表(例如,抛出 TransientAiException)。 empty
连接属性
属性名称 描述 默认值
spring.ai.openai.base-url 要连接到的 URL api.openai.com
spring.ai.openai.api-key API 密钥
配置属性
属性名称 描述 默认值
spring.ai.openai.chat.enabled 启用 OpenAI 聊天模型。 true
spring.ai.openai.chat.base-url 可选覆盖spring.ai.openai.base-url以提供聊天特定的url -
spring.ai.openai.chat.api-key 可选覆盖spring.ai.openai.api-key以提供聊天特定的api-key。 -
spring.ai.openai.chat.options.model 这是要使用的 OpenAI 聊天模型。 gpt-4ogpt-4-turbo 、、 gpt-4-turbo-2024-04-09 gpt-4-0125-previewgpt-4-turbo-preview gpt-4-vision-preview gpt-4-32k gpt-3.5-turbo gpt-3.5-turbo-0125 gpt-3.5-turbo-1106 。有关详细信息,请参阅模型页面。 gpt-3.5-turbo
spring.ai.openai.chat.options.temperature 用于控制生成的完成的明显创造力的采样温度。较高的值将使输出更加随机,而较低的值将使结果更加集中和确定。不建议为相同的完成请求修改温度和top_p,因为这两个设置的交互很难预测。 0.8
spring.ai.openai.chat.options.frequencyPenalty 介于 -2.0 和 2.0 之间的数字。到目前为止,正值会根据新标记在文本中的现有频率来惩罚新标记,从而降低模型逐字重复同一行的可能性。 0.0f
spring.ai.openai.chat.options.logitBias 修改指定标记在完成中出现的可能性。 -
spring.ai.openai.chat.options.maxTokens 聊天完成时要生成的最大令牌数。输入令牌和生成的令牌的总长度受模型上下文长度的限制。 -
spring.ai.openai.chat.options.n 要为每个输入消息生成多少个聊天完成选项。请注意,您将根据所有选项中生成的令牌数量付费。将 n 保持为 1 以最大程度地降低成本。 1
spring.ai.openai.chat.options.presencePenalty 介于 -2.0 和 2.0 之间的数字。正值会根据新标记到目前为止是否出现在文本中来惩罚它们,从而增加了模型谈论新主题的可能性。 -
spring.ai.openai.chat.options.responseFormat 一个对象,指定模型必须输出的格式。设置为 { "type": "json_object" } 启用 JSON 模式,该模式可保证模型生成的消息是有效的 JSON。 -
spring.ai.openai.chat.options.seed 此功能处于测试阶段。如果指定,我们的系统将尽最大努力确定性地进行采样,以便具有相同种子和参数的重复请求应返回相同的结果。 -
spring.ai.openai.chat.options.stop 最多 4 个序列,API 将停止生成更多令牌。 -
spring.ai.openai.chat.options.topP 温度采样的一种替代方法,称为原子核抽样,其中模型考虑具有top_p概率质量的标记的结果。因此,0.1 表示仅考虑包含前 10% 概率质量的代币。我们通常建议改变这个温度或温度,但不要两者兼而有之。 -
spring.ai.openai.chat.options.tools 模型可以调用的工具列表。目前,仅支持将函数作为工具。使用它来提供模型可能为其生成 JSON 输入的函数列表。 -
spring.ai.openai.chat.options.toolChoice 控制模型调用哪个(如果有)函数。None 表示模型不会调用函数,而是生成一条消息。自动意味着模型可以在生成消息或调用函数之间进行选择。通过 {“type: ”function“, ”function“: {”name“: ”my_function“}} 指定特定函数会强制模型调用该函数。当不存在任何函数时,None 是默认值。如果存在函数,则 AUTO 是默认值。 -
spring.ai.openai.chat.options.user 代表您的最终用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。 -
spring.ai.openai.chat.options.functions 函数列表,由其名称标识,用于在单个提示请求中启用函数调用。具有这些名称的函数必须存在于 functionCallbacks 注册表中。 -
运行时选项

OpenAiChatOptions.java提供模型配置,例如要使用的模型、温度、频率损失等。启动时,可以使用 OpenAiChatModel(api, options) 构造函数或 spring.ai.openai.chat.options.* 属性配置默认选项。在运行时,您可以通过向 Prompt 调用添加新的特定于请求的选项来覆盖默认选项。例如,要覆盖特定请求的默认模型和温度:

ChatResponse response = chatModel.call(
    new Prompt(
        "Generate the names of 5 famous pirates.",
        OpenAiChatOptions.builder()
            .withModel("gpt-4-32k")
            .withTemperature(0.4)
        .build()
    ));
多模态

多模态是指模型同时理解和处理来自各种来源的信息的能力,包括文本、图像、音频和其他数据格式。目前,OpenAI gpt-4-visual-previewgpt-4o 模型提供多模式支持。有关更多信息,请参阅愿景指南。OpenAI 用户消息 API 可以将 base64 编码的图像列表或图像 url 与消息合并。Spring AI 的 Message 接口通过引入 Media 类型来促进多模态 AI 模型。此类型包含有关消息中媒体附件的数据和详细信息,使用 Spring org.springframework.util.MimeTypejava.lang.Object 作为原始媒体数据。下面是一个代码示例,摘自 OpenAiChatModelIT.java,演示了用户文本与使用模型 GPT_4_VISION_PREVIEW 的图像的融合。

byte[] imageData = new ClassPathResource("/multimodal.test.png").getContentAsByteArray();

var userMessage = new UserMessage("Explain what do you see on this picture?",
        List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));

ChatResponse response = chatModel.call(new Prompt(List.of(userMessage),
        OpenAiChatOptions.builder().withModel(OpenAiApi.ChatModel.GPT_4_VISION_PREVIEW.getValue()).build()));

或使用模型 GPT_4_O 的图像 URL 等效项:

var userMessage = new UserMessage("Explain what do you see on this picture?",
        List.of(new Media(MimeTypeUtils.IMAGE_PNG,
                "https://docs.spring.io/spring-ai/reference/1.0-SNAPSHOT/_images/multimodal.test.png")));

ChatResponse response = chatModel.call(new Prompt(List.of(userMessage),
        OpenAiChatOptions.builder().withModel(OpenAiApi.ChatModel.GPT_4_O.getValue()).build()));
Controller样例
@RestController
public class ChatController {
   

    private final OpenAiChatModel chatModel;

    @Autowired
    public ChatController(OpenAiChatModel chatModel) {
   
        this.chatModel = chatModel;
    }

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
   
        return Map.of("generation", chatModel.call(message));
    }

    @GetMapping("/ai/generateStream")
	public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
   
        Prompt prompt = new Prompt(new UserMessage(message));
        return chatModel.stream(prompt);
    }
}

配置参数

spring.ai.openai.api-key=YOUR_API_KEY
spring.ai.openai.chat.options.model=gpt-3.5-turbo
spring.ai.openai.chat.options.temperature=0.7
底层openAIAPi客户端

OpenAiApi 提供的是用于 OpenAI 聊天 API 的轻量级 Java 客户端 OpenAI 聊天 API。
在这里插入图片描述
下面是一个如何以编程方式使用 api 的简单片段:

OpenAiApi openAiApi =
    new OpenAiApi(System.getenv("OPENAI_API_KEY"));

ChatCompletionMessage chatCompletionMessage =
    new ChatCompletionMessage("Hello world", Role.USER);

// Sync request
ResponseEntity<ChatCompletion> response = openAiApi.chatCompletionEntity(
    new ChatCompletionRequest(List.of(chatCompletionMessage), "gpt-3.5-turbo", 0.8f, false));

// Streaming request
Flux<ChatCompletionChunk> streamResponse = openAiApi.chatCompletionStream(
        new ChatCompletionRequest

http://www.kler.cn/a/301402.html

相关文章:

  • leetcode-44-通配符匹配
  • Linux守护Pythom脚本运行——Supervisor学习总结
  • 2411rust,76~79
  • 通过 Docker 对 MySQL 做主从复制的时候,因为ip不对导致不能同步。后又因为二进制的偏移量写的不对,导致不能同步的问题
  • C++网络编程之SSL/TLS加密通信
  • 详细分析ip addr show 查看网络配置的命令
  • Android——service使用详解
  • 快速上手Spring Boot应用
  • Python语言开发学习之使用Python预测天气
  • 二十三种设计模式之建造者模式(类比汽车制造厂好理解一些)
  • sqlite3 相关知识
  • 嵌入式边缘计算:融合创新与未来展望
  • 有关WSL和docker的介绍
  • Qt-常用控件(3)-多元素控件、容器类控件和布局管理器
  • 在 ArkTS 中,如何有效地进行内存管理和避免内存泄漏?
  • Android12_13左上角状态栏数字时间显示右移动
  • 文档大模型,能否真正解决非结构化数据难题
  • 【kubernetes】配置管理中心Configmap运用
  • vue2实现歌曲播放和歌词滚动效果
  • 【鸿蒙】HarmonyOS NEXT星河入门到实战5-基础语法
  • 【F的领地】项目拆解:小学教辅资料
  • 海外云手机——跨国业务的高效工具
  • Python中如何判断一个变量是否为None
  • Ubuntu快速安装Python3
  • 【C++】——vector
  • 数据库的介绍:关系型数据库和非关系型数据库究竟是什么?