快速入门的三部曲跟家里安装防盗门的步骤是类似的.
对应到解决方案领域的快速入门的三部曲是什么?
那对应到LangChain的快速入门上是什么呢?
前两个步骤没差异, 关键是写DEMO上.
了解本文详细内容前, 建议先看这篇, 了解了基本的架构内容后, 回头再写DEMO, 会快很多.
今日的DEMO也主要是从Model I/O的 提示模板 以及额外的LangChain表达式入手.
DEMO包含以下内容:
要安装LangChain,请运行:
Pip/Conda 二选一即可
pipinstalllangchain
condainstalllangchain-cconda-forge
官方详细安装指南[2]
Step2: 环境设置使用LangChain通常需要与一个或多个模型提供者、数据存储、API等进行集成。本示例将使用OpenAI的模型API。
首先,我们需要安装他们的Python包:
pipinstallopenai
访问API需要一个API密钥,你可以通过创建一个帐户并前往这里[3]来获取。当我们获得了一个密钥之后,我们需要通过运行以下命令将其设置为环境变量:
exportOPENAI\_API\_KEY="..."
如果你不想设置环境变量,你可以在初始化OpenAI LLM类时直接通过openai_api_key命名参数传递密钥:
fromlangchain.llmsimportOpenAI
llm=OpenAI(openai\_api\_key="...")
构建应用程序
LangChain提供了许多可以用来构建语言模型应用程序的模块。这些模块可以作为简单应用程序中的独立模块使用,也可以组合在一起用于更复杂的用例。
LangChain应用程序的核心构建模块是LLMChain。它结合了三个方面:
在本入门中,我们将逐个介绍这三个组件,然后介绍将它们组合在一起的LLMChain。了解这些概念将使您能够很好地使用和定制LangChain应用程序。大多数LangChain应用程序允许您配置LLM和/或使用的提示,因此了解如何利用这一点将是一个很好的帮助。
LLM/ChatModel (大语言模型/聊天模型)LangChain中有两种类型的语言模型,称为:
LLM的输入/输出简单易懂 - 都是字符串。但是ChatModels呢?这里的***输入是一个Message列表,输出是一个单独的Message***。
什么是Message? 基础的Message的接口的定义是BaseMessage. 他有两个必需的属性:
LangChain提供了几个对象,用于方便地区分不同的角色:
如果这些角色都不合适,还可以使用ChatMessage类手动指定角色。LangChain为两者提供了一个标准接口 .invoke(),所有LangChain表达式语言 (LCEL) 对象的通用同步调用方法:
让我们看看如何使用这些不同类型的模型和不同类型的输入。首先,让我们导入LLM和ChatModel。
fromlangchain.llmsimportOpenAI
fromlangchain.chat_modelsimportChatOpenAI
fromlangchain.schemaimportHumanMessage
llm=OpenAI()
chat_model=ChatOpenAI()
text="Whatwouldbeagoodcompanynameforacompanythatmakescolorfulsocks?"
messages=[HumanMessage(content=text)]
llm.invoke(text)
#>>FeetfulofFun
chat_model.invoke(messages)
#>>AIMessage(content="SocksO'Color")
OpenAI和ChatOpenAI对象基本上只是配置对象。您可以使用诸如temperature等参数对其进行初始化,并将其传递给其他对象。
Prompt template(提示模板)大多数LLM应用程序不会直接将用户输入传递到LLM中。通常,它们会将用户输入添加到一个更大的文本片段中,称为提示模板,该模板提供了有关特定任务的附加上下文。
在前面的示例中,我们传递给模型的文本包含了生成公司名称的指令。对于我们的应用程序,如果用户只需提供公司/产品的描述而无需担心给出模型指令,那将非常好。
PromptTemplates正是为此而设计的!它们将用户输入转化为完全格式化的提示的所有逻辑绑定在一起。这可以从非常简单的开始 - 例如,产生上述字符串的提示只需是
fromlangchain.promptsimportPromptTemplate
prompt=PromptTemplate.from\_template("Whatisagoodnameforacompanythatmakes{product}?")
prompt.format(product="colorfulsocks")
Whatisagoodnameforacompanythatmakescolorfulsocks?
然而,使用这些而不是原始字符串格式化的优势有几个。您可以“部分”出变量 - 例如,您可以一次只格式化某些变量。您可以将它们组合在一起,轻松地将不同的模板组合成一个单独的提示。有关这些功能的说明,请参阅提示部分[4]以获取更多详细信息。
PromptTemplates还可以用于生成消息列表。在这种情况下,提示不仅包含有关内容的信息,还包含每个消息(其角色、其在列表中的位置等) 在这里,最常见的是ChatPromptTemplate是ChatMessageTemplate的列表。每个ChatMessageTemplate包含了格式化该ChatMessage的指令 - 其角色,以及其内容。让我们在下面看一下这个:
fromlangchain.prompts.chatimport(
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
template="Youareahelpfulassistantthattranslates{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="Iloveprogramming.")
[
SystemMessage(content="YouareahelpfulassistantthattranslatesEnglishtoFrench.",additional\_kwargs={}),
HumanMessage(content="Iloveprogramming.")
]
除了ChatMessageTemplate之外,ChatPromptTemplates还可以包括其他内容 - 有关更多详细信息,请参阅提示部分[5]。
Output parser(输出解析器)OutputParsers将LLM的原始输出转换为可以在下游使用的格式。输出解析器有几种主要类型,包括:
有关此方面的详细信息,请参阅输出解析器部分[6]
在本入门指南中,我们将编写自己的输出解析器 - 将逗号分隔的列表转换为列表。
fromlangchain.schemaimportBaseOutputParser
classCommaSeparatedListOutputParser(BaseOutputParser):
"""ParsetheoutputofanLLMcalltoacomma-separatedlist."""
defparse(self,text:str):
"""ParsetheoutputofanLLMcall."""
returntext.strip().split(",")
CommaSeparatedListOutputParser().parse("hi,bye")
#>>['hi','bye']
用LECL进行链式调用(Composing with LCEL)
现在,我们可以将所有这些组合成一个链组件(LangChain的命名中, Chain的由来)。这个链组件将接收输入变量,将其传递给提示模板以创建提示,将提示传递给LLM,然后通过一个(可选的)输出解析器将输出传递出去。这是一种方便地将模块化逻辑捆绑在一起的方式。让我们看看它的作用!
fromlangchain.chat\_modelsimportChatOpenAI
fromlangchain.prompts.chatimport(
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
fromlangchain.chainsimportLLMChain
fromlangchain.schemaimportBaseOutputParser
classCommaSeparatedListOutputParser(BaseOutputParser):
"""ParsetheoutputofanLLMcalltoacomma-separatedlist."""
defparse(self,text:str):
"""ParsetheoutputofanLLMcall."""
returntext.strip().split(",")
template="""Youareahelpfulassistantwhogeneratescommaseparatedlists.
Auserwillpassinacategory,andyoushouldgenerate5objectsinthatcategoryinacommaseparatedlist.
ONLYreturnacommaseparatedlist,andnothingmore."""
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]
如果喜欢或者支持作者持续创作, 欢迎一键三连
引用链接[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
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved