LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers

这篇具有很好参考价值的文章主要介绍了LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,以便在不同的应用程序中使用。

今天我们来学习DeepLearning.AI的在线课程:LangChain for LLM Application Development的第一门课:Models, Prompts and Output Parsers,该门课程主要讲解如何在Langchain中定义模型,如何编写Prompt以及如何对输出结果进行解析。

设置访问LLM的API key

因为Langchain本身只是一个LLM的应用框架,所以它必须和LLM对接才能使用,这里和Langchain对接的LLM主要是openai的语言模型,所以我们需要设置访问Openai的api key:

#!pip install python-dotenv
#!pip install openai

import os
import openai

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.environ["OPENAI_API_KEY"]

Chat API : OpenAI

首先让我们从直接从调用 OpenAI 的API 开始。下面是我们访问openai的“gpt-3.5-turbo”模型的主要代码:

def get_completion(prompt, model="gpt-3.5-turbo"):
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0, 
    )
    return response.choices[0].message["content"]

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 下面我们我们用openai的api来实现一个简单的语调转换的简单例子,首先我们需要定义一个prompt:

customer_email="""
哎呀,我很生气,因为我的搅拌机盖子飞走了,冰沙溅到了我的厨房墙壁上! 
更糟糕的是,保修不包括清理厨房的费用。 我现在需要你的帮助,朋友!
"""

style ="""
委婉和耐心的语气表达
"""

prompt =f"""将由三个反引号分隔的文本
转换为{style}风格。
文本:```{customer_email}```
"""

print(prompt)

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 这里我们定义了一个prompt,该prompt是由f-string定义的一个长字符串,其中嵌入了两个变量,style和customer_email,并且主要的文本内容customer_email用一对3个反引号隔离。这是创建openai的prompt的典型方法。

response = get_completion(prompt)
print(response)

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

Chat API : LangChain

让我们尝试一下如何使用 LangChain 来做同样的事情。

Model

首先我们需要通过langchain来创建一个chat model对象:

#!pip install --upgrade langchain

from langchain.chat_models import ChatOpenAI

#要减少LLM 生成文本的随机性,请设置温度参数= 0.0
chat = ChatOpenAI(temperature=0.0)
chat

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 这里我们定义了一个Langchain的聊天模型,该模型的默认参数均为openai的API的参数,如“model_name”=“gpt-3.5-turbo”,“temperature”=0.0等,这里需要说明的时候temperature参数的默认值为0.7,只是这里我们人为设置为0.0,除此之外其他参数均为默认参数。

定义Langchain的Prompt 模板

style ="""
委婉和耐心的语气表达
"""
customer_email="""
哎呀,我很生气,因为我的搅拌机盖子飞走了,冰沙溅到了我的厨房墙壁上! 
更糟糕的是,保修不包括清理厨房的费用。 我现在需要你的帮助,朋友!
"""

template_string = """将由三个反引号分隔的文本
转换为 {style} 风格。
文本:```{text}```
"""

这里需要说明的是template_string并不是f-string,所以其中的{style}和{text}并不是变量,而是属于字符串本身的一部分。接下来我们需要定义一个prompt模板:ChatPromptTemplate

from langchain.prompts import ChatPromptTemplate

prompt_template = ChatPromptTemplate.from_template(template_string)
prompt_template

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 这里我们可以看到虽然我们没有将template_string定义为f-string,但是当我们创建prompt_template 时,会自动将template_string的中{style}和{text}识别为变量,并且将模板的格式定义为f-string。

下面我们创建一个message,该message是由prompt 模板的format_messages方法生成的,该方法包含了两个参数:style和text, 这两个参数对应于template_string 中的两个变量{style}和{text}。

customer_messages = prompt_template.format_messages(
                    style=style,
                    text=customer_email)
customer_messages

下面我们调用LLM 来实现客户信息的语气风格转换:

#调用LLM来翻译客户信息的风格
customer_response = chat(customer_messages)
print(customer_response.content)

 LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 这里我们可以看到输出结果与之前直接调用openai api的方法的结果是一样的。下面我们再看一个例子:

service_reply ="""
嘿,顾客,保修不包括厨房的清洁费用,\
因为您在启动搅拌机之前忘记盖上盖子而误用搅拌机,这是您的错。 \
倒霉! 再见!
"""

service_style = """
和蔼和礼貌的口吻
"""

service_messages = prompt_template.format_messages(
    style=service_style,
    text=service_reply)

print(service_messages[0].content)

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

service_response = chat(service_messages)
print(service_response.content)

 LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 输出解析(Output Parsers)

 在之前的博客:使用大型语言模(LLM)构建系统(七):评估1中我们发现有时候LLM的输出结果数据中除了会包含我们需要的指定格式数据以外还会附带一些文本说明信息,而这些文本说明信息的存在不利于我们解析LLM的输出结果,在之前的博客中我们通过修改prompt,在其中加入禁止输出某些的内容的语句后,输出结果有了改善。下面我们看看Langchain是如果来解析LLM的输出结果的。

customer_review = """
这款吹风机非常神奇。 它有四个设置:\
吹蜡烛、微风、风城、龙卷风。 \
两天后就到了,正好赶上我妻子的周年纪念礼物。 \
我想我的妻子非常喜欢它,她说不出话来。 \
到目前为止,我是唯一一个使用它的人,\
而且我每隔一天早上都会使用它来清除草坪上的树叶。\
它比其他吹叶机稍微贵一点,但我认为它的额外功能是值得的。
"""

review_template ="""
对于下面的文本,提取以下信息:

gift:该商品是作为礼物送给别人的吗? \
如果是,则回答 True;如果否或未知,则回答 False。

delivery_days:产品需要多少天到达? 如果没有找到该信息,则输出-1。

price_value:提取有关价值或价格的任何句子,\
并将它们输出为逗号分隔的 Python 列表。

输出包含下面的三个key的JSON格式:
gift
delivery_days
price_value

文本:{text}
"""

 这里我们提供了一段用户对商品的评语customer_review 和评语模板review_template,在review_template中我们要求LLM提取用户评语中的gift、delivery_days和price_value三部分信息,并以JSON格式输出。

from langchain.prompts import ChatPromptTemplate

prompt_template = ChatPromptTemplate.from_template(review_template)

messages = prompt_template.format_messages(text=customer_review)
chat = ChatOpenAI(temperature=0.0)
response = chat(messages)
print(response.content)

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 从上面的输出结果中我们可以看到LLM输出了一个符合要求的JSON格式,不过这里需要说明的是response.content返回的其实都是字符串,也就是说LLM只能返回字符串,无法直接返回特定类型的数据,下面我们用访问python字典的方式来访问返回结果中的数据,我们会看到它会报错:

# You will get an error by running this line of code 
# because'gift' is not a dictionary
# 'gift' is a string
response.content.get('gift')

 LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 这里报错的原因是string对象没有get属性。

将LLM输出字符串解析为Python字典

要解析输出结果中的格式化数据,我们需要定义ResponseSchema变量,这里我们需要解析3个变量gift、delivery_days和price_value,所以需要定义3个ResponseSchema,最后把它们打包在一起放在list中:

from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParser

gift_schema = ResponseSchema(name="gift",
                             description="该商品是作为礼物送给别人的吗?\
                             如果是,则回答 True,如果否或未知,则回答 False。")

delivery_days_schema = ResponseSchema(name="delivery_days",
                                      description="产品需要多少天才能送达? \
                                                   如果没有找到该信息,则输出-1。")

price_value_schema = ResponseSchema(name="price_value",
                                    description="提取有关价值或价格的任何句子,\
                                    并将它们输出为逗号分隔的 Python 列表。")

response_schemas = [gift_schema, 
                    delivery_days_schema,
                    price_value_schema]

 接下来我们要定义一个解析器StructuredOutputParser。

output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

 然后让该解析器给我们生成一个prompt,该prompt是一个格式化指令,它用来指导LLM产生格式化的输出结果:

format_instructions = output_parser.get_format_instructions()
print(format_instructions)

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 接下来我们要定义一个新的review_template_2模板,在之前的review_template模板中我们明确要求LLM生成一个包含3个key的JSON格式的结果,而在下面定义的review_template_2模板中我们不再要求LLM生成一个JSON格式的结果:

review_template_2 ="""
对于下面的文本,提取以下信息:

gift:该商品是作为礼物送给别人的吗? \
如果是,则回答 True;如果否或未知,则回答 False。

delivery_days:产品需要多少天送达? \
如果没有找到该信息,则输出-1。

price_value:提取有关价值或价格的任何句子,\
并将它们输出为逗号分隔的 Python 列表。

文本:{text}

{format_instructions}
"""

在review_template_2中除了一个{text}变量以为,我们还增加了一个{format_instructions}变量,该变量为先前的输出解析器output_parser创建的prompt, 它的作用就是告诉LLM怎么提取text中的格式化数据:

prompt = ChatPromptTemplate.from_template(template=review_template_2)

messages = prompt.format_messages(text=customer_review, 
                                format_instructions=format_instructions)

print(messages[0].content)

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 上面是我们将review_template_2、text,format_instructions三部分内容整合在一起的一个完整的prompt,下面我们让LLM读取这个完整的prompt,并查看返回结果:

response = chat(messages)
print(response.content)

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 下面我们用输出解析器来解析这个结果,看看能否得到我们想要的字典格式:

output_dict = output_parser.parse(response.content)
output_dict

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能我们使用type命令来查看它的类型:

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers,ChatGPT,NLP,自然语言处理,langchain,语言模型,人工智能

 总结

今天我们学习了如何使用langchain来创建prompt模板,并且langchain的prompt模板会自动识别prompt中的内嵌变量,在生成message时只需在prompt模板的format_messages方法中传递所需变量即可。另外我们还学习了如何通过Langchain来解析LLM的输出结果,通过创建ResponseSchema和StructuredOutputParser,可以产生用来指导LLM如何产生格式化数据的prompt即format_instructions ,LLM会根据format_instructions的要求自动生产格式化的输出结果,而无需我们告诉LLM该如何生成格式化的输出结果。

参考资料

DLAI - Learning Platform Beta

 文章来源地址https://www.toymoban.com/news/detail-566162.html

到了这里,关于LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 自然语言处理从入门到应用——LangChain:模型(Models)-[大型语言模型(LLMs):缓存LLM的调用结果]

    分类目录:《大模型从入门到应用》总目录 LangChain系列文章: 基础知识 快速入门 安装与环境配置 链(Chains)、代理(Agent:)和记忆(Memory) 快速开发聊天模型 模型(Models) 基础知识 大型语言模型(LLMs) 基础知识 LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(

    2024年02月16日
    浏览(54)
  • 从零开发短视频电商 Java开发者的AI大模型(LLM)应用开发和设计-LangChain4j

    Github : https://github.com/langchain4j https://github.com/langchain4j/langchain4j https://github.com/langchain4j/langchain4j-embeddings https://github.com/langchain4j/langchain4j-examples Java版 langchain , 利用LLMs的力量增强你的java应用程序。 该项目的目标是简化 AI/LLM 功能到 Java 应用程序的集成。 可以通过以下方式实

    2024年01月16日
    浏览(45)
  • 自然语言处理从入门到应用——LangChain:快速入门-[快速开发聊天模型]

    分类目录:《大模型从入门到应用》总目录 LangChain系列文章: 基础知识 快速入门 安装与环境配置 链(Chains)、代理(Agent:)和记忆(Memory) 快速开发聊天模型 模型(Models) 基础知识 大型语言模型(LLMs) 基础知识 LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(

    2024年02月15日
    浏览(45)
  • 基于LangChain的LLM应用开发3——记忆

    此情可待成追忆,只是当时已惘然。我们人类会有很多或美好或痛苦的回忆,有的回忆会渐渐模糊,有的回忆午夜梦醒,会浮上心头。 然而现在的大语言模型都是没有记忆的,都是无状态的,大语言模型自身不会记住和你对话之间的历史消息。根本用不着“时时勤拂拭”,天

    2024年02月08日
    浏览(41)
  • 一文入门最热的LLM应用开发框架LangChain

    1.1. LangChain 发展史 LangChain 的作者是 Harrison Chase,最初是于 2022 年 10 月开源的一个项目,在 GitHub 上获得大量关注之后迅速转变为一家初创公司。2017 年 Harrison Chase 还在哈佛上大学,如今已是硅谷的一家热门初创公司的 CEO,这对他来说是一次重大而迅速的跃迁。Insider 独家报

    2024年02月08日
    浏览(46)
  • Dify开源大语言模型(LLM) 应用开发平台如何使用Docker部署与远程访问

    本文主要介绍如何在Linux Ubuntu系统以Docker的方式快速部署Dify,并结合cpolar内网穿透工具实现公网远程访问本地Dify! Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你

    2024年04月10日
    浏览(45)
  • AIGC:【LLM(二)】——LangChain:由LLMs驱动的应用开发框架

    在过去几年中,大型语言模型 (LLM) 席卷了人工智能世界。随着 OpenAI 的 GPT-3 在 2020 年的突破性发布,我们见证了 LLM 的受欢迎程度稳步上升,并且随着该领域最近的进步而愈演愈烈。这些强大的 AI 模型为自然语言处理应用开辟了新的可能性,使开发人员能够在聊天机器人、问

    2024年02月06日
    浏览(52)
  • ChatGPT 使用 拓展资料:吴恩达大咖 基于LangChain的LLM应用程序开发-1

    ChatGPT 使用 拓展资料:吴恩达大咖 基于LangChain的LLM应用程序开发 基于LangChain的LLM应用程序开发 LangChain for LLM Application Development [https://www.deeplearning.ai/short-courses/langchain-for-llm-application-development/] LangChain for LLM Application Development https://www.deeplearning.ai/short-courses/langchain-for-llm-app

    2024年02月07日
    浏览(53)
  • 大型语言模型LLM的基础应用

    ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案

    2024年02月09日
    浏览(51)
  • LangChain与大型语言模型(LLMs)应用基础教程:角色定义

    如果您还没有看过我之前写的两篇博客,请先看一下,这样有助于对本文的理解: LangChain与大型语言模型(LLMs)应用基础教程:Prompt模板 LangChain与大型语言模型(LLMs)应用基础教程:信息抽取 LangChain是大型语言模型(LLM)的应用框架,LangChain可以直接与 OpenAI 的 text-davinci-003、gpt-3.5-t

    2024年02月01日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包