Low level API 和 High level API
Langchain4j 提供了两种抽象层次的 API:
- Low level API:底层 API,可以最大自由程度地去访问所有底层组件,如 ChatModel、UserMessage、AiMessage、EmbeddingStore、Embedding 等。
- High level API:高级 API,可以使用高级 API 服务(如 AiService)与 LLM 进行交互,这些 API 会隐藏所有复杂性的模板代码。当然,可以对模板代码进行适当的微调,但这一切都是以声明式方式完成的。
Low 和 High API 演示
Low
配置 LLMConfig
@Configuration
public class LLMConfig {
@Bean("qwen")
public ChatModel chatModelQwen() {
return OpenAiChatModel.builder()
.apiKey(System.getenv("ALI_QWEN_API_KEY"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
}
}
LowController
@RestController
@RequestMapping("low")
public class LowController {
@Resource(name = "qwen")
private ChatModel chatModelQwen;
@GetMapping("/qwen/getTokenUsage")
public String helloQwen(@RequestParam(value = "question", defaultValue = "你是谁?") String question) {
ChatResponse response = chatModelQwen.chat(UserMessage.from(question));
String text = response.aiMessage().text();
TokenUsage tokenUsage = response.tokenUsage();
return String.format("[result] <br> %s <hr> [token usage] <br> %s", text, tokenUsage);
}
}
注意 ChatResponse 这个对象。
ChatResponse 源码
public class ChatResponse {
...
protected ChatResponse(Builder builder) {
this.aiMessage = (AiMessage)ValidationUtils.ensureNotNull(builder.aiMessage, "aiMessage");
ChatResponseMetadata.Builder<?> metadataBuilder = ChatResponseMetadata.builder();
if (builder.id != null) {
validate(builder, "id");
metadataBuilder.id(builder.id);
}
if (builder.modelName != null) {
validate(builder, "modelName");
metadataBuilder.modelName(builder.modelName);
}
if (builder.tokenUsage != null) {
validate(builder, "tokenUsage");
metadataBuilder.tokenUsage(builder.tokenUsage);
}
if (builder.finishReason != null) {
validate(builder, "finishReason");
metadataBuilder.finishReason(builder.finishReason);
}
if (builder.metadata != null) {
this.metadata = builder.metadata;
} else {
this.metadata = metadataBuilder.build();
}
}
...
}
它封装了我们最常用的消息:
id消息IDmodelName模型名称tokenUsagetoken 使用量finishReason
High
定义 AI 服务接口 Service
public interface Assistant {
public String chat(String message);
}
实现 Assistant 的 Impl 实现类
@Configuration
public class LLMConfig {
@Value("${ai-api-key.deepseek}")
private String deepseek;
...
@Bean
public Assistant assistant(@Qualifier("qwen") ChatModel chatModelQwen) {
// 替换传统的 ServiceImpl 实现类
// 将 Service.class 的接口实现类交给 chatModel 模型来实现
return AiServices.create(Assistant.class, chatModelQwen);
}
}
HighController
@RestController
@RequestMapping("high")
public class HighController {
@Resource
private Assistant assistant;
@GetMapping("/qwen")
public String hello(@RequestParam(value = "question", defaultValue = "你是谁?") String question) {
return assistant.chat(question);
}
}