5分鐘明白LangChain 的輸出解析器和鏈

程序员半支烟發表於2024-05-27

本文介紹 LangChain 的輸出解析器OutputParser的使用,和基於LangChain的LCEL構建

1. 輸出解析器OutputParser

1.1、為什麼需要OutputParser

常規的使用LangChain構建LLM應用的流程是:Prompt 輸入、呼叫LLM 、LLM輸出。有時候我們期望LLM給到的資料是格式化的資料,方便做後續的處理。

這時就需要在Prompt裡設定好要求,然後LLM會在輸出內容後,再將內容傳給輸出解析器,輸出解析器會解析成我們預期的格式。

1.2、程式碼實踐

呼叫系統自帶的輸出解析器

示例1:將呼叫 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)


自定義格式的輸出解析器

除了使用自帶的一些輸出格式,還可以使用自定義的輸出格式。使用步驟如下:

  • 定義資料結構類,繼承pydanticBaseModel
  • 使用輸出解析器PydanticOutputParser
  • 後續是常規操作:生成prompt、呼叫LLM執行、將輸出按照Parser解析

示例2:比如給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)

2. 利用LCEL構建鏈

2.1、LCEL是啥

LCEL是LangChain 表示式語言(LangChain Expression Language)的簡稱。使用LCEL可以快速將各種組合到一起,那又是啥呢?

在LangChain裡只要實現了Runnable介面,並且有invoke方法,都可以成為。實現了Runnable介面的類,可以拿上一個鏈的輸出作為自己的輸入。

比如以上程式碼的ChatPromptTemplateChatOpenAIPydanticOutputParser等,都實現了Runnable介面,且都有invoke方法。

LCEL提供了多種方式將鏈組合起來,比如使用管道符 |,這種方式既方便書寫,表達力也很強勁。

2.2、使用區別

不使用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)

使用LCEL

使用LCEL時,程式碼簡潔,並且表達力強許多,比如這樣:

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

3、總結

本文主要聊了LangChain的輸出解析器 和 使用LCEL構建鏈,希望對你有幫助!

======>>>>>> 關於我 <<<<<<======

本篇完結!歡迎點贊 關注 收藏!!!

原文連結:https://mp.weixin.qq.com/s/VapTZbsDDPzfu9eqMzeToQhttp://www.mangod.top/articles/2024/05/27/1716768844603.html

相關文章