[LangChain核心模块]模型的输入输出->output_parsers

这篇具有很好参考价值的文章主要介绍了[LangChain核心模块]模型的输入输出->output_parsers。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:人工智能。


输出解析器 output_parsers
语言模型输出文本。但很多时候,您可能希望获得比仅文本更结构化的信息。这就是输出解析器的作用。
输出解析器是帮助结构化语言模型响应的类。一个输出解析器必须实现两个主要方法:
“获取格式化指令”: 一个返回包含语言模型输出应如何格式化的字符串的方法。
“解析”: 一个接受字符串(假设为语言模型的响应)并将其解析为某种结构的方法。
然后再加一个可选的方法:
“带提示解析”: 一个接受字符串(假设为语言模型的响应)和提示(假设为生成此响应的提示)并将其解析为某种结构的方法。在需要从提示中获取信息以重试或修复输出的情况下,通常提供提示。

1、快速入门

下面我们来介绍主要类型的输出解析器,PydanticOutputParser。

from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field, validator
from typing import List
model_name = 'text-davinci-003'
temperature = 0.0
model = OpenAI(model_name=model_name, temperature=temperature)
# Define your desired data structure.
class Joke(BaseModel):
    setup: str = Field(description="question to set up a joke")
    punchline: str = Field(description="answer to resolve the joke")
    
    # You can add custom validation logic easily with Pydantic.
    @validator('setup')
    def question_ends_with_question_mark(cls, field):
        if field[-1] != '?':
            raise ValueError("Badly formed question!")
        return field
# Set up a parser + inject instructions into the prompt template.
parser = PydanticOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
    template="Answer the user query.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()}
)
# And a query intented to prompt a language model to populate the data structure.
joke_query = "Tell me a joke."
_input = prompt.format_prompt(query=joke_query)
output = model(_input.to_string())
parser.parse(output)
Joke(setup='Why did the chicken cross the road?', punchline='To get to the other side!')

2、comma_separated

列表解析器 comma_separated:
您想返回一个逗号分隔项的列表时,可以使用此输出解析器。

from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
output_parser = CommaSeparatedListOutputParser()
format_instructions = output_parser.get_format_instructions()
prompt = PromptTemplate(
    template="List five {subject}.\n{format_instructions}",
    input_variables=["subject"],
    partial_variables={"format_instructions": format_instructions}
)
model = OpenAI(temperature=0)
_input = prompt.format(subject="ice cream flavors")
output = model(_input)
output_parser.parse(output)
['Vanilla',
     'Chocolate',
     'Strawberry',
     'Mint Chocolate Chip',
     'Cookies and Cream']

3、output_fixing_parser

自动修复解析器 output_fixing_parser:
此输出解析器包装另一个输出解析器,如果第一个解析器失败,则调用另一个LLM来修复任何错误。
但除了抛出错误之外,我们还可以做其他事情。具体来说,我们可以将格式不正确的输出和格式化的指令一起传递给模型,并要求它修复它。
对于这个例子,我们将使用上面的 Pydantic 输出解析器。如果我们传递给它一个不符合模式的结果,会发生以下情况:

from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field, validator
from typing import List
class Actor(BaseModel):
    name: str = Field(description="name of an actor")
    film_names: List[str] = Field(description="list of names of films they starred in")
        
actor_query = "Generate the filmography for a random actor."

parser = PydanticOutputParser(pydantic_object=Actor)
misformatted = "{'name': 'Tom Hanks', 'film_names': ['Forrest Gump']}"
parser.parse(misformatted)
---------------------------------------------------------------------------

    JSONDecodeError                           Traceback (most recent call last)

    File ~/workplace/langchain/langchain/output_parsers/pydantic.py:23, in PydanticOutputParser.parse(self, text)
         22     json_str = match.group()
    ---> 23 json_object = json.loads(json_str)
         24 return self.pydantic_object.parse_obj(json_object)


    File ~/.pyenv/versions/3.9.1/lib/python3.9/json/__init__.py:346, in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
        343 if (cls is None and object_hook is None and
        344         parse_int is None and parse_float is None and
        345         parse_constant is None and object_pairs_hook is None and not kw):
    --> 346     return _default_decoder.decode(s)
        347 if cls is None:


    File ~/.pyenv/versions/3.9.1/lib/python3.9/json/decoder.py:337, in JSONDecoder.decode(self, s, _w)
        333 """Return the Python representation of ``s`` (a ``str`` instance
        334 containing a JSON document).
        335 
        336 """
    --> 337 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
        338 end = _w(s, end).end()


    File ~/.pyenv/versions/3.9.1/lib/python3.9/json/decoder.py:353, in JSONDecoder.raw_decode(self, s, idx)
        352 try:
    --> 353     obj, end = self.scan_once(s, idx)
        354 except StopIteration as err:


    JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

    
    During handling of the above exception, another exception occurred:


    OutputParserException                     Traceback (most recent call last)

    Cell In[6], line 1
    ----> 1 parser.parse(misformatted)


    File ~/workplace/langchain/langchain/output_parsers/pydantic.py:29, in PydanticOutputParser.parse(self, text)
         27 name = self.pydantic_object.__name__
         28 msg = f"Failed to parse {name} from completion {text}. Got: {e}"
    ---> 29 raise OutputParserException(msg)


    OutputParserException: Failed to parse Actor from completion {'name': 'Tom Hanks', 'film_names': ['Forrest Gump']}. Got: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

现在我们可以构建并使用一个 OutputFixingParser。这个输出解析器接受另一个输出解析器作为参数,还有一个 LLM,用来尝试纠正任何格式错误。

from langchain.output_parsers import OutputFixingParser

new_parser = OutputFixingParser.from_llm(parser=parser, llm=ChatOpenAI())
new_parser.parse(misformatted)
Actor(name='Tom Hanks', film_names=['Forrest Gump'])

4、structured

结构化输出解析器 structured:
当您想要返回多个字段时,可以使用此输出解析器。尽管Pydantic/JSON解析器更强大,但我们最初尝试的数据结构仅具有文本字段。

from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI

这里我们定义了我们想要接收的响应模式。

response_schemas = [
    ResponseSchema(name="answer", description="answer to the user's question"),
    ResponseSchema(name="source", description="source used to answer the user's question, should be a website.")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

我们现在获得一个包含响应格式化指令的字符串,然后将其插入到我们的提示中。

format_instructions = output_parser.get_format_instructions()
prompt = PromptTemplate(
    template="answer the users question as best as possible.\n{format_instructions}\n{question}",
    input_variables=["question"],
    partial_variables={"format_instructions": format_instructions}
)

我们现在可以使用这个来格式化一个提示,发送给语言模型,然后解析返回的结果。

model = OpenAI(temperature=0)
_input = prompt.format_prompt(question="what's the capital of france?")
output = model(_input.to_string())
output_parser.parse(output)
{'answer': 'Paris',
     'source': 'https://www.worldatlas.com/articles/what-is-the-capital-of-france.html'}

这里是一个在聊天模型中使用它的例子文章来源地址https://www.toymoban.com/news/detail-599241.html

chat_model = ChatOpenAI(temperature=0)
prompt = ChatPromptTemplate(
    messages=[
        HumanMessagePromptTemplate.from_template("answer the users question as best as possible.\n{format_instructions}\n{question}")  
    ],
    input_variables=["question"],
    partial_variables={"format_instructions": format_instructions}
)
_input = prompt.format_prompt(question="what's the capital of france?")
output = chat_model(_input.to_messages())
output_parser.parse(output.content)
{'answer': 'Paris', 'source': 'https://en.wikipedia.org/wiki/Paris'}

到了这里,关于[LangChain核心模块]模型的输入输出->output_parsers的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32:pwm output模块,记录一下我是用smt32,输出pwm波的记录--(实现--重要)

    我是实现了输出pwm波,频率固定,占空比可以不断调整的方法,将PA0接到示波器上,可以看到是一个标准的PWM波,如图下面示波器图。 我刚开始设置的分频的倍数是7199,使得分频的太大了,示波器显示不了,最后修改为71就可以,我之前设置读取pwm也是一样的, 都是设置的

    2024年02月22日
    浏览(26)
  • 【LangChain】P1 LangChain 应用程序的核心构建模块 LLMChain 以及其三大部分

    LangChain 应用程序的核心构建模块 LLMChain 由三部分组成: 语言模型 - LLMs: 语言模型是这里的核心推理引擎。为了使用 LangChain,您需要了解不同类型的语言模型以及如何使用它们。 提示模板 - Prompt templates: 它为语言模型提供指令。它控制着语言模型的输出,因此了解如何构

    2024年02月12日
    浏览(33)
  • python subprocess.run()、subprocess.Popen()、subprocess.check_output()(执行系统命令、启动新的进程、连接到子进程的输入/输出管道)

    Python的subprocess模块是用于创建和管理子进程的模块。它提供了一种在Python中调用外部命令的方式,可以执行系统命令、启动新的进程、连接到子进程的输入/输出管道等。 subprocess.run 运行指定的命令,并等待其完成。args参数是一个字符串或列表,表示要执行的命令和参数。

    2024年02月09日
    浏览(36)
  • verilog 模块输入输出描述

    表格 端口 从模块内部看 从模块外部看 input 输入端口 必须为线网类型 额可以线网类型或寄存器类型 output 输出端口 可以是线网类型或寄存器类型 必须为线网类型 inout 输入输出端口 必须为线网类型 必须为线网类型 说明 端口连接规则 将一个端口看成由相互链接的两个部分组

    2024年02月14日
    浏览(25)
  • 【AI大模型应用开发】【LangChain系列】9. 实用技巧:大模型的流式输出在 OpenAI 和 LangChain 中的使用

    大家好,我是同学小张,日常分享AI知识和实战案例 欢迎 点赞 + 关注 👏, 持续学习 , 持续干货输出 。 +v: jasper_8017 一起交流💬,一起进步💪。 微信公众号也可搜【同学小张】 🙏 本站文章一览: 当大模型的返回文字非常多时,返回完整的结果会耗费比较长的时间。如果

    2024年04月09日
    浏览(40)
  • LangChain中的output parsers

            生成语言模型由于生成不可控,所以生成的自然语言是非结构话的文本。而prompt的出现使得用户可以将期望的输出文本格式进行约束和规范。LangChain中的output parsers模块可以使模型输出的期望的结构化文本,使用的正是prompt操作。         LangChain中的output parsers一共

    2024年02月16日
    浏览(28)
  • Web 攻防之业务安全:输入 / 输出模块测试.

    业务安全是指保护业务系统免受安全威胁的措施或手段。 广义 的业务安全应包括业务运行的 软硬件平台 (操作系统、数据库,中间件等)、 业务系统自身 (软件或设备)、 业务所提供的服务安全 ; 狭义 的业务安全指 业务系统自有的软件与服务的安全 。 输入 / 输出模块

    2023年04月24日
    浏览(28)
  • DC电源模块关于宽电压输入和输出的范围

    BOSHIDA DC电源模块关于宽电压输入和输出的范围 DC电源模块是一种电子设备,能够将输入的直流电源转换成所需的输出电源,用于供电各种电子设备。其中,关于宽电压输入和输出的范围,是DC电源模块常见的设计要求之一。本文将详细介绍DC电源模块的宽电压输入和输出的范

    2024年02月07日
    浏览(33)
  • 【AI大模型应用开发】【LangChain系列】5. 实战LangChain的智能体Agents模块

    大家好,我是【同学小张】。持续学习,持续干货输出,关注我,跟我一起学AI大模型技能。 在我前面的MetaGPT系列文章中,已经对智能体有了一个认知,重温一下: 智能体 = LLM+观察+思考+行动+记忆 将大语言模型作为一个推理引擎。给定一个任务,智能体自动生成完成任务所

    2024年03月09日
    浏览(42)
  • LangChain大模型应用落地实践(二):使用LLMs模块接入自定义大模型,以ChatGLM为例

    angChain版本:0.0.147 ;(没想到第二更LangChain已经更新到147了) 图1 大模型时间线(2023-arxiv-A Survey of Large Language Models) 模型名称 企业/高校 发布时间 ERNIE Bot(文心一言) 百度 2023年3月 ChatGLM 清华大学 2023年3月 通义千问 阿里 2023年4月 MOSS 复旦大学 2023年4月 从图1中可以看出,

    2024年02月09日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包