【LLM】第八章LangChain中的结构化输出一、本章要讲解的内容上图是我们和大模型交互的流程分A、B、C三部分A是用户喂入大模型的消息。对消息进行格式封装的称为提示词模板消息还有一个重要的类型就是工具消息这部分内容参考消息、提示词模板、工具的使用【LLM】第七章LangChain中的消息、提示词模板、工具的使用-CSDN博客 。B是大模型本模也叫基座目前都以对话模型为主。这部分可参考大模型创建和调用【LLM】第六章LangChain框架中的大模型的创建与调用-CSDN博客 。C是大模型的输出因为大模型本身的输出格式不一定是用户想要的输出格式比如我们想让大模型输出字符串格式或者json格式或者其他指定的格式那此时就得把大模型的输出进一步解析(Parse)才能得到我们想要的特定输出格式。本章讲这部分内容。1、什么是结构化输出结构化输出就是把大模型的自然语言回答变成程序可以识别的固定格式的数据上图第一种输出是传统的输出方式第二种输出是结构化输出。我们希望我们提供给大模型的prompt中没有要求返回json格式的提示词模型也能返回第二种格式的数据。2、为什么要结构化输出一是下游系统可以直接读取字段而不用再从自然语言里做解析。最熟悉的应用场景就是工具调用如果大模型返回的是工具调用的格式我们可以直接拿着结果去执行工具函数而不必再解析。二是更适合工程化适用于表单抽取、分类、路由、调用工具参数生成、工作流状态传递等场景。三是字符串可以有多种描述方式但抽取的某些字段是固定不变的。这就可以很大程度上减少语义表达不准确的问题。3、langchain支持的结构化输出格式有哪些目前langchain支持多种Schema的结构化输出格式Pydantic字段校验、描述、嵌套结构功能最丰富。TpyeDict轻量类型约束JSON Schema与前后端、跨语言接口最通用。dataclass只有pydantic返回的是schema类实例所以在类型不匹配时会抛出异常。其余三种方式返回的都是字典类型。因为pydantic是对其他方式的进一步封装嘛所以添加了校验机制工具那部分内容你看懂了这部分就不惑了。如果有的旧模型不支持结构化输出langchain会退回到提示词json解析。二、四种结构化输出格式示例1、Pydantic格式Langchain Pydantic结构化输出是生产场景首选其工作流程如下Pydantic支持多种类型字段比如str,int,float,list[xxx],Optional[xxx]等。下面是示例可选字段、默认值、枚举类型下面示例列表提取、嵌套结构、限制条件2、TypedDict格式TypedDict是带有类型声明的字典结构适用于快速定义字典结构且无需Pydantic重量级功能的场景。普通的dict是没有字段类型检验机制的但TypedDict在实例化时如果字段名称和TypedDict不完全一致时IDE在静态扫描时对比字典字面量的字符串key和TypedDict定义里的key集合名字不一致就标红报错运行时python完全不检查不是运行时强校验器。Annotated是用来在“类型”之外再附加一些额外的元数据信息类似于Pydantic中的Field。下面是几个示例3、JSON Schema格式这种方式需要按照JSON Schema规范拼接JSON字符串比较繁琐并且缺少校验机制不推荐。4、dataclass格式三、langchain实现结构化输出的方式有哪些1、模型调用with_structured_output()绑定输出格式(schema)这是最新、最简洁的API把用户的自然语言输入打包成大模型理解的数据结构并返回解析好的对象。上面的示例都是用的这种方式。说明with_structured_output()还有一个参数include_rawTrue表示返回解析前的原始AIMessage这样你也可以获得其他的元数据信息。但此时返回的信息就是dict类型在dict中的parse字段的内容就是我们想要模型返回的结构化数据。2、通过输出解释器来获取结构化输出这种是langchain早期版本的实现方式其操作方式是提示词指导(在提示词中明确指示模型输出特定格式的文本)--模型生成文本--解析器进行转换输出。3、二者的异同点在with_structured_output()方式下langchain将用户定义的输出结构(JSON Schema)封装好和用户的文本问题一并喂入大模型这种方式会启动大模型的语法采样约束从而在模型层面保证了输出格式的合规性。而输出解释器方式下是通过提示词模板用文本描述输出的结构如果大模型不是太聪明很容易理解不了就无法生成符合结构的内容此时输出解释器也会无能为力完美的解析。如上图所示最后还多添加了一个answer字段。因为现在的大模型或者说更前沿的大模型、更智能的大模型其普通的预训练后都要用对话数据集结构化数据集(比如多轮对话)调用工具数据集强化学习价值对齐引导重新微调的。所以这些大模型是会学到结构信息的所以当你喂入结构信息时就容易激活其学习的结构范式从而输出结构化的信息。
阅读完成 · 觉得有帮助?