ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring AI 介绍与入门使用 -- 一个Java版Langchain [打印本页]

作者: 王國慶    时间: 2024-10-12 07:51
标题: Spring AI 介绍与入门使用 -- 一个Java版Langchain


Langchain 是什么?

Langchain 是一个Python 的AI开发框架,它集成了模子输入输出、检索、链式调用、内存记忆(Memory)、Agents以及回调函数等功能模块。通过这些模块的协同工作,它能够支持复杂的对话场景和任务实行流程,同时使用模板(Templates)机制简化开发过程,让开发者可以更加机动高效地构建基于AI的应用服务。
Langchain虽好,怎样Java不能用

Langchain的核心题目在于它主要是用Python实现的,过去Java社区中缺乏一个由专门团队维护的、功能美满的类Langchain框架。不过这个题目随着Spring 团队的参与得到了解决。使得Java距离AI又进了一步。
Spring AI 介绍

Spring AI 是由Pivotal的Spring团队专门维护的AI调用框架,它通过标准化不同AI服务提供商的接口实现,使开发者能够以统一的方式编写代码,并仅通过修改配置即可轻松切换不同的AI实现。该框架兼容多种基于流的机器人模子,并提供了一系列实用工具如Prompt Template和OutputParser等,极大地简化了AI应用开发流程。
Spring AI Alibaba介绍

Spring AI Alibaba 是 Spring AI 的实现,支持阿里云百炼系列模子。其特征包罗:统一的模子输入输出接口、向量检索功能(兼容Elasticsearch、PG等存储)、Prompt Template 用于机动生成提示词,以及 Function Calling 支用来调用自定义函数以扩展模子本领。这些特性使得开发者能够便捷地集成和使用多种AI模子,提升开发效率。

Spring Ai Alibaba 的例子之一:简单的对话,基于Prompt

基于Spring Boot集成Spring AI Alibaba,完成一个简单的对话模子,并使用Prompt本领和ChatClient本领以及Flux流返回,可以遵循以下步调:
1. 情况准备



2. 配置阿里云通义千问API Key

首先需要访问阿里云百炼页面并登录您的账号。接着选择开通“百炼大模子推理”服务,按照提示操作直到乐成申请到API Key。将获取到的API Key记载下来,后续配置中会用到。
通义如今有免费额度,不费钱的,羊毛薅起来
3. 设置情况变量

为了安全地管理敏感信息,推荐通过情况变量设置API Key:
  1. export AI_DASHSCOPE_API_KEY=${YOUR_VALID_API_KEY}
复制代码
同时,在application.properties文件里引用这个情况变量以确保应用能够读取到API Key:
  1. spring.ai.dashscope.api-key: ${AI_DASHSCOPE_API_KEY}
复制代码
4. 添加堆栈与依赖

由于Spring AI Alibaba尚处于Milestone阶段,需添加特定堆栈来获取相干依赖。编辑pom.xml文件,加入如下内容:
  1. <repositories>
  2.     <repository>
  3.         <id>sonatype-snapshots</id>
  4.         <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  5.         <snapshots>
  6.             <enabled>true</enabled>
  7.         </snapshots>
  8.     </repository>
  9.     <repository>
  10.         <id>spring-milestones</id>
  11.         <name>Spring Milestones</name>
  12.         <url>https://repo.spring.io/milestone</url>
  13.         <snapshots>
  14.             <enabled>false</enabled>
  15.         </snapshots>
  16.     </repository>
  17.     <repository>
  18.         <id>spring-snapshots</id>
  19.         <name>Spring Snapshots</name>
  20.         <url>https://repo.spring.io/snapshot</url>
  21.         <releases>
  22.             <enabled>false</enabled>
  23.         </releases>
  24.     </repository>
  25. </repositories>
复制代码
然后,在同一文件内增长对spring-ai-alibaba-starter及其父级Spring Boot项目的依赖:
  1. <parent>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-parent</artifactId>
  4.     <version>3.3.4</version>
  5.     <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. <dependencies>
  8.     <dependency>
  9.         <groupId>com.alibaba.cloud.ai</groupId>
  10.         <artifactId>spring-ai-alibaba-starter</artifactId>
  11.         <version>1.0.0-M2</version>
  12.     </dependency>
  13.     <!-- 其他所需依赖... -->
  14. </dependencies>
复制代码
5. 编写控制器代码

创建一个REST控制器类,注入ChatClient实例,并实现基本的聊天功能。这里我们将使用Flux流返回方式提供实时相应。
  1. @RestController
  2. @RequestMapping("/ai")
  3. @CrossOrigin(origins = "*")
  4. public class ChatController {
  5.     private final ChatClient chatClient;
  6.     public ChatController(ChatClient.Builder builder) {
  7.         this.chatClient = builder.build();
  8.     }
  9.     @GetMapping("/chat")
  10.     public Flux<String> chat(@RequestParam String input) {
  11.         return this.chatClient.prompt()
  12.                 .user(input)
  13.                 .stream()
  14.                 .content();
  15.     }
  16. }
复制代码
6. 使用Prompt模板增强交互

为了使对话更加丰富和可控,我们可以引入Prompt模板机制。这要求我们先定义一个模板文件(例如joke-prompt.st),其内容大概类似于:
  1. Tell me a {adjective} joke about {topic}.
复制代码
接着修改之前的控制器,使其能够从指定的模板文件加载并填充参数:
  1. @Autowired
  2. private Resource jokeResource;
  3. @GetMapping("/promptedChat")
  4. public Flux<String> promptedChat(@RequestParam(value = "adjective", defaultValue = "funny") String adjective,
  5.                                  @RequestParam(value = "topic", defaultValue = "cows") String topic) {
  6.     PromptTemplate promptTemplate = new PromptTemplate(jokeResource);
  7.     Prompt prompt = promptTemplate.create(Map.of("adjective", adjective, "topic", topic));
  8.    
  9.     return this.chatClient.prompt(prompt)
  10.             .stream()
  11.             .content();
  12. }
复制代码


Spring Ai Alibaba 例子2 ,function calling 函数回调

具体步调

联合上述分析及我了解的信息中给出的发起,下面提供了一个具体的实例,展示了如何基于Spring Boot集成Spring AI Alibaba完成一个function calling,并使用Prompt本领与Flux流返回数据。
前提条件




项目配置

确保你的pom.xml文件里包罗如下依赖:
  1. <parent>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-parent</artifactId>
  4.     <version>3.3.4</version>
  5.     <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. <dependencies>
  8.     <dependency>
  9.         <groupId>com.alibaba.cloud.ai</groupId>
  10.         <artifactId>spring-ai-alibaba-starter</artifactId>
  11.         <version>1.0.0-M2</version>
  12.     </dependency>
  13.     <dependency>
  14.         <groupId>org.springframework.boot</groupId>
  15.         <artifactId>spring-boot-starter-webflux</artifactId>
  16.     </dependency>
  17.     ...other dependencies...
  18. </dependencies>
复制代码
同时添加所需的堆栈:
  1. <repositories>
  2.     <repository>
  3.       <id>sonatype-snapshots</id>
  4.       <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  5.       <snapshots>
  6.         <enabled>true</enabled>
  7.       </snapshots>
  8.     </repository>
  9.     <repository>
  10.       <id>spring-milestones</id>
  11.       <name>Spring Milestones</name>
  12.       <url>https://repo.spring.io/milestone</url>
  13.       <snapshots>
  14.         <enabled>false</enabled>
  15.       </snapshots>
  16.     </repository>
  17.     <repository>
  18.       <id>spring-snapshots</id>
  19.       <name>Spring Snapshots</name>
  20.       <url>https://repo.spring.io/snapshot</url>
  21.       <releases>
  22.         <enabled>false</enabled>
  23.       </releases>
  24.     </repository>
  25. </repositories>
复制代码
定义并注册函数

创建一个简单的服务类,比如MessageStatusService.java,用来模拟消息状态查询的功能:
  1. import com.fasterxml.jackson.annotation.JsonProperty;
  2. import com.fasterxml.jackson.annotation.JsonPropertyDescription;
  3. public class MessageStatusService implements Function<MessageStatusRequest, String> {
  4.     @Override
  5.     public String apply(MessageStatusRequest request) {
  6.         return "消息ID: " + request.getMessageId() + " 的状态是:正常";
  7.     }
  8.     public static class MessageStatusRequest {
  9.         @JsonProperty(required = true, value = "消息id")
  10.         @JsonPropertyDescription("消息id, 比如123123***")
  11.         private String messageId;
  12.         // 构造器、getter和setter省略
  13.     }
  14. }
复制代码
然后,在Spring配置类中注册此服务:
  1. @Configuration
  2. public class AppConfig {
  3.     @Bean
  4.     @Description("查询指定消息ID的状态")
  5.     public Function<MessageStatusRequest, String> messageStatusFunction() {
  6.         return new MessageStatusService();
  7.     }
  8. }
复制代码
控制器代码

最后,编写一个控制器类来处置惩罚HTTP请求,并使用PromptTemplate构建提示词,同时通过DashScopeChatOptions启用函数调用功能。
  1. @RestController
  2. @RequestMapping("/ai")
  3. @CrossOrigin(origins = "*")
  4. public class ChatController {
  5.     private final ChatClient chatClient;
  6.     public ChatController(ChatClient.Builder builder) {
  7.         this.chatClient = builder.build();
  8.     }
  9.     @GetMapping("/status")
  10.     public Flux<String> checkMessageStatus(@RequestParam String id) {
  11.         PromptTemplate promptTemplate = new PromptTemplate("我想知道消息id: {id} 的状态");
  12.         DashScopeChatOptionsBuilder opsBuilder = DashScopeChatOptions.builder()
  13.                 .withFunction("messageStatusFunction");
  14.         DashScopeChatOptions ops = opsBuilder.build();
  15.         Map<String, Object> map = Map.of("id", id);
  16.         Prompt prompt = promptTemplate.create(map, ops);
  17.         return chatClient.prompt(prompt).stream().content();
  18.     }
  19. }
复制代码
小结

上面两个,作为一个例子,基本上展示了spring ai的一些核心本领,接待大家也自己实验一下。







免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4