一、什么是 AIService

AIService 使用面向接口和动态代理的方式完成程序的编写,更灵活的实现高级功能。

1.1、链 Chain(旧版)

链的概念源自 Python 中的 LangChain。其理念是针对每个常见的用例都设置一条链,比如聊天机器人、检索增强生成(RAG)等。链将多个底层组件组合起来,并协调它们之间的交互。链存在的主要问题是不灵活,我们不进行深入的研究。

1.2、人工智能服务 AIService

在 LangChain4j 中我们使用 AIService 完成复杂操作。底层组件将由 AIService 进行组装。
AIService可处理最常见的操作:

  • 为大语言模型格式化输入内容
  • 解析大语言模型的输出结果

它们还支持更高级的功能:

  • 聊天记忆 Chat memory
  • 工具 Tools
  • 检索增强生成 RAG

二、创建 AIService

参考文档:https://docs.langchain4j.dev/tutorials/ai-services#simplest-ai-service

参考文档:https://docs.langchain4j.dev/tutorials/spring-boot-integration#spring-boot-starter-for-declarative-ai-services

2.1、引入依赖

        <!--langchain4j高级功能-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-starter</artifactId>
        </dependency>

2.2、创建接口

package com.study.assistant;

public interface Assistant {

    String chat(String userMessage);
}

2.3、测试用例

@SpringBootTest
public class AIServiceTest {
    
    @Autowired
    private QwenChatModel qwenChatModel;
    @Test
    public void testChat() {
        // 创建 AIService
        Assistant assistant = AiServices.create(Assistant.class, qwenChatModel);
        // 调用service的接口
        String answer = assistant.chat("你是谁?");
        System.out.println(answer);
    }
}

2.4、@Service 注解

也可以在 Assistant 接口上添加 @AiService 注解

package com.study.assistant;

import dev.langchain4j.service.spring.AiService;

import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;

// 因为我们在配置文件中同时配置了多个大语言模型,所以需要在这里明确指定(EXPLICIT)模型的beanName(qwenChatModel)
@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface Assistant {

    String chat(String userMessage);
}

测试用例中,我们可以直接注入 Assistant 对象

    @Autowired
    private Assistant assistant;
    @Test
    public void testAssistant() {
        String answer = assistant.chat("你是谁?");
        System.out.println(answer);
    }

2.5、工作原理

AiServices 会组装 Assistant 接口以及其他组件,并使用反射机制创建一个实现 Assistant 接口的代理对象。
这个代理对象会处理输入和输出的所有转换工作。在这个例子中,chat 方法的输入是一个字符串,但是大模型需要一个 UserMessage 对象。所以,代理对象将这个字符串转换为 UserMessage ,并调用聊天语言模型。chat 方法的输出类型也是字符串,但是大模型返回的是 AiMessage 对象,代理对象会将其转换为字符串。

public interface ChatModel {

    default String chat(String userMessage) {
        ChatRequest chatRequest = ChatRequest.builder().messages(new ChatMessage[]{UserMessage.from(userMessage)}).build();
        ChatResponse chatResponse = this.chat(chatRequest);
        return chatResponse.aiMessage().text();
    }
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐