🏗️Langchain v0.2如何从大模型返回结构化数据

type
status
date
slug
summary
tags
category
icon
password
🦜
具有与特定架构匹配的模型返回输出通常很有用。一个常见的用例是从文本中提取数据以插入数据库或与其他下游系统一起使用。本指南介绍了从模型中获取结构化输出的一些策略。
 
🚨
注意并不是所有的大模型都支持结构化输出!基本上所有的中文大模型目前都不支持!

目前langchain中支持结构化输出的大模型

notion image
 

.with_structured_output()方法:

这是获取结构化输出的最简单、最可靠的方法。with_structured_output()为提供用于构建输出的本机 API(如工具/函数调用或 JSON 模式)的模型实现,并在后台利用这些功能。 这个方法使用一个schema作为输入,并返回一个类似Runnable的model,而不是像以前返回字符串或者Message。
支持的schema包括:
  • JSON
  • Pydantic Class
返回的模型包括:
  • 如果输入为JSON,则Runnable将返回字典
  • 如果输入为Pydantic class则返回Pydantic对象
 
示例:
notion image
 
如果你对Pydantic不熟悉,也可以直接使用JSON:
notion image
 

多个Schema中切换

如果有多个Schema的输入,那么最简单的方式是创建一个具有 Union 类型属性的父 Pydantic 类,这样大模型会根据任务来选择不同的Schema并返回不同的结构化数据
notion image
 

流式输出

🚨
当设置输入Schema为JSON的时候,可以安全的使用流式输出
 

Few-Shot提示词

对于更复杂的数据结构,比如嵌套比较深的JSON,提升结构化输出输出质量的一个办法是在提示词中增加示例
 

在Tool Call中的使用

notion image
 

对于不在支持列表里的大模型(没有做.with_structured_output封装)该怎么处理?

对于大量本身支持tool call,但是没有做类似.with_strycured_output这样封装的大模型,该如何实现结构化的输出呢?
处理思路上基本是在output这个环节下功夫,具体来说有两种办法:
  • 使用类似PydanticOutputParser这样的解析器,来将LLM的结构化输出统一化
  • 使用LCEL+自定义的解析器通过类似正则的方式来实现结构化输出的统一
使用PydanticOutputParser来处理:
notion image
我们打印提示词模板,可以看到最终合成的提示词如右边所示,红框是最终合成的提示词,绿框是PydanticOutputParser这个解析器的提示词模板,黄框则是由partial方法嵌入的动态参数模板
notion image
我们使用不支持.with_strycured_output的月之暗面LLM,发现已经可以完美的输出结构化的结果了。
 
另外一种是使用LCEL+自定义解析器的方式,主要是靠正则来解析:
notion image
最终合成的提示词模板是这样的。
notion image
使用自定义的解析器结果如上。
🚨
注意:并不是所有的说自己支持tool call的大模型,都可以使用这两种方法来生成结构化,无论使用Pydantic还是正则匹配,如果LLM的输出精度不足,一样无法跑通。比如智普就说自己的glm4是支持tool call的,但是在使用自定解析器的时候,我就发现它原始的输出就没有精准理解提示词,生成的JSON字符没有被f-sting包裹,造成了报错。
Loading...

No results found.