LangChain4j结构化输出教程:从文本中提取结构化数据

LangChain4j结构化输出教程:从文本中提取结构化数据

langchain4j langchain4j - 一个Java库,旨在简化将AI/LLM(大型语言模型)能力集成到Java应用程序中。 langchain4j 项目地址: https://gitcode.com/gh_mirrors/la/langchain4j

什么是结构化输出

结构化输出是指让大型语言模型(LLM)按照预定义的结构格式(通常是JSON)生成输出内容的能力。这种能力对于从非结构化文本中提取结构化数据特别有用,可以方便地将输出映射到Java对象并在应用程序中使用。

应用场景示例

假设我们需要从以下非结构化文本中提取个人信息:

John今年42岁,过着独立的生活。
他身高1.75米,举止自信。
目前未婚,享受着专注于个人目标和兴趣的自由。

我们希望将这些信息提取到一个Person对象中:

record Person(String name, int age, double height, boolean married) {}

实现结构化输出的三种方法

LangChain4j提供了三种实现结构化输出的方法,按可靠性从高到低排序:

  1. JSON Schema(最可靠)
  2. 提示词+JSON模式
  3. 仅使用提示词

本文将重点介绍最可靠的JSON Schema方法。

JSON Schema方法详解

JSON Schema是一种描述JSON数据结构的规范。通过为LLM提供JSON Schema,我们可以确保模型输出符合我们预期的格式。

支持的LLM提供商

目前支持JSON Schema功能的LLM提供商包括:

  • Azure OpenAI
  • Google AI Gemini
  • Mistral
  • Ollama
  • OpenAI

底层ChatModel API使用示例

在底层ChatModel API中,可以通过ResponseFormat和JsonSchema来指定输出格式:

// 1. 定义响应格式和JSON Schema
ResponseFormat responseFormat = ResponseFormat.builder()
        .type(JSON)
        .jsonSchema(JsonSchema.builder()
                .name("Person")
                .rootElement(JsonObjectSchema.builder()
                        .addStringProperty("name")
                        .addIntegerProperty("age")
                        .addNumberProperty("height")
                        .addBooleanProperty("married")
                        .required("name", "age", "height", "married")
                        .build())
                .build())
        .build();

// 2. 创建用户消息
UserMessage userMessage = UserMessage.from("John今年42岁...");

// 3. 创建聊天请求
ChatRequest chatRequest = ChatRequest.builder()
        .responseFormat(responseFormat)
        .messages(userMessage)
        .build();

// 4. 创建并配置ChatModel
ChatModel chatModel = OpenAiChatModel.builder()
        .apiKey("your-api-key")
        .modelName("gpt-4")
        .build();

// 5. 发送请求并处理响应
ChatResponse chatResponse = chatModel.chat(chatRequest);
String output = chatResponse.aiMessage().text();
Person person = new ObjectMapper().readValue(output, Person.class);

JSON Schema元素类型

LangChain4j提供了多种JSON Schema元素类型来构建复杂的数据结构:

  1. JsonObjectSchema:表示对象类型
  2. JsonStringSchema:字符串类型
  3. JsonIntegerSchema:整数类型
  4. JsonNumberSchema:数字类型
  5. JsonBooleanSchema:布尔类型
  6. JsonEnumSchema:枚举类型
  7. JsonArraySchema:数组类型
  8. JsonReferenceSchema:支持递归引用
  9. JsonAnyOfSchema:支持多态类型
复杂示例:递归结构
// 定义递归结构(如Person包含children)
String reference = "person";
JsonObjectSchema personSchema = JsonObjectSchema.builder()
        .addStringProperty("name")
        .addProperty("children", JsonArraySchema.builder()
                .items(JsonReferenceSchema.builder()
                        .reference(reference)
                        .build())
                .build())
        .definitions(Map.of(reference, JsonObjectSchema.builder()
                .addStringProperty("name")
                .addProperty("children", JsonArraySchema.builder()
                        .items(JsonReferenceSchema.builder()
                                .reference(reference)
                                .build())
                        .build())
                .build()))
        .build();

高层AI Service API使用示例

使用AI Service API可以更简洁地实现相同功能:

interface PersonExtractor {
    @UserMessage("从以下文本中提取个人信息: {{it}}")
    Person extractPerson(String text);
}

// 配置ChatModel
ChatModel chatModel = OpenAiChatModel.builder()
        .apiKey("your-api-key")
        .modelName("gpt-4")
        .supportedCapabilities(Set.of(RESPONSE_FORMAT_JSON_SCHEMA))
        .strictJsonSchema(true)
        .build();

// 创建AI服务
PersonExtractor extractor = AiServices.create(PersonExtractor.class, chatModel);

// 使用服务
Person person = extractor.extractPerson("John今年42岁...");

最佳实践与注意事项

  1. 必填字段:默认所有字段都是可选的,必须显式指定required()来标记必填字段
  2. 描述信息:为字段添加描述可以提高输出质量
  3. 类型限制
    • JsonReferenceSchema和JsonAnyOfSchema目前仅支持部分提供商
    • 流式模式下JSON Schema可能不受支持
  4. 启用JSON Schema:必须显式启用JSON Schema功能

总结

LangChain4j的JSON Schema功能为从非结构化文本中提取结构化数据提供了强大而可靠的方法。通过合理设计Schema,开发者可以确保LLM输出符合预期的数据结构,从而简化后续的数据处理流程。无论是使用底层API还是高层AI Service,LangChain4j都提供了简洁而强大的工具来实现这一目标。

langchain4j langchain4j - 一个Java库,旨在简化将AI/LLM(大型语言模型)能力集成到Java应用程序中。 langchain4j 项目地址: https://gitcode.com/gh_mirrors/la/langchain4j

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

### LangChain4J 的结构化输出功能 LangChain4J 是 Java 版本的 LangChain 库,旨在通过链式调用的方式简化自然语言处理任务中的复杂流程。其核心目标之一是提供灵活的数据转换能力,尤其是在涉及大模型生成的内容时,能够将其解析为更易于程序操作的形式。 #### 结构化输出的核心概念 在 LangChain 中,`BaseLLMOutputParser` 被定义为一种基础类,用于解析来自大型语言模型 (LLM) 的原始字符串输出并将其转化为更有意义的对象形式[^1]。这种转化过程通常依赖于特定的解析器实现,比如 `ListOutputParser` 或者 `PydanticOutputParser`。这些工具允许开发者指定期望的结果数据类型,并自动完成相应的映射工作。 对于 **Java 实现**而言,虽然具体命名可能有所调整以适应 JVM 生态环境,但基本原理保持一致: 1. **输入模板设计**: 使用提示工程技巧构建清晰易懂的问题描述,引导 LLM 返回符合预期格式的回答。 2. **自定义解析逻辑**: 开发人员可以编写专门针对业务需求的解析函数来提取所需字段。 3. **集成到流水线中**: 将上述组件嵌入更大的应用框架里执行端到端的任务自动化。 以下是基于假设场景的一个简单例子展示如何利用此类特性: ```java // 假设我们有一个名为 ChainBuilder 工具帮助创建链条 Chain chain = new ChainBuilder() .withPrompt("请按照 JSON Schema 提供以下信息...") .addStep(new GenerateTextFromModel()) .thenParseUsing(new JsonSchemaBasedParser()) // 自动依据预定义模式验证/修正结果 .build(); Map<String, Object> parsedResult = chain.apply(inputData); System.out.println(parsedResult); // 输出经过整理后的键值对集合 ``` 此片段展示了从提问到最后获取标准化答案的整体思路——即先由 AI 模型生成自由文本再经后续阶段进一步加工成应用程序可以直接消费的形式。 #### 注意事项 尽管这种方法非常强大,但在实际部署过程中仍需注意几个方面: - 确保初始请求足够精确以便获得恰当响应; - 对潜在错误情况做好充分预案以免影响用户体验; - 定期更新所使用的正则表达式或其他匹配机制跟随最新变化趋势同步改进。 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宣万歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值