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

4,344次阅读
没有评论

共计 4030 个字符,预计需要花费 11 分钟才能阅读完成。

本文将详细介绍 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

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

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计4030字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)