LangChain4J格式化输出跟SpringAI真是天差地隔啊
# 先来看看LangChain4J是如何能保证structured Output的
首先定义一个 ResponseForm
private static ResponseFormat stockAnalysisResponseFormat() {
JsonObjectSchema schema = JsonObjectSchema.builder()
.description("股票分析结果")
.addEnumProperty("action", List.of("BUY", "SELL", "HOLD"), "操作:BUY 买入 / SELL 卖出 / HOLD 持有")
.addStringProperty("symbol", "股票代码")
.addNumberProperty("score", "推荐强度 0.0~10.0")
.addStringProperty("reason", "分析理由")
.required(List.of("action", "symbol", "score", "reason"))
.additionalProperties(false)
.build();
JsonSchema jsonSchema = JsonSchema.builder()
.name("StockAnalysis")
.rootElement(schema)
.build();
return ResponseFormat.builder()
.type(ResponseFormatType.JSON)
.jsonSchema(jsonSchema)
.build();
}
# 然后定义一个专属的chatMode
@Bean
public ChatModel chatLanguageModel(LlmProperties properties) {
return OpenAiChatModel.builder()
.apiKey(properties.getApiKey())
.baseUrl(properties.getBaseUrl())
.modelName(properties.getModelName())
.responseFormat(stockAnalysisResponseFormat())
.build();
}
# 而且用的时候也很恶心
public interface StockAnalysisAiService {
String SYSTEM_PROMPT = """
你是一个专业的量化金融分析师。
请分析用户给出的股票,给出操作建议、推荐强度和分析理由。
""";
@UserMessage(SYSTEM_PROMPT + "\n\n分析 {{symbol}}")
StockAnalysis analyze(@V("symbol") String symbol);
}
# 这里坑就来了啊,那每一个schema都需要绑定一个chatModel,拿项目中如果是N个bean则需要初始化N个@bean?
# 来欣赏下SpringAi是如何用几行代码,代替上面三陀代码的,多么的优雅,这就是框架,顶层抽象的美丽与差距啊
public BookInfo book(@RequestParam String keyword) {
return chatClient.prompt()
.system("你是一个书虫")
.user("推荐一本关于 " + keyword + " 的经典书籍")
.call()
.entity(BookInfo.class);
}

浙公网安备 33010602011771号