当前位置:首页 > 技术分析 > 正文内容

通过类比,十分钟掌握LangChain的快速入门

ruisui881个月前 (03-19)技术分析14

背景

快速入门的三部曲跟家里安装防盗门的步骤是类似的.

  1. 安装门
  2. 密码
  3. 测试一下

对应到解决方案领域的快速入门的三部曲是什么?

  1. 安装 : Install
  2. 环境设置: Env
  3. 写DEMO: Demo

那对应到LangChain的快速入门上是什么呢?

前两个步骤没差异, 关键是写DEMO上.

了解本文详细内容前, 建议先看这篇通过类比, 十分钟快速掌握LangChain的架构, 了解了基本的架构内容后, 回头再写DEMO, 会快很多.



今日的DEMO也主要是从Model I/O的 提示模板 以及额外的LangChain表达式入手.

DEMO包含以下内容:

  • o 使用LangChain进行设置
  • o 使用LangChain最基本和最常用的组件: 提示模板、模型和输出解析器
  • o 使用LangChain表达式语言(LECL),这是LangChain构建的协议,有助于组件链接

Step1: 安装: Install

要安装LangChain,请运行:

Pip/Conda 二选一即可

  • o Pip 方式
 pip install langchain   
  • o Conda
 conda install langchain -c conda-forge   

官方详细安装指南[2]

Step2: 环境设置

使用LangChain通常需要与一个或多个模型提供者、数据存储、API等进行集成。本示例将使用OpenAI的模型API。

首先,我们需要安装他们的Python包:

pip install openai  

访问API需要一个API密钥,你可以通过创建一个帐户并前往这里[3]来获取。当我们获得了一个密钥之后,我们需要通过运行以下命令将其设置为环境变量:

export OPENAI\_API\_KEY="..."  

如果你不想设置环境变量,你可以在初始化OpenAI LLM类时直接通过openai_api_key命名参数传递密钥:

from langchain.llms import OpenAI  
  
llm = OpenAI(openai\_api\_key="...")  

构建应用程序

LangChain提供了许多可以用来构建语言模型应用程序的模块。这些模块可以作为简单应用程序中的独立模块使用,也可以组合在一起用于更复杂的用例。

LangChain应用程序的核心构建模块是LLMChain。它结合了三个方面:

  • o LLM/ChatModel (大语言模型/聊天模型): 语言模型是核心推理引擎。要使用LangChain,您需要了解不同类型的语言模型以及如何使用它们。
  • o Prompt Templates: 提供语言模型的指令。这控制了语言模型的输出,因此了解如何构建提示和不同的提示策略至关重要。
  • o Output Parsers: 将LLM的原始响应转换为更易处理的格式,使得在下游使用输出变得容易。

在本入门中,我们将逐个介绍这三个组件,然后介绍将它们组合在一起的LLMChain。了解这些概念将使您能够很好地使用和定制LangChain应用程序。大多数LangChain应用程序允许您配置LLM和/或使用的提示,因此了解如何利用这一点将是一个很好的帮助。

LLM/ChatModel (大语言模型/聊天模型)

LangChain中有两种类型的语言模型,称为:

  • o LLM: 这是一个以字符串作为输入并返回字符串的语言模型
  • o ChatModels: 这是一个以消息列表作为输入并返回消息的语言模型

LLM的输入/输出简单易懂 - 都是字符串。但是ChatModels呢?这里的***输入是一个Message列表,输出是一个单独的Message***。

什么是Message? 基础的Message的接口的定义是BaseMessage. 他有两个必需的属性:

  • o content: 消息的内容。
  • o role: BaseMessage 的消息的角色。

LangChain提供了几个对象,用于方便地区分不同的角色:

  • o HumanMessage: 来自人类/用户的BaseMessage
  • o AIMessage: 来自AI/助手的BaseMessage
  • o SystemMessage: 来自系统的BaseMessage
  • o FunctionMessage/ToolMessage : 来自函数调用的BaseMessage

如果这些角色都不合适,还可以使用ChatMessage类手动指定角色。LangChain为两者提供了一个标准接口 .invoke(),所有LangChain表达式语言 (LCEL) 对象的通用同步调用方法:

  • o LLM.invoke: 接受一个字符串,返回一个字符串
  • o ChatModel.invoke: 接受一个BaseMessage 列表,返回一个BaseMessage

让我们看看如何使用这些不同类型的模型和不同类型的输入。首先,让我们导入LLM和ChatModel。

from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
llm = OpenAI()
chat_model = ChatOpenAI()
text = "What would be a good company name for a company that makes colorful socks?"
messages = [HumanMessage(content=text)]
llm.invoke(text)
# >> Feetful of Fun
chat_model.invoke(messages)
# >> AIMessage(content="Socks O'Color")

OpenAIChatOpenAI对象基本上只是配置对象。您可以使用诸如temperature等参数对其进行初始化,并将其传递给其他对象。

Prompt template(提示模板)

大多数LLM应用程序不会直接将用户输入传递到LLM中。通常,它们会将用户输入添加到一个更大的文本片段中,称为提示模板,该模板提供了有关特定任务的附加上下文。

在前面的示例中,我们传递给模型的文本包含了生成公司名称的指令。对于我们的应用程序,如果用户只需提供公司/产品的描述而无需担心给出模型指令,那将非常好。

PromptTemplates正是为此而设计的!它们将用户输入转化为完全格式化的提示的所有逻辑绑定在一起。这可以从非常简单的开始 - 例如,产生上述字符串的提示只需是

from langchain.prompts import PromptTemplate  
  
prompt = PromptTemplate.from\_template("What is a good name for a company that makes {product}?")  
prompt.format(product="colorful socks")  
What is a good name for a company that makes colorful socks?  

然而,使用这些而不是原始字符串格式化的优势有几个。您可以“部分”出变量 - 例如,您可以一次只格式化某些变量。您可以将它们组合在一起,轻松地将不同的模板组合成一个单独的提示。有关这些功能的说明,请参阅提示部分[4]以获取更多详细信息。

PromptTemplates还可以用于生成消息列表。在这种情况下,提示不仅包含有关内容的信息,还包含每个消息(其角色、其在列表中的位置等) 在这里,最常见的是ChatPromptTemplate是ChatMessageTemplate的列表。每个ChatMessageTemplate包含了格式化该ChatMessage的指令 - 其角色,以及其内容。让我们在下面看一下这个:

from langchain.prompts.chat import (  
 ChatPromptTemplate,  
 SystemMessagePromptTemplate,  
 HumanMessagePromptTemplate,  
)  
  
template = "You are a helpful assistant that translates {input\_language} to {output\_language}."  
system\_message\_prompt = SystemMessagePromptTemplate.from\_template(template)  
human\_template = "{text}"  
human\_message\_prompt = HumanMessagePromptTemplate.from\_template(human\_template)  
  
chat\_prompt = ChatPromptTemplate.from\_messages([system\_message\_prompt, human\_message\_prompt])  
  
chat\_prompt.format\_messages(input\_language="English", output\_language="French", text="I love programming.")  
[  
 SystemMessage(content="You are a helpful assistant that translates English to French.", additional\_kwargs={}),  
 HumanMessage(content="I love programming.")  
]  

除了ChatMessageTemplate之外,ChatPromptTemplates还可以包括其他内容 - 有关更多详细信息,请参阅提示部分[5]

Output parser(输出解析器)

OutputParsers将LLM的原始输出转换为可以在下游使用的格式。输出解析器有几种主要类型,包括:

  • o 将LLM的文本转换为结构化信息(例如JSON)
  • o 将ChatMessage转换为字符串
  • o 将除消息之外的其他信息(如OpenAI函数调用)转换为字符串。

有关此方面的详细信息,请参阅输出解析器部分[6]

在本入门指南中,我们将编写自己的输出解析器 - 将逗号分隔的列表转换为列表。

from langchain.schema import BaseOutputParser  
  
class CommaSeparatedListOutputParser(BaseOutputParser):  
 """Parse the output of an LLM call to a comma-separated list."""  
  
 def parse(self, text: str):  
 """Parse the output of an LLM call."""  
 return text.strip().split(", ")  
  
CommaSeparatedListOutputParser().parse("hi, bye")  
# >> ['hi', 'bye']  

用LECL进行链式调用(Composing with LCEL)

现在,我们可以将所有这些组合成一个链组件(LangChain的命名中, Chain的由来)。这个链组件将接收输入变量,将其传递给提示模板以创建提示,将提示传递给LLM,然后通过一个(可选的)输出解析器将输出传递出去。这是一种方便地将模块化逻辑捆绑在一起的方式。让我们看看它的作用!

from langchain.chat\_models import ChatOpenAI  
from langchain.prompts.chat import (  
 ChatPromptTemplate,  
 SystemMessagePromptTemplate,  
 HumanMessagePromptTemplate,  
)  
from langchain.chains import LLMChain  
from langchain.schema import BaseOutputParser  
  
class CommaSeparatedListOutputParser(BaseOutputParser):  
 """Parse the output of an LLM call to a comma-separated list."""  
  
  
 def parse(self, text: str):  
 """Parse the output of an LLM call."""  
 return text.strip().split(", ")  
  
template = """You are a helpful assistant who generates comma separated lists.  
A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.  
ONLY return a comma separated list, and nothing more."""  
system\_message\_prompt = SystemMessagePromptTemplate.from\_template(template)  
human\_template = "{text}"  
human\_message\_prompt = HumanMessagePromptTemplate.from\_template(human\_template)  
  
chat\_prompt = ChatPromptTemplate.from\_messages([system\_message\_prompt, human\_message\_prompt])  
chain = LLMChain(  
 llm=ChatOpenAI(),  
 prompt=chat\_prompt,  
 output\_parser=CommaSeparatedListOutputParser()  
)  
chain.run("colors")  
# >> ['red', 'blue', 'green', 'yellow', 'orange']  

参考资料

LangChain 中文文档 v0.0.291[7]
LangChain Introduction[8]

One More Thing

如果喜欢或者支持作者持续创作, 欢迎一键三连

引用链接

[2] 官方详细安装指南: https://python.langchain.com/docs/get_started/installation
[3] 这里:
https://platform.openai.com/account/api-keys
[4] 提示部分:
https://python.langchain.com/docs/modules/model_io/prompts
[5] 提示部分:
https://python.langchain.com/docs/modules/model_io/prompts
[6] 输出解析器部分:
https://python.langchain.com/docs/modules/model_io/output_parsers
[7] LangChain 中文文档 v0.0.291:
https://python.langchain.com.cn/docs/
[8] LangChain Introduction:
https://python.langchain.com/docs/get_started/introduction

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2899.html

分享给朋友:

“通过类比,十分钟掌握LangChain的快速入门” 的相关文章

管理费用预算管理办法

第一章 总则第一条 为实现公司各项经营指标,控制费用开支,规范管理费用预算,特制定本办法。第二条 本办法适用于公司内各部门的管理费用预算工作。第三条 职责划分(一)各职能部门,负责提出部门预算目标及确定依据,编制部门预算,并执行预算方案。(二)财务部门,负责汇总、审查、分析、平衡各部门预算,提出调整...

「干货」通俗易懂的Deno 入门教程

作者: semlinker转发链接:https://mp.weixin.qq.com/s/2eqRTsf_z7Bcs6dziXe73Q一、Deno 简介Deno 是一个 JavaScript/TypeScript 的运行时,默认使用安全环境执行代码,有着卓越的开发体验。Deno 含有以下功能亮点:默...

三勾点餐系统java+springboot+vue3,开源系统小程序点餐系统

项目简述前台实现:用户浏览菜单、菜品分类筛选、查看菜品详情、菜品多属性、菜品加料、添加购物车、购物车结算、个人订单查询、门店自提、外卖配送、菜品打包等。后台实现:菜品管理、订单管理、会员管理、系统管理、权限管理等。 项目介绍三勾点餐系统基于java+springboot+element-plus+u...

尤雨溪:细聊 Vue 的现在与未来

大家好,我是 Echa。创作不易,喜欢的老铁们转发加个关注,点个赞,速速收藏,谢谢!另外咱们一起回顾一下Vue 优秀开源项目:12个又简单又实用的开源项目及组件推荐13个又热门又实用的Vue开源宝典库推荐7个Vue 3的高颜值UI组件库分享15个基于Vue3.0全家桶的优秀开源项目推荐10个基于Vu...

微信正开发“应用号”取代手机应用

长江商报消息用户只需关注公众号,不必下载APP就可获得相同体验本报讯(记者 陈妮希)昨日,2016微信公开课PRO版在广州举行,腾讯公司高级执行副总裁、微信事业群总裁张小龙首次公开演讲,并透露微信正在开发“应用号”,将应用和订阅号相结合。现场,微信团队还首次发布了腾讯生物识别标准“TENCENTSO...

异步 vs 同步:程序员必备的核心知识,理解这两者差异,你就是高手

1、同步执行(Synchronous Execution)定义: 同步执行是指程序按顺序执行,每个操作必须等待前一个操作完成才能继续进行。也就是说,程序在执行过程中会“阻塞”当前的任务,直到该任务完成才会继续执行下一个任务。特点:顺序执行:任务是按顺序执行的,必须等一个任务完成才能执行下一个任务。阻...