LangChain提取和输出结构化数据

Langchian提取结构化的数据

构建一个链来从:非结构化的文本中提取结构化信息。

任务介绍

本练习演示如何利用 LangChain 的 with_structured_output 能力,将自然语言中的人物信息结构化为符合 Pydantic 模型 Manypeople 的 JSON。通过"模型 + 提示 + 结构化解析"流水线,我们可以稳定地从任意文本中提取多个角色的姓名、发色和身高。

背景与需求

在多人物叙述里,简单的单实体抽取已经无法满足需求。我们需要:

  • 支持同一段文本中出现的多个角色;
  • 保证输出严格符合 {"people": [...]} 的结构,以方便下游系统消费;
  • 在模型返回前就校验数据格式,避免脏数据流入。

为此,选用 Qwen 兼容 OpenAI 接口,并结合 LangChain 的 structured output 功能与 Pydantic 校验,把所有环节串联起来。

解决逻辑与关键代码

整体链路:输入文本 → 构造提示 → LLM 生成结构化 JSON → Pydantic 校验 → 输出 Manypeople

关键逻辑如下:

复制代码
chain = {
    'text': RunnablePassthrough()
} | prompt | model.with_structured_output(schema=Manypeople)
  • RunnablePassthrough 将原始文本透传给提示;
  • ChatPromptTemplate 指定 system + human 消息,告知模型必须返回 JSON,并在未知时写 null
  • with_structured_output 绑定 Manypeople schema,让模型直接生成符合 Pydantic 的 JSON;解析失败会立刻抛错。

文字流程图

  1. 接收输入文本,描述若干人物。
  2. 通过 Prompt 模板注入 system 说明,要求输出 JSON。
  3. Qwen LLM 根据提示返回结构化内容。
  4. LangChain 将响应按照 Manypeople schema 解析;若缺字段则报错,提醒用户调整。
  5. 校验通过后,得到一个 people 列表,每项都是 Person 对象,可直接在 Python 中使用。

总结

  • 通过 Pydantic + LangChain 的组合,可以快速构建可靠的结构化抽取能力。
  • 多人物场景的核心在于提示里明确 people 列表结构,并让模型严格输出 JSON。
  • 解析层自带校验,既能早发现问题,也方便调试提示或后处理。

完整代码

python 复制代码
from typing import List, Optional
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field


# Qwen(通义千问)API Key
qwen_api_key = 'TripleH'  # 请替换为您的 DashScope API Key

# 创建 Qwen LLM 模型
# 可选模型:qwen-turbo, qwen-plus, qwen-max, qwen-max-longcontext
model = ChatOpenAI(
    model='qwen-turbo',  # 可以根据需要改为 qwen-plus 或 qwen-max
    api_key=qwen_api_key,
    base_url='https://dashscope.aliyuncs.com/compatible-mode/v1'
)

from langchain_core.prompts import ChatPromptTemplate

# 定义自定义提示以提供指令和任何其他上下文。
# 1) 你可以在提示模板中添加示例以提高提取质量
# 2) 引入额外的参数以考虑上下文(例如,包括有关提取文本的文档的元数据。)
prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "你是一个专业的提取算法。只从未结构化文本中提取相关信息,必须以JSON格式返回结果。如果你不知道要提取的属性的值,返回该属性的值为null。",
        ),
        # 请参阅有关如何使用参考记录消息历史的案例
        # MessagesPlaceholder('examples'),
        ("human", "{text}"),
    ]
)


# pydantic: 处理数据,验证数据, 定义数据的格式, 虚拟化和反虚拟化,类型转换等等。
class Person(BaseModel):
	"""
    关于一个人的数据模型
    """
	name: Optional[str] = Field(default=None,description='表示人的名字')
	hair_color: Optional[str] = Field(default=None, description='如果知道的话,这个人的头发颜色')
	height_in_meters: Optional[str] = Field(default=None, description="以米为单位测量的高度")

class Manypeople(BaseModel):
	people: List[Person]

from langchain_core.runnables import RunnablePassthrough

chain = {'text' : RunnablePassthrough()} | prompt | model.with_structured_output(schema=Manypeople)
# text = '马路上走来一个女生,长长的黑头发披在肩上,大概1米7左右,'
# text = "马路上走来一个女生,长长的黑头发披在肩上,大概1米7左右。走在她旁边的是她的男朋友,叫:刘海;比她高10厘米。"
text = "My name is Jeff, my hair is black and i am 6 feet tall. Anna has the same color hair as me."
resp = chain.invoke(text)
print(resp)
# name='Jeff' hair_color='black' height_in_meters=None
相关推荐
何以解忧,唯有..10 分钟前
LangChain 中 Pydantic 格式输出:结构化输出的完整指南
java·开发语言·langchain
sukioe2 小时前
城智连响:基于 LangGraph 与四库分层架构的城市公共设施智能报修与派单系统
人工智能·python·ai·架构·langchain
zl_dfq3 小时前
LangChain 之 【MCP】(FastMCP、MultiServerMCPClient、json.dumps)
langchain
爱敲代码的小冰5 小时前
langchain入门基础
langchain
何以解忧,唯有..16 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
落魄大学生之流水线上谋生计18 小时前
LangGraph 基本用法指南
java·windows·python·langchain
运维@小兵19 小时前
LangChain概述
langchain
YsyaaabB1 天前
Deep Agents 实战课程
python·langchain
ITresearchGuest1 天前
LangChain JS 入门:快速搭建前端 AI 开发环境
前端·javascript·langchain
未若君雅裁1 天前
Agent 的结构化输出,ProviderStrategy、ToolStrategy 与错误重试
python·langchain