langchain对模型查询进行结构化输出

一.背景

        在大语言模型(LLM)应用落地过程中,“输出结果的可控性与结构化” 成为企业级场景的核心诉求 —— 通用大模型默认返回自然语言文本,虽具备良好的可读性,但无法直接对接业务系统(如数据库、ERP、BI 平台),也难以满足 “数据提取、格式校验、自动化处理” 等精细化需求。LangChain 作为大模型应用开发的核心框架,其 “结构化输出” 能力通过标准化、可配置的方式约束大模型输出格式,解决了传统大模型输出 “非结构化、不可控、集成难” 的痛点,成为大模型从 “通用问答” 走向 “场景化落地” 的关键支撑。

1.传统大模型输出的核心痛点

  1. 输出格式不可控,无法直接集成业务系统大模型原生输出为无固定格式的自然语言(如回答 “提取订单信息” 时,可能返回 “订单号是 20251210,金额 999 元” 或 “20251210 号订单金额为 999 元” 等多种表述),而业务系统(如订单管理系统、财务系统)仅能识别 JSON、XML、CSV 等结构化格式。传统方式需人工编写正则表达式、字符串解析逻辑提取关键信息,不仅开发成本高,还易因输出表述变化导致解析失败,适配性极差。

  2. 信息提取不精准,关键数据易遗漏针对 “提取指定字段” 的需求(如从合同文本中提取甲方名称、签约时间、金额),自然语言输出易出现字段缺失、格式错误(如日期写成 “2025/12/10” 或 “2025 年 12 月 10 日”)、语义歧义等问题;且无法强制大模型校验字段完整性(如必须返回 “金额” 字段,缺失则提示),导致后续数据处理环节出现大量异常。

  3. 无标准化约束,多场景适配成本高企业不同业务场景(如客户信息提取、物流状态解析、财务报表生成)对输出格式的要求各异,传统方式需为每个场景单独编写提示词(Prompt)和解析逻辑:例如提取客户信息需 JSON 格式,生成报表需 CSV 格式,重复开发导致效率低下;且提示词的细微差异可能引发输出格式变化,维护成本高。

  4. 无法对接自动化流程,人工介入成本高大模型输出若为非结构化文本,无法直接驱动自动化流程:例如无法将提取的订单信息自动写入 MySQL 数据库,无法将物流状态解析结果推送至物流管理系统,需人工复制粘贴关键数据,违背 “大模型提效” 的核心目标,尤其在批量处理场景(如每日解析上千份合同)中,人工成本呈指数级增长。

  5. 缺乏校验机制,数据质量难以保障自然语言输出无法内置数据校验逻辑:例如提取的 “手机号” 字段可能是 10 位(不符合规范)、“金额” 字段可能是文本(如 “九百九十九元” 而非数字 “999”),传统方式需额外编写校验代码,且无法在大模型输出阶段提前拦截错误,导致下游系统处理失败。

2.LangChain 实现大模型结构化输出的核心价值

        LangChain 作为大模型应用开发框架,通过内置的 PydanticOutputParserJsonOutputParserStructuredOutputParser 等工具,结合 Prompt 模板、数据校验机制,实现大模型输出的 “标准化、可控化、可校验”,核心价值体现在:

  1. 强制约束输出格式,无缝对接业务系统LangChain 支持通过数据模型(如 Pydantic 类)定义输出结构,强制大模型按照指定格式(如 JSON)返回结果,无需手动解析自然语言。

  2. 内置数据校验,保障输出质量LangChain 结合 Pydantic 的数据校验能力,在输出解析阶段自动校验字段类型、格式、范围:例如 “amount” 字段若返回文本则直接抛出异常,“create_time” 格式不符合要求则提示重新生成,无需额外编写校验逻辑;同时支持自定义校验规则(如手机号格式、金额范围),在大模型输出阶段提前保障数据质量。

  3. 标准化模板复用,降低多场景适配成本LangChain 可将 “格式约束 + 业务提示” 封装为通用 Prompt 模板,不同场景仅需替换数据模型即可快速适配:例如提取客户信息时替换为 CustomerInfo 模型,提取物流信息时替换为 LogisticsInfo 模型,无需重新编写解析逻辑,复用率提升 80% 以上。

  4. 打通自动化流程,减少人工介入结构化输出的结果可直接驱动自动化流程:例如将解析后的订单信息通过 LangChain 的 SQLDatabase 工具写入 MySQL,将客户信息推送至 CRM 系统,将物流状态同步至仓储管理系统,实现 “大模型解析 - 数据处理 - 业务系统联动” 的全流程自动化,尤其适用于批量处理场景。

  5. 兼容多模型,适配企业级选型LangChain 结构化输出能力兼容主流大模型(GPT-3.5/4、Claude、通义千问、文心一言、Llama 2 等),无需针对不同模型调整格式约束逻辑;同时支持输出格式灵活切换(JSON、CSV、XML 等),适配企业不同业务系统的接入要求。

3.典型应用场景

  1. 非结构化文本信息提取:从合同、邮件、PDF 文档中提取指定结构化字段(如甲方 / 乙方、金额、签约时间),直接写入企业数据中台,支撑合同管理、财务核算等场景。
  2. 业务数据自动化处理:解析客服聊天记录提取客户诉求(如 “退款”“查物流”),结构化后推送至工单系统;解析电商评论提取差评原因(如 “物流慢”“质量差”),生成结构化报表供运营分析。
  3. 智能表单生成:将自然语言描述的业务需求(如 “创建一个包含姓名、手机号、地址的客户登记表”)转换为结构化的表单配置 JSON,自动生成企业级表单系统的表单模板。
  4. 大数据分析前置处理:将海量非结构化日志、用户行为文本转换为结构化数据(如 JSON、Parquet),供 Spark/Flink 进行批流分析,提升大数据处理效率。
  5. 企业级智能问答系统:智能客服系统中,将用户问题解析为结构化查询条件(如 “查询 2025 年 12 月的北京地区订单”→ {"time_range": "2025-12", "region": "北京", "type": "订单"}),直接对接业务数据库返回精准结果,替代模糊的自然语言回答。

4.关键优势总结

        LangChain 结构化输出能力的核心是 “将大模型的非结构化输出转化为机器可理解的结构化数据”,其本质是打通了 “大模型理解自然语言” 与 “业务系统处理结构化数据” 的鸿沟:既保留了大模型强大的自然语言理解能力,又通过标准化约束保障了输出的可控性与可用性,大幅降低大模型应用落地的开发成本,提升数据处理的自动化程度与质量,是企业级大模型应用从 “演示级” 走向 “生产级” 的核心技术支撑。

        综上,LangChain 实现大模型结构化输出的需求,源于企业对大模型应用 “可控、可用、可集成” 的核心诉求:解决了传统大模型输出非结构化、难以对接业务系统的痛点,通过标准化的格式约束、内置的校验机制、灵活的模板复用,让大模型输出能够直接驱动业务流程,为企业级大模型应用落地提供了高效、可靠的技术路径。

二.具体实现

1.引入依赖

import sys
import io

# 设置标准输出为 UTF-8 编码,解决中文乱码问题
if sys.stdout.encoding != 'utf-8':
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
if sys.stderr.encoding != 'utf-8':
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

from langchain.tools import tool
from langchain.chat_models import init_chat_model
from pydantic import BaseModel, Field

2.定义模型

model_config = {
    "model": "gpt-4.0",  # 模型名称(需与代理支持的模型一致)
    "api_key": "xxx",  # OpenAI 官方 API Key 或代理服务器分配的密钥
    "model_kwargs": {
        "base_url": "xxx",  # 你的代理地址(必须以 /v1 结尾,与 OpenAI 接口格式一致)
        # 可选:其他 OpenAI 模型参数(如温度、超时等)
        "temperature": 0.7,
        "timeout": 30,
    },
    "verbose": True,  # 可选:开启日志,便于调试代理连接
}


model = init_chat_model(**model_config)

3.定义结构化类

class SearchQuery(BaseModel):
    search_query: str = Field(None, description="优化后的网络搜索查询")
    justification: str = Field(
        None, description="该查询为何与用户的需求相关"
    )

4.模型测试

structured_llm = model.with_structured_output(SearchQuery)

output = structured_llm.invoke("钙评分与高胆固醇存在怎样的关联?")

import json
print(json.dumps({
    "search_query": output.search_query,
    "justification": output.justification
}, ensure_ascii=False, indent=2))

结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

路边草随风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值