Langchain 新手完全指南

原文:Langchain 新手完全指南

Langchain 可能是目前在 AI 领域中最热门的事物之一,仅次于向量数据库。

在这里插入图片描述

它是一个框架,用于在大型语言模型上开发应用程序,例如 GPT、LLama、Hugging Face 模型等。

它最初是一个 Python 包,但现在也有一个 TypeScript 版本,在功能上逐渐赶上,并且还有一个刚刚开始的 Ruby 版本。

为什么需要 Langchain?

但是,为什么首先需要它呢?我们是否可以简单地发送一个 API 请求或模型,然后就可以结束了?你是对的,对于简单的应用程序这样做是可行的。

但是,一旦您开始增加复杂性,比如将语言模型与您自己的数据(如 Google Analytics、Stripe、SQL、PDF、CSV 等)连接起来,或者使语言模型执行一些操作,比如发送电子邮件、搜索网络或在终端中运行代码,事情就会变得混乱和重复。

在这里插入图片描述

LangChain 通过组件提供了解决这个问题的方法。我们可以使用文档加载器从 PDF、Stripe 等来源加载数据,然后在存储在向量数据库中之前,可以选择使用文本分割器将其分块。在运行时,可以将数据注入到提示模板中,然后作为输入发送给模型。我们还可以使用工具执行一些操作,例如使用输出内容发送电子邮件。

在这里插入图片描述

实际上,这些 抽象 意味着您可以轻松地切换到另一个语言模型,以节约成本或享受其他功能,测试另一个向量数据库的功能,或者摄取另一个数据源,只需几行代码即可实现。链(chains)是实现这一魔法的方式,我们将组件链接在一起,以完成特定任务。而代理(agents)则更加抽象,首先考虑使用语言模型来思考它们需要做什么,然后使用工具等方式来实现。

如果您对将语言模型与自己的数据和外部世界连接的强大之处感兴趣,可以查看与 LangChain 发布时间相近的研究论文,例如 Self-Ask、With Search 和 ReAct。

新手应该了解哪些模块?

现在让我们来看看幕后的真实情况。目前有七个模块在 LangChain 中提供,新手应该了解这些模块,包括模型(models)、提示(prompts)、索引(indexes)、内存(memory)、链(chains)和代理(agents)。

在这里插入图片描述

核心模块的概述

模型在高层次上有两种不同类型的模型:语言模型(language models)和文本嵌入模型(text embedding models)。嵌入模型将文本转换为数字数组,然后我们可以将文本视为向量空间。
在这里插入图片描述

在这个图像中,我们可以看到在一个二维空间中,“man”是“king”,“woman”是“queen”,它们代表不同的事物,但我们可以看到一种模式。这使得语义搜索成为可能,我们可以在向量空间中寻找最相似的文本片段,以满足给定的论点。

例如,OpenAI 的文本嵌入模型可以精确地嵌入大段文本,具体而言,8100 个标记,根据它们的词对标记比例 0.75,大约可以处理 6143 个单词。它输出 1536 维的向量。

在这里插入图片描述

我们可以使用 LangChain 与多个嵌入提供者进行接口交互,例如 OpenAI 和 Cohere 的 API,但我们也可以通过使用 Hugging Faces 的开源嵌入在本地运行,以达到 免费和数据隐私 的目的。

在这里插入图片描述

现在,您可以使用仅四行代码在自己的计算机上创建自己的嵌入。但是,维度数量可能会有所不同,嵌入的质量可能会较低,这可能会导致检索不太准确。

LLMs 和 Chat Models

接下来是语言模型,它有两种不同的子类型:LLMs 和 Chat Models。LLMs 封装了接受文本输入并返回文本输出的 API,而 Chat Models 封装了接受聊天消息输入并返回聊天消息输出的模型。尽管它们之间存在细微差别,但使用它们的接口是相同的。我们可以导入这两个类,实例化它们,然后在这两个类上使用 predict 函数并观察它们之间的区别。但是,您可能不会直接将文本传递给模型,而是使用提示(prompts)。

在这里插入图片描述

提示(prompts)

提示(prompts)是指模型的输入。我们通常希望具有比硬编码的字符串更灵活的方式,LangChain 提供了 Prompt Template 类来构建使用多个值的提示。提示的重要概念包括提示模板、输出解析器、示例选择器和聊天提示模板。

在这里插入图片描述

提示模板(PromptTemplate)

提示模板是一个示例,首先需要创建一个 Prompt Template 对象。有两种方法可以做到这一点,一种是导入 Prompt Template,然后使用构造函数指定一个包含输入变量的数组,并将它们放在花括号中的模板字符串中。如果您感到麻烦,还可以使用模板的辅助方法,以便不必显式指定输入变量。

无论哪种情况,您都可以通过告诉它要替换占位符的值来格式化提示。

在内部,默认情况下它使用 F 字符串来格式化提示,但您也可以使用 Ginger 2。

但是,为什么不直接使用 F 字符串呢?提示提高了可读性,与其余生态系统很好地配合,并支持常见用例,如 Few Shot Learning 或输出解析。

在这里插入图片描述

让我们看看如何做到这一点?首先,创建一个包含几个示例的列表。

from langchain import PromptTemplate, FewShotPromptTemplateexamples = [{"word": "happy", "antonym": "sad"},{"word": "tall", "antonym": "short"},
]

然后,我们指定用于格式化提供的每个示例的模板。

example_formatter_template = """Word: {word}
Antonym: {antonym}
"""example_prompt = PromptTemplate(input_variables=["word", "antonym"],template=example_formatter_template,
)
"""

最后,我们创建 Few Shot Prompt Template 对象,传入示例、示例格式化器、前缀、命令和后缀,这些都旨在指导 LLM 的输出。

此外,我们还可以提供输入变量 examplesexample_prompt 和分隔符 example_separator="\n",用于将示例与前缀 prefix 和后缀 suffix 分开。现在,我们可以生成一个提示,它看起来像这样。

few_shot_prompt = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,prefix="Give the antonym of every input\n",suffix="Word: {input}\nAntonym: ",input_variables=["input"],example_separator="\n",
)print(few_shot_prompt.format(input="big"))

这是一种非常有用的范例,可以控制 LLM 的输出并引导其响应。

输出解析器(output_parsers)

类似地,我们可能想要使用输出解析器,它会自动将语言模型的输出解析为对象。这需要更复杂一些,但非常有用,可以将 LLM 的随机输出结构化。

在这里插入图片描述

假设我们想要使用 OpenAI 创建笑话对象,我们可以定义我们的 Joke 类以更具体地说明笑话的设置和结尾。我们添加描述以帮助语言模型理解它们的含义,然后我们可以设置一个解析器,告诉它使用我们的 Joke 类进行解析。

我们使用最强大且推荐的 Pydantic 输出解析器,然后创建我们的提示模板。

from langchain.prompts import PromptTemplate
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Fieldclass Joke(BaseModel):setup: str = Field(description="question to set up a joke")punchline: str = Field(description="answer to resolve the joke")parser = PydanticOutputParser(pydantic_object=Joke)

让我们传递模板字符串和输入变量,并使用部分变量字段将解析指令注入到提示模板中。然后,我们可以要求 LLM 给我们讲一个笑话。

现在,我们已经准备好发送它给 OpenAI 的操作是这样的:首先从我们的.env 文件中加载 OpenAI 的 API 密钥,然后实例化模型,调用其调用方法,并使用我们实例化的解析器解析模型的输出。

from langchain.llms import OpenAI
from dotenv import load_dotenvload_dotenv()
model = OpenAI(model_name="text-davinci-003", temperature=0.0)

然后,我们就拥有了我们定义了设置和结尾的笑话对象。生成的提示非常复杂,建议查看 GitHub 以了解更多信息。

prompt = PromptTemplate(template="Answer the user query.\n{format_instructions}\n{query}\n",input_variables=["query"],partial_variables={"format_instructions": parser.get_format_instructions()},
)joke_query = "Tell me a joke."
formatted_prompt = prompt.format_prompt(query=joke_query)print(formatted_prompt.to_string())

打印的结果是:

Answer the user query.
The output should be formatted as a JSON instance 
that conforms to the JSON schema below.As an example, for the schema
{"properties": {"foo": {"title": "Foo","description": "a list of strings","type": "array","items": {"type": "string"}}},"required": ["foo"]
} 
the object {"foo": ["bar", "baz"]} is a well-formatted 
instance of the schema. 
The object {"properties": {"foo": ["bar", "baz"]}} is 
not well-formatted.Here is the output schema:

{
“properties”: {
“setup”: {
“title”: “Setup”,
“description”: “question to set up a joke”,
“type”: “string”
},
“punchline”: {
“title”: “Punchline”,
“description”: “answer to resolve the joke”,
“type”: “string”
}
},
“required”: [
“setup”,
“punchline”
]
}

Tell me a joke.
"""

我们给 model 传入 prompt 模板,并且用输出解析器解析结果:

output = model(formatted_prompt.to_string())
parsed_joke = parser.parse(output)
print(parsed_joke)

我们之前讲过 Few Shot Prompt 学习,我们传递一些示例来显示模型对某种类型的查询的预期答案。我们可能有许多这样的示例,我们不可能全部适应它们。而且,这可能很快就会变得非常昂贵。这就是示例选择器发挥作用的地方。

示例选择器(example_selector)

为了保持提示的成本相对恒定,我们将使用基于长度的示例选择器 LengthBasedExampleSelector。就像以前一样,我们指定一个示例提示。这定义了每个示例将如何格式化。我们策展一个选择器,传入示例,然后是最大长度。

默认情况下,长度指的是格式化器示例部分的提示使用的单词和新行的数量 max_length

from langchain.prompts import PromptTemplate
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelectorexamples = [{"word": "happy", "antonym": "sad"},{"word": "tall", "antonym": "short"},{"word": "energetic", "antonym": "lethargic"},{"word": "sunny", "antonym": "gloomy"},{"word": "windy", "antonym": "calm"},
]example_prompt = PromptTemplate(input_variables=["word", "antonym"],template="Word: {word}\nAntonym: {antonym}",
)example_selector = LengthBasedExampleSelector(examples=examples, example_prompt=example_prompt, max_length=25,
)dynamic_prompt = FewShotPromptTemplate(example_selector=example_selector,example_prompt=example_prompt,prefix="Give the antonym of every input",suffix="Word: {adjective}\nAntonym:", input_variables=["adjective"],
)print(dynamic_prompt.format(adjective="big"))

那么,与聊天模型互动如何呢?这就引出了我们之前提到的聊天提示模板。聊天模型以聊天消息列表为输入。这个列表被称为提示。它们的不同之处在于,每条消息都被预先附加了一个角色,要么是 AI,要么是人类,要么是系统。模型应紧密遵循系统消息的指示。一开始只有一个系统消息,有时它可能听起来相当催眠。“你是一个善良的客服代理人,对客户的问题做出逐渐的回应”……类似于这样,告诉聊天机器人如何行事。AI 消息是来自模型的消息,人类消息是我们输入的内容。角色为 LLM 提供了对进行中的对话的更好的上下文。

模型和提示都很酷,标准化了。

索引(indexes)

但我们如何使用我们自己的数据呢?这就是索引模块派上用场的地方。

数据就是新的石油,你肯定可以在任何地方挖掘,并找到大量的。

Langchain 提供了钻机,通过提供文档加载器,文档是他们说的文本的花哨方式。有很多支持的格式和服务,比如 CSV、电子邮件、SQL、Discord、AWS S3、PDF,等等。它只需要三行代码就可以导入你的。这就是它有多简单!

在这里插入图片描述

首先导入加载器,然后指定文件路径,然后调用 load 方法。这将在内存中以文本形式加载 PDF,作为一个数组,其中每个索引代表一个页面。

文本分割器 (text_splitter)

在这里插入图片描述

这很好,但是当我们想构建一个提示并包含这些页面中的文本时,它们可能太大,无法在我们之前谈过的输入令牌大小内适应,这就是为什么我们想使用文本分割器将它们切成块。

读完文本后,我们可以实例化一个递归字符文本分割器 RecursiveCharacterTextSplitter,并指定一个块大小和一个块重叠。我们调用 create_documents 方法,并将我们的文本作为参数。

然后我们得到了一个文档的数组。

from langchain.text_splitter import RecursiveCharacterTextSplitterwith open("example_data/state_of_the_union.txt") as f:state_of_the_union = f.read()text_splitter = RecursiveCharacterTextSplitter(chunk_size=100,chunk_overlap=20,
)
texts = text_splitter.create_documents([state_of_the_union])
print(f"\nFirst chunk: {texts[0]}\n")
print(f"Second chunk: {texts[1]}\n")

现在我们有了文本块,我们会想要嵌入它们并存储它们,以便最终使用语义搜索检索它们,这就是为什么我们有向量存储。

与向量数据库的集成

索引模块的这一部分提供了多个与向量数据库的集成,如 pine cone、redis、Super Bass、chroma DB 等等。

在这里插入图片描述

向量空间中进行搜索

一旦你准备好了你的文档,你就会想选择你的嵌入提供商,并使用向量数据库助手方法存储文档。

现在我们可以写一个问题,在向量空间中进行搜索,找出最相似的结果 similarity_search,返回它们的文本。

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chromawith open("example_data/state_of_the_union.txt") as f:state_of_the_union = f.read()text_splitter = CharacterTextSplitter(chunk_size=1000,chunk_overlap=0,
)
texts = text_splitter.create_documents([state_of_the_union])embeddings = OpenAIEmbeddings()
docsearch = Chroma.from_texts(texts, embeddings)query = "What did the president say about Ketanji Brown Jackson"
docs = docsearch.similarity_search(query)print(docs[0].page_content)

在这里插入图片描述
在这里插入图片描述

从构建提示到索引文档,再到在向量空间中进行搜索,都可以通过导入一个模块并运行几行代码来完成。

希望你喜欢这个旅程,让我们开始我们的聊天机器人之旅吧!

如果你有任何问题或想要查看更详细的实例,你可以在加入社群提问。我期待着你的反馈和你在社区中分享的任何创新。

🔗 Links

Source code: https://github.com/edrickdch/langchain-101
LangChain: https://python.langchain.com.cn
Self-Ask Paper: https://ofir.io/self-ask.pdf
ReAct Paper: https://arxiv.org/abs/2210.03629

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/21431.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据人一直做这四项工作,即使不被BI、AI取代,也躲不过35危机!

先说我的观点:数据分析职业不会被BI软件替代。顺便说一句,数据分析职业也不会被chatgpt取代。 大家首先要搞清楚:取代人的从来不是工具,而是会使用工具的人。 数据分析师工作内容 首先,先让我们来全面拆解一下国内数…

〖编程初学者的自我修养 - 优质简历篇①〗- 知己知彼,面试官是如何分析一份简历的

历时18个月,采访 850 得到的需求。 不管你是在校大学生、研究生、还是在职的小伙伴,该专栏有你想要的职业规划、简历、面试的答案。说明:该文属于 编程初学者的自我修养 专栏,购买任意白宝书体系化专栏可加入易编程社区&#xff0…

聊一聊,哪些职业受ChatGPT影响最大?

新研究发现,审计师、翻译及作家目前的工作内容中,AI工具可以更快地处理至少一半的任务。 一项新研究显示,面对生成式人工智能(AI)拥有的能力,会计师是职业最容易受到影响的 其中一类专业人士。研究人员发现,借助这项技…

ChatGPT 速通手册——摘要生成和重命名

摘要生成和重命名 当我们开始使用ChatGPT了以后,就会发现一个非常有意思的事情,我们发起的每一个对话,ChatGPT都会基于对话内容生成一个摘要展现在对话列表中,如图所示: 我们的问题是“世界上最大的桥梁是哪座大桥&am…

培训班出来的程序员现在怎么样了

文章目录 0、前言1、刚出茅庐2、南下广州3、踏上北漂4、紧张的培训4、两进两出5、站稳脚跟6、奋斗至今7、一些收获 0、前言 大多数刚出校门的同学,都有过迷茫。因为少数家里有矿的除外。都是必然要经历的过程。迷茫之后,当然都会作出选择,因…

在培训班里学IT技术,真的有用吗?

关于IT培训,JiaYu有话说 0、前言IT行业的未来发展趋势IT技术学习方法 1、学习IT上培训班的益处2、学习IT上培训班的风险3、培训班对个人的要求4、JiaYu有话说嵌入式是否值得学?去培训班学嵌入式有用吗?推荐 0、前言 IT行业的未来发展趋势 大…

42天最全月子餐

阅读目录 第一周:排恶露第二周:排水肿第三周:催乳第四周:补气血第五周:通乳注意事项‼️月子餐注意事项: 第一周:排恶露饮食时间表第一天7:30 早餐10:00 加餐12:00 午餐15:30 加餐17:00 晚餐21:…

【报告分享】产后康复行业发展报告2021-麻麻康研究院(附下载)

摘要:目前在产后康复行业服务主体中,医疗机构包含医院、妇幼保健院、社区卫生服务中心、医师诊所,产康机构包含产后恢复中心、月子中心、运动健身中心、推拿按摩中心、医美中心、美容中心等多种门店业态,家庭场景包含家庭设备厂商及上门服务从…

“她经济”崛起,茉莉智慧如何以科技赋能月子中心迭代升级?

近年来,利好生育政策频出,女性消费能力不断提升,以月子中心为核心的产后护理赛道发展势头良好。据iiMedia Research数据,2022年中国月子中心市场规模突破223.0亿元。iiMedia Research市场调查显示,93.5%的受访者认为产…

基于android校园新闻APP开发的设计与实现

目 录 摘 要 I Abstract II 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3研究现状 1 1.4设计思路及内容 2 第二章 系统开发环境及相关技术 3 2.1开发环境 3 2.2 Java SDK 3 2.3 Eclipse 3 2.4 ADT 3 2.5 Android SDK 4 2.6 JSP技术 7 2.7 JSON 8 2.8JDBC技术 8 第三章 系统…

OpenAI/ChatGPT 专栏,来了!

大家好!我是韩老师。 “职场圈”知识星球已经运营 54 天了,很高兴已经有 140 多位的童鞋加入了本知识星球。 在星球中,我除了分享了不少与职场相关的内容,也与时俱进,产出了许多与 ChatGPT 相关的内容。 GPT, ChatGPT,…

手把手教你使用 Python 调用 ChatGPT-3.5-API

前些天 OpenAI 开放了两个新模型的api接口,专门为聊天而生的 gpt-3.5-turbo 和 gpt-3.5-turbo-0301。 ChatGPT is powered by gpt-3.5-turbo, OpenAI’s most advanced language model. 从上面这句话,我们可以知道现在 chat.openai.com 官网就是由 gpt-…

本地运行 LLAMA GPT-3.5-TURBO开源项目

git: nomic-ai/gpt4all: gpt4all: an ecosystem of open-source chatbots trained on a massive collections of clean assistant data including code, stories and dialogue (github.com) 下载好源码后,的目录结构: 视频中说的 chat 目录…

Springboot集成OpenAi chatgpt3.5官方开源项目opanAI-Java

前言 本文主要介绍Springboot集成openai-java完成openai官方接口的调用,官方有多种语言的demo示例 OPENAI开源openai-java项目地址:https://github.com/TheoKanning/openai-java 准备工作 必要的前提,要使用chatgpt必须要魔法 魔法opena…

ChatGPT 学习 ES lucene 底层写入原理,源码

一直有个疑问“学习最新版lucene 数据写入相关的源码,应该看哪些源码,以什么顺序看(先看什么,后看什么)?” 对于Lucene的数据写入过程,可以分为以下几个阶段 在学习Lucene的数据写入相关的源码…

ChatGPT 深度解读人工智能大模型在产业中的趋势

最早人工智能的模型是从 2012 年(AlexNet)问世,模型的深度和广度一直在逐级扩升,龙蜥社区理事单位浪潮信息于 2021 年 9 月也发布了大规模预训练模型——源 1.0。日前,浪潮信息 AI 算法研究员李峰带大家了解大模型发展…

数据看板--日报、周报、月报

一、数据预览 二、效果图预览 三、新增字段 1、周数 WEEKNUM(B2,2)2、月份 MONTH(B2)备注:B2为日期列 四、看板制作过程 1、控件 控件范围从1到364,用于控制每天的日期 2、通过控件确定当前日期 当天日期基准数字表单控件当前值 星期几TEXT(当天…

研报精选230209

目录 【行业230209财通证券】中国版IFRS17准则深度解析:25号保险合同准则实施在即,构建保险财务分析新逻辑 【行业230209英大证券】电力能源行业周报:比亚迪1月销量依旧亮眼,充换电设施有望纳入市政设施范畴 【行业230209华西证券…

职场上除了「躺」与「卷」,是否有第三种选择存在?

大家好,我是校长。 昨天在知乎上看到一个问题:职场上除了「躺」与「卷」,是否有第三种选择存在? 当我看到这个问题的时候,我想到了两本书,以及我看到的一些最新的观点,我试图结合我看到的书以及…

改名了!

阅读本文大概需要 1.27 分钟。 先说下,我们的 AI 星球已经从「ChatGPT&AI赋能商业」改名为「AIGC 赋能商业」。 改名这件事,从一开始创建的时候就想改了。原先名字里带有 GPT 相关字眼的,我得承认,当时我们这名字起的时候&…