《Learning Langchain》阅读笔记3-基于 Gemini 的 Langchain如何从LLMs中获取特定格式

纯文本输出是有用的,但在某些情况下,我们需要 LLM 生成结构化输出,即以机器可读格式(如 JSON、XML 或 CSV)或甚至以编程语言(如 Python 或 JavaScript)生成的输出。当我们打算将该输出传递给其他代码时,这非常有用,使 LLM 可以在更大的应用程序中发挥作用。

调试步骤

import getpass
import osif "GOOGLE_API_KEY" not in os.environ:os.environ["GOOGLE_API_KEY"] = getpass.getpass("Enter your Google AI API key: ")
import os
import requestsos.environ['HTTP_PROXY'] = 'http://127.0.0.1:7890'
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7890'r = requests.get("https://www.google.com")
print(r.status_code)  # 能返回 200 就说明代理成功了
from langchain_google_genai import ChatGoogleGenerativeAIllm = ChatGoogleGenerativeAI(model="gemini-2.0-flash-001",  # 或其他可用模型
)print(llm.invoke("你好呀!你现在通了吗?").content)
你好!我一直在线,随时待命。所以,是的,我可以说是“通了”!有什么我可以帮助你的吗?

JSON Output:JSON输出

使用 LLM 生成的最常见格式是 JSON,然后可以将其用于,例如:

  • 将它发送到前端代码

  • 将其保存到数据库中

# openai API
from langchain_openai import ChatOpenAI
from langchain_core.pydantic_v1 import BaseModelclass AnswerWithJustification(BaseModel):'''An answer to the user question along with justification for the answer.'''answer: str'''The answer to the user's question'''justification: str'''Justification for the answer'''llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.with_structured_output(AnswerWithJustification)
structured_llm.invoke("What weighs more, a pound of bricks or a pound of feathers")

输出为:

{answer: "They weigh the same", justification: "Both a pound of bricks and a pound of feathers weigh one pound. The weight is the same, but the volu"... 42 more characters
}

我们使用gemini API来复现

但是langchain_core.pydantic_v1 是为兼容旧版本 pydantic v1 而设的临时模块,但现在 LangChain 已经全面升级到了 pydantic v2,建议不要再用这个兼容模块了。

from langchain_core.pydantic_v1 import BaseModel出现了红色的提示报错。所以我们改写为from pydantic import BaseModel, 这样就直接使用了最新版的 pydantic,不会再触发警告。

from langchain_google_genai import ChatGoogleGenerativeAI
from pydantic import BaseModelclass AnswerWithJustification(BaseModel):'''An answer to the user question along with justification for the answer.'''answer: str'''The answer to the user's question'''justification: str'''Justification for the answer'''llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash-001",  # 或其他可用模型temperature=0 # 让输出更确定、更稳定(不会随机发挥)
)structured_llm = llm.with_structured_output(AnswerWithJustification)structured_llm.invoke("What weighs more, a pound of bricks or a pound of feathers")
AnswerWithJustification(answer='They weigh the same.', justification='A pound is a unit of weight, so a pound of bricks and a pound of feathers weigh the same amount..')

总体目标:
让大语言模型(LLM)返回结构化的数据(JSON),并且符合你自定义的格式(schema)。

第一步:定义了一个“结构模板”(schema):

class AnswerWithJustification(BaseModel):answer: strjustification: str

这就是你希望模型返回的数据格式 —— 一个包含两个字段的 JSON:

{"answer": "...","justification": "..."
}

第二步:让 LLM “知道” 要用这个格式

structured_llm = llm.with_structured_output(AnswerWithJustification)

第三步:使用这个结构化模型去提问

structured_llm.invoke("What weighs more, a pound of bricks or a pound of feathers?")

这一步就是真正向模型提问。模型在回答前,会参考你定义的 schema,生成符合格式的 JSON 数据。

首先将 schema 转为 JSON Schema,把你的 Python 模板类转成 JSON 格式的规则。然后发给LLM,告诉模型“你输出要符合这个格式”。最后验证输出,模型生成后再校验是否合规,确保你收到的数据符合格式。

你就像是在说:

“AI,你回答我的时候,不能随便写一段文字,必须照着我这张表格来写,字段名和格式都要对上!”

Other Machine-Readable Formats with Output Parsers:其他带有输出解析器的机器可读格式

输出解析器是干嘛的?

输出解析器是帮助大语言模型(LLM)把结果以特定格式输出的一种工具。它有两个主要功能:

  1. 提供格式说明(Providing format instructions)

你可以用解析器给提示(prompt)加上一些额外的说明,比如告诉模型:

“请把结果输出成 XML 格式” 或
“请生成一个 JSON 对象,字段有 name 和 age”

这样模型就知道你想要的输出长什么样。

  1. 验证和解析输出(Validating and parsing output)

LLM 返回结果后,输出解析器还可以:

把普通文本转换成结构化格式(如列表、XML、JSON等);

校验格式是否正确;

修复模型输出中不完整或多余的内容。

这是一个输出解析器的工作示例

from langchain_core.output_parsers import CommaSeparatedListOutputParserparser = CommaSeparatedListOutputParser()items = parser.invoke("apple, banana, cherry")print(items)
['apple', 'banana', 'cherry']

LangChain 为各种用例提供了多种输出解析器,包括 CSV、XML 等。在下一节中,我们将了解如何将输出解析器与模型和提示组合使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中间件--ClickHouse-12--案例-1-日志分析和监控

1、案例背景 一家互联网公司需要实时分析其服务器日志、应用日志和用户行为日志,以快速发现潜在问题并优化系统性能。 2、需求分析 目标:实时分析日志数据,快速发现问题并优化系统性能。数据来源: 服务器日志:如 Ng…

多道程序和多任务操作系统区别

多道程序 vs. 多道任务:对比分析 ✅ 共同点 方面共同特征核心机制都依赖于进程/任务切换执行需求实现多个程序或任务"并发"执行系统支持都需要操作系统的支持(如调度算法、内存管理)本质目标提高资源利用率(CPU不空转…

齐次坐标变换+Unity矩阵变换

矩阵变换 变换(transform):指的是我们把一些数据,如点,方向向量甚至是颜色,通过某种方式(矩阵运算),进行转换的过程。 变换类型 线性变换:保留矢量加和标量乘的计算 f(x)…

闲来无事,用HTML+CSS+JS打造一个84键机械键盘模拟器

今天闲来无聊,突发奇想要用前端技术模拟一个机械键盘。说干就干,花了点时间搞出来了这么一个有模有样的84键机械键盘模拟器。来看看效果吧! 升级版的模拟器 屏幕录制 2025-04-18 155308 是不是挺像那么回事的?哈哈! 它…

智慧城市:如同为城市装上智能大脑,开启智慧生活

智慧城市的概念随着信息技术的飞速发展而逐渐兴起,它通过集成物联网、大数据、人工智能和数字孪生等先进技术,为城市管理和居民生活带来了前所未有的智能化变革。本文将深入探讨这些核心技术及其在智慧城市的典型应用场景,展示智慧城市如何提…

科技快讯 | 智谱开源最新GLM模型系列;“AI 洗头店”现身广州;ChatGPT上线图库功能

智谱开源最新GLM模型系列,启用全球域名“Z.ai” 4月15日,智谱开源最新GLM模型系列,包括32B和9B尺寸,涵盖基座、推理、沉思三类模型,全部遵循MIT开源许可协议。推理模型GLM-Z1-32B-0414实测推理速度达200 tokens/秒&…

第32讲:卫星遥感与深度学习融合 —— 让地球“读懂”算法的语言

目录 🔍 一、讲讲“遥感+深度学习”到底是干啥的? ✅ 能解决什么问题? 🧠 二、基础原理串讲:深度学习如何“看懂”遥感图? 🛰 遥感图像数据类型: 🧠 CNN的基本思路: 🧪 三、实战案例:用CNN对遥感图像做地类分类 📦 所需R包: 🗂️ 步骤一:构建训…

【多线程5】面试常考锁知识点

文章目录 悲观/乐观锁挂起等待锁/自旋锁偏向锁轻量级/重量级锁锁升级CASCAS引发的ABA问题解决方案 原子类 公平/不公平锁可重入锁ReentrantLock读写锁 Callable接口 这里的“悲观”“乐观”“挂起等待”“自旋”“轻量级”“重量级”“公平”“非公平”“可重入”仅代表某个锁的…

第三届世界科学智能大赛新能源赛道:新能源发电功率预测-数据处理心得体会1

看懂数据 比赛数据说明: 文档(报名之后可以下载)大小操作初赛测试集.zip94MB下载初赛训练集.zip632MB下载output.zip145KB下载 任务和主题 AI新能源功率预报:根据历史发电功率数据和对应时段多类别气象预测数据,实…

【云馨AI-大模型】2025年4月第三周AI领域全景观察:硬件革命、生态博弈与国产化突围

一、硬件算力突破点燃多智能体时代 谷歌在4月12日Cloud Next大会发布第七代TPU Ironwood,单芯片算力达4614 TFLOPs,较前代内存提升6倍,专为AI推理场景优化。配合发布的Gemini 2.5 Flash模型通过"思考"功能实现成本优化&#xff0c…

第3章 垃圾收集器与内存分配策略《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》

第3章 垃圾收集器与内存分配策略 3.2 对象已死 Java世界中的所有对象实例,垃圾收集器进行回收前就是确定对象哪些是活着的,哪些已经死去。 3.2.1 引用计数算法 常见的回答是:给对象中添加一个引用计数器,有地方引用&#xff0…

超详细VMware虚拟机扩容磁盘容量-无坑版

1.环境: 虚拟机:VMware Workstation 17 Pro-17.5.2 Linux系统:Ubuntu 22.04 LTS 2.硬盘容量 虚拟机当前硬盘容量180G -> 扩展至 300G 3.操作步骤 (1)在虚拟机关机的状态下,虚拟机硬盘扩容之前必…

HarmonyOS:1.4 - HarmonyOS应用程序框架基础

判断题 1.在基于Stage模型开发的应用项目中都存在一个app.json5配置文件、以及一个或多个module.json5配置文件。 正确(True) 2.一个应用只可以包含一个UIAbility组件。 错误(False) 3.Background状态在UIAbility实例销毁时触发。可以在onDestroy()回调中进行系统资源的释…

HTTP HTTPS RSA

推荐阅读 小林coding HTTP篇 文章目录 HTTP 80HTTP 响应码1xx:信息性状态码(Informational)2xx:成功状态码(Success)3xx:重定向状态码(Redirection)4xx:客户端…

ORACLE数据库转国产阿里OceanBase数据库

1.BLOB类型修改 将接口内oracle.sql.BLOB改为java.sql.Blob 2.REGEXP_LIKE 判断函数正则表达式中字符转义问题 OB的正则表达式使用的是标准的Linux模式,oracle是黑盒子,在处理部分转义符([])的时候, Oracle无需使用转义符,OB务必使用转义符,加/转义处理,例如在regexp_like(t…

STM32的三种启动方式

目录 一、从主闪存存储器启动(Main Flash Memory) 二、从系统存储器启动(System Memory) 三、从内置SRAM启动(Embedded SRAM) 一、从主闪存存储器启动(Main Flash Memory) >&g…

Flutter使用flutter_driver进行自动化测试

Flutter自动化测试实践指南 作为一名iOS开发者,我最近对Flutter的自动化测试产生了浓厚兴趣。在开发过程中,我发现自动化测试对于保证应用质量至关重要,特别是像我们这样的创业团队,测试资源有限的情况下。 搭建Flutter自动化测…

Halcon应用:九点标定-手眼标定

提示:若没有查找的算子,可以评论区留言,会尽快更新 Halcon应用:九点标定-手眼标定 前言一、Halcon应用?二、应用实战1、图形理解[eye-to-hand]:1.1、开始应用2、 图形理解[eye-in-hand]2.1、 开始应用 前言…

【C++11】列表初始化、右值引用、完美转发、lambda表达式

📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🌐 C 语言 上篇文章:unordered_map、unordered_set底层编写 下篇文章:C11:新的类功能、模板的可…

Pandas取代Excel?

有人在知乎上提问:为什么大公司不用pandas取代excel? 而且列出了几个理由:Pandas功能比Excel强大,运行速度更快,Excel除了简单和可视化界面外,没有其他更多的优势。 有个可怕的现实是,对比Exce…