LangChain输出解析器与链的深度解析

本文将详细介绍LangChain的输出解析器OutputParser的使用方法,以及如何基于LangChain的LCEL构建链。我们将通过实例来展示这些功能,帮助您更好地理解和使用LangChain。

一、输出解析器OutputParser

1.1 为什么需要OutputParser

在使用LangChain构建LLM应用的常规流程中,我们需要进行Prompt输入、调用LLM、以及处理LLM的输出。有时候,我们期望LLM给到的数据是格式化的数据,这样可以方便我们进行后续的处理。

为了实现这个目标,我们需要在Prompt里设置好要求,然后LLM会在输出内容后,再将内容传给输出解析器,输出解析器会将内容解析成我们预期的格式。

流程图

1.2 代码实践

1.2.1 调用系统自带的输出解析器

我们可以使用系统自带的输出解析器来解析LLM的结果。例如,我们可以将LLM的结果解析为逗号分隔的列表。以下是一个示例,它询问某个城市有N个景点。

from langchain_openai import ChatOpenAI
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "{parser_instructions}"),
    ("human", "列出{cityName}的{viewPointNum}个著名景点。")
])

output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()
# 查看解析器的指令内容
print(parser_instructions)

final_prompt = prompt.invoke({"cityName": "南京", "viewPointNum": 3, "parser_instructions": parser_instructions})

model = ChatOpenAI(model="gpt-3.5-turbo",
                   openai_api_key="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                   openai_api_base="https://api.aigc369.com/v1")
response = model.invoke(final_prompt)
print(response.content)

ret = output_parser.invoke(response)
print(ret)

1.2.2 自定义格式的输出解析器

除了使用系统自带的输出格式,我们还可以使用自定义的输出格式。使用步骤如下:

  • 定义数据结构类,继承pydantic的BaseModel

  • 使用输出解析器PydanticOutputParser

  • 后续是常规操作:生成prompt、调用LLM执行、将输出按照Parser解析

以下是一个示例,它给LLM一段书籍的介绍,让他按照指定的格式总结输出。

from typing import List

from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import ChatPromptTemplate
from langchain.schema import HumanMessage
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI


class BookInfo(BaseModel):
    book_name: str = Field(description="书籍的名字")
    author_name: str = Field(description="书籍的作者")
    genres: List[str] = Field(description="书籍的体裁")


output_parser = PydanticOutputParser(pydantic_object=BookInfo)
# 查看输出解析器的内容,会被输出成json格式
print(output_parser.get_format_instructions())

prompt = ChatPromptTemplate.from_messages([
    ("system", "{parser_instructions} 你输出的结果请使用中文。"),
    ("human", "请你帮我从书籍的概述中,提取书名、作者,以及书籍的体裁。书籍概述会被三个#符号包围。\n###{book_introduction}###")
])

book_introduction = """
《朝花夕拾》原名《旧事重提》,是现代文学家鲁迅的散文集,收录鲁迅于1926年创作的10篇回忆性散文, [1]1928年由北京未名社出版,现编入《鲁迅全集》第2卷。
此文集作为“回忆的记事”,多侧面地反映了作者鲁迅青少年时期的生活,形象地反映了他的性格和志趣的形成经过。前七篇反映他童年时代在绍兴的家庭和私塾中的生活情景,后三篇叙述他从家乡到南京,又到日本留学,然后回国教书的经历;揭露了半殖民地半封建社会种种丑恶的不合理现象,同时反映了有抱负的青年知识分子在旧中国茫茫黑夜中,不畏艰险,寻找光明的困难历程,以及抒发了作者对往日亲友、师长的怀念之情 [2]。
文集以记事为主,饱含着浓烈的抒情气息,往往又夹以议论,做到了抒情、叙事和议论融为一体,优美和谐,朴实感人。作品富有诗情画意,又不时穿插着幽默和讽喻;形象生动,格调明朗,有强烈的感染力。
"""

model = ChatOpenAI(model="gpt-3.5-turbo",
                   openai_api_key="sk-BuQK7SGbqCZP2i2z7fF267AeD0004eF095AbC78d2f79E019",
                   openai_api_base="https://api.aigc369.com/v1")
final_prompt = prompt.invoke({"book_introduction": book_introduction,
                              "parser_instructions": output_parser.get_format_instructions()})
response = model.invoke(final_prompt)
print(response.content)
result = output_parser.invoke(response)
print(result)

二、利用LCEL构建链

2.1 LCEL是啥

LCEL是LangChain 表达式语言(LangChain Expression Language)的简称。使用LCEL可以快速将各种链组合到一起,那链又是啥呢?

在LangChain里,只要一个类实现了Runnable接口,并且有invoke方法,都可以成为链。实现了Runnable接口的类,可以拿上一个链的输出作为自己的输入。

LCEL构建链

2.2 使用区别

2.2.1 不使用LCEL

如果我们不使用LCEL,代码写起来可能会比较繁琐,invoke方法会满天飞。比如这样:

final_prompt = prompt.invoke({"book_introduction": book_introduction,
                              "parser_instructions": output_parser.get_format_instructions()})
response = model.invoke(final_prompt)
result = output_parser.invoke(response)

2.2.2 使用LCEL

如果我们使用LCEL,代码会变得更加简洁,表达力也会更强。比如这样:

chain = prompt | model | output_parser
ret = chain.invoke({"book_introduction": book_introduction,
                    "parser_instructions": output_parser.get_format_instructions()})

LangChain输出解析器与链的深度解析文章来源地址https://www.toymoban.com/diary/system/775.html

到此这篇关于LangChain输出解析器与链的深度解析的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/system/775.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
上一篇 2024年05月23日 16:42
个人电脑与服务器:CPU的差异深度解析
下一篇 2024年05月28日 14:58

相关文章

  • 深度解析JVM类加载器与双亲委派模型

    Java虚拟机(JVM)是Java程序运行的核心,其中类加载器和双亲委派模型是JVM的重要组成部分。本文将深入讨论这两个概念,并解释它们在实际开发中的应用。 1. 什么是类加载器? 类加载器是JVM的一部分,负责加载Java类的字节码文件。Java应用程序中的每个类都必须由类加载器

    2024年01月17日
    浏览(73)
  • LangChain 67 深入理解LangChain 表达式语言30 调用tools搜索引擎 LangChain Expression Language (LCEL)

    LangChain系列文章 LangChain 50 深入理解LangChain 表达式语言十三 自定义pipeline函数 LangChain Expression Language (LCEL) LangChain 51 深入理解LangChain 表达式语言十四 自动修复配置RunnableConfig LangChain Expression Language (LCEL) LangChain 52 深入理解LangChain 表达式语言十五 Bind runtime args绑定运行时参数

    2024年01月23日
    浏览(82)
  • HTTP深度解析:构建高效与安全网络的关键知识

    1. HTTP基础及其组件 我首先想和大家分享的是HTTP的基础知识。HTTP,即超文本传输协议,是互联网上最常用的协议之一。它定义了浏览器和服务器之间数据交换的规则,使得网页内容可以从服务器传输到我们的浏览器上。想象一下,每当你点击一个链接或输入网址时,就是HT

    2024年02月04日
    浏览(75)
  • VPN深度解析:构建安全网络的关键技术

    VPN,即虚拟私人网络(Virtual Private Network),是一种网络技术,用于在公共网络上创建一个安全的网络连接。它允许用户通过加密的隧道在互联网上发送和接收数据,从而保护数据免受拦截和窥探。VPN不仅加密数据,还能隐藏用户的IP地址,提供匿名性和绕过地理位置限制的能

    2024年01月17日
    浏览(127)
  • 深度解析 Docker Registry:构建安全高效的私有镜像仓库

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:大数据系列 ✨文章内容:Docker Registry 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 Docker Registry是Docker生态系统中关键的组件,负责存储

    2024年02月04日
    浏览(82)
  • 前端UI组件库深度解析:构建现代化的用户体验

    在当今的前端开发中,UI组件库已经成为了我们工具箱中不可或缺的一部分。这些库可以极大地提高我们的工作效率,同时也使我们能够专注于实现真正的业务逻辑,而不是重复地编写UI代码。本篇博客将详细地探讨UI组件库的核心概念,特性以及如何有效地使用它们。 UI组件

    2024年02月10日
    浏览(74)
  • Python生成器深度解析:构建强大的数据处理管道

    生成器是Python的一种核心特性,允许我们在请求新元素时再生成这些元素,而不是在开始时就生成所有元素。它在处理大规模数据集、实现节省内存的算法和构建复杂的迭代器模式等多种情况下都有着广泛的应用。在本篇文章中,我们将从理论和实践两方面来探索Python生成器

    2024年02月07日
    浏览(91)
  • 深入探究C++中的STL:容器、迭代器与算法全解析

    Standard Template Library:标准模板库 是一个基于泛型的C++类模板库由Alexander Stepanov于1994年开发 其目的是为了提供一致通用和高效的数据结构和算法,同时不限制用户所处理的数据类型和编程范式。STL的原型最初由Andrew Koenig和其它C++专家小组进行设计并在1995年C++标准委员会的推

    2024年02月05日
    浏览(71)
  • 从方法论到最佳实践,深度解析企业云原生 DevSecOps 体系构建

    作者:匡大虎 安全一直是企业上云关注的核心问题。随着云原生对云计算基础设施和企业应用架构的重定义,传统的企业安全防护架构已经不能够满足新时期下的安全防护要求。为此企业安全人员需要针对云原生时代的安全挑战重新进行系统性的威胁分析并构建适合企业自身

    2024年01月25日
    浏览(75)
  • calcite在flink中的二次开发,介绍解析器与优化器

    关于calcite的概念相关的内容,在我另一篇帖子 深入理解flinksql执行流程,扩展解析器实现语法的扩展 首先阐述一下 codegen: Codegen是基于ObjectWeb ASM的低开销的java代码生成器,他可以根据预先填好的规则与条件,通过编译代码,自动生成java类 在递归调用各个节点 DataStreamRel 的

    2024年02月22日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包