LangChain教程 – 如何构建自定义知识聊天机器人

发布时间 2023-06-03 09:42:40作者: 晓风晓浪

您可能已经了解到过去几个月发布的大量 AI 应用程序。您甚至可能已经开始使用其中的一些。

ChatPDF和CustomGPT AI等 AI 工具已经对人们变得非常有用——这是有充分理由的。您需要滚动浏览 50 页文档才能找到简单答案的日子已经一去不复返了。相反,您可以依靠 AI 来完成繁重的工作。

但是这些开发人员究竟是如何创建和使用这些工具的呢?好吧,他们中的许多人都在使用一个名为 LangChain 的开源框架。

在本文中,我将向您介绍 LangChain,并向您展示如何将其与 OpenAI 的 API 结合使用来创建这些改变游戏规则的工具。希望我能激发你们中的一员提出自己的想法。让我们开始吧!

(人工智能教程:https://www.java567.com/search.html?sWord=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&v=2306035

浪链是什么?

截图-2023-05-29-at-5.40.38-PM

LangChain是一个开源框架,允许 AI 开发人员将 GPT-4 等大型语言模型 (LLM) 与外部数据相结合。它以 Python 或 JavaScript (TypeScript) 包的形式提供。

如您所知,GPT 模型一直在 2021 年之前接受数据训练,这可能是一个重大限制。虽然这些模型的常识很丰富,但能够将它们连接到自定义数据和计算会打开许多大门。这正是 LangChain 所做的。

从本质上讲,它允许您的 LLM 在得出答案时参考整个数据库。因此,您现在可以让 GPT 模型以报告、文档和网站信息的形式访问最新数据。

最近,LangChain 的人气大幅飙升,尤其是在 3 月份推出 GPT-4 之后。这要归功于它的多功能性以及与强大的 LLM 搭配使用时打开的许多可能性。

LangChain 如何运作?

虽然您可能认为 LangChain 听起来很复杂,但实际上它很容易上手。

简而言之,LangChain 只是将大量数据组合在一起,LLM 可以使用尽可能少的计算能力轻松引用这些数据。它的工作原理是获取大量数据源,例如 50 页的 PDF,并将其分解为“块”,然后嵌入到 Vector Store 中。

------朗链创建向量存储的简单示意图

现在我们已经有了大型文档的矢量化表示,我们可以将其与 LLM 结合使用,以仅检索在创建提示-完成对时需要引用的信息。

当我们在新的聊天机器人中插入提示时,LangChain 将查询 Vector Store 以获取相关信息。将其视为您文档的迷你 Google。检索到相关信息后,我们会将其与提示一起提供给 LLM 以生成我们的答案。

字节大小缩略图--1200---800-px---10-LangChain 如何与 OpenAI 的 LLM 合作

LangChain 还允许您创建可以执行操作的应用程序——例如上网冲浪、发送电子邮件和完成其他与 API 相关的任务。查看AgentGPT,这是一个很好的例子。

这有很多可能的用例——这里只是我想到的几个:

  • 个人 AI 邮件助理

  • 人工智能学习伙伴

  • 人工智能数据分析

  • 定制公司客户服务聊天机器人

  • 社交媒体内容创作助理

而这样的例子不胜枚举。我将在以后的文章中介绍正确的构建教程,敬请期待。

如何开始使用朗链

LangChain 应用程序由 5 个主要组件组成:

  1. 模型(LLM 包装器)

  2. 提示

  3. 链条

  4. 嵌入和向量存储

  5. 代理商

我将为您提供每一个的概述,以便您可以更深入地了解 LangChain 的工作原理。展望未来,您应该能够应用这些概念来开始制作您自己的用例并创建您自己的应用程序。

我将使用来自 Rabbitmetrics的简短代码片段来解释所有内容。他提供了有关此主题的精彩教程。这些片段应该可以让您完成所有设置并准备好使用 LangChain。

首先,让我们设置环境。您可以 pip 安装 3 个您需要的库:

 pip install -r requirements.txt
 python-dotenv==1.0.0
 langchain==0.0.137
 pinecone-client==2.2.1

Pinecone是我们将与 LangChain 结合使用的 Vector Store。有了这些,确保将 OpenAI、Pinecone Environment 和 Pinecone API 的 API 密钥存储到环境文件中。您将能够在他们各自的网站上找到此信息。然后我们只需使用以下内容加载该环境文件:

 # Load environment variables
 
 from dotenv import load_dotenv,find_dotenv
 load_dotenv(find_dotenv())

现在,我们准备开始了!

模型(LLM 包装器)

为了与我们的 LLM 交互,我们将为 OpenAI 的 GPT 模型实例化一个包装器。在这种情况下,我们将使用 OpenAI 的 GPT-3.5-turbo,因为它最具成本效益。但是,如果您可以访问,请随意使用更强大的 GPT4。

要导入这些,我们可以使用以下代码:

 # import schema for chat messages and ChatOpenAI in order to query chatmodels GPT-3.5-turbo or GPT-4
 
 from langchain.schema import (
     AIMessage,
     HumanMessage,
     SystemMessage
 )
 from langchain.chat_models import ChatOpenAI
     
 
 chat = ChatOpenAI(model_name="gpt-3.5-turbo",temperature=0.3)
 messages = [
     SystemMessage(content="You are an expert data scientist"),
     HumanMessage(content="Write a Python script that trains a neural network on simulated data ")
 ]
 response=chat(messages)
 
 print(response.content,end='\n')
     

本质上,SystemMessage 为 GPT-3.5-turbo 模块提供上下文,它将为每个提示完成对引用该模块。HumanMessage 指的是您将在 ChatGPT 界面中键入的内容——您的提示。

但是使用自定义知识聊天机器人,我们通常会抽象出提示中重复的部分。例如,如果我正在创建一个推文生成器应用程序,我不想一直输入“给我写一条关于...的推文”。其实AI写作工具就是这么简单开发出来的!

因此,让我们看看如何使用提示模板将其抽象出来。

提示

LangChain 提供 PromptTemplates,允许您根据用户输入动态更改提示,类似于正则表达式的使用方式。

 # Import prompt and define PromptTemplate
 
 from langchain import PromptTemplate
 
 template = """
 You are an expert data scientist with an expertise in building deep learning models.
 Explain the concept of {concept} in a couple of lines
 """
 
 prompt = PromptTemplate(
     input_variables=["concept"],
     template=template,
 )
     
 
 # Run LLM with PromptTemplate
 
 llm(prompt.format(concept="autoencoder"))
 llm(prompt.format(concept="regularization"))

您可以以不同的方式改变这些以适应您的用例。如果您熟悉使用 ChatGPT,这对您来说应该很舒服。

链条

Chains 允许您使用简单的 PromptTemplates 并在它们之上构建功能。本质上,链就像复合函数,允许您将 PromptTemplates 和 LLM 集成在一起。

使用前面的包装器和 PromptTemplates,我们可以使用采用 PromptTemplate 并将其与 LLM 组合的单个链运行相同的提示:

 # Import LLMChain and define chain with language model and prompt as arguments.
 
 from langchain.chains import LLMChain
 chain = LLMChain(llm=llm, prompt=prompt)
 
 # Run the chain only specifying the input variable.
 print(chain.run("autoencoder"))
     

最重要的是,顾名思义,我们可以将它们链接在一起以创建更大的组合。

例如,我可以从一个链中获取结果并将其传递到另一个链中。在这个片段中,Rabbitmetrics 从第一个链中获取完成并将其传递到第二个链中以向 5 岁的孩子解释它。

然后,您可以将这些链组合成一个更大的链并运行它。

 # Define a second prompt 
 
 second_prompt = PromptTemplate(
     input_variables=["ml_concept"],
     template="Turn the concept description of {ml_concept} and explain it to me like I'm five in 500 words",
 )
 chain_two = LLMChain(llm=llm, prompt=second_prompt)
 
 # Define a sequential chain using the two chains above: the second chain takes the output of the first chain as input
 
 from langchain.chains import SimpleSequentialChain
 overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)
 
 # Run the chain specifying only the input variable for the first chain.
 explanation = overall_chain.run("autoencoder")
 print(explanation)

使用链,您可以创建大量功能,这就是 LangChain 如此多才多艺的原因。但它真正出色的地方在于将它与前面讨论的 Vector Store 结合使用。让我们介绍一下那个组件。

嵌入和向量存储

这是我们合并 LangChain 的自定义数据方面的地方。如前所述,嵌入和向量存储背后的想法是将大数据分成块并存储那些在相关时要查询的数据。

LangChain 有一个文本拆分器功能可以做到这一点:

 # Import utility for splitting up texts and split up the explanation given above into document chunks
 
 from langchain.text_splitter import RecursiveCharacterTextSplitter
 
 text_splitter = RecursiveCharacterTextSplitter(
     chunk_size = 100,
     chunk_overlap = 0,
 )
 
 texts = text_splitter.create_documents([explanation])

拆分文本需要两个参数:一个块有多大(chunk_size)和每个块重叠多少(chunk_overlap)。每个块之间有重叠对于帮助识别相关的相邻块很重要。

这些块中的每一个都可以这样检索:

 texts[0].page_content

在我们有了这些块之后,我们需要将它们变成嵌入。这允许 Vector Store 在查询时查找并返回每个块。我们将使用 OpenAI 的嵌入模型来执行此操作。

 # Import and instantiate OpenAI embeddings
 
 from langchain.embeddings import OpenAIEmbeddings
 
 embeddings = OpenAIEmbeddings(model_name="ada")
     
 
 # Turn the first text chunk into a vector with the embedding
 
 query_result = embeddings.embed_query(texts[0].page_content)
 print(query_result)

最后,我们需要有一个地方来存储这些矢量化嵌入。如前所述,我们将为此使用 Pinecone。使用前面环境文件中的 API 密钥,我们可以初始化 Pinecone 来存储我们的嵌入。

 # Import and initialize Pinecone client
 
 import os
 import pinecone
 from langchain.vectorstores import Pinecone
 
 
 pinecone.init(
     api_key=os.getenv('PINECONE_API_KEY'),  
     environment=os.getenv('PINECONE_ENV')  
 )
     
 
 # Upload vectors to Pinecone
 
 index_name = "langchain-quickstart"
 search = Pinecone.from_documents(texts, embeddings, index_name=index_name)
     
 
 # Do a simple vector similarity search
 
 query = "What is magical about an autoencoder?"
 result = search.similarity_search(query)
 
 print(result)

现在我们可以在我们的松果矢量商店查询相关信息了!剩下要做的就是结合我们学到的知识来创建我们的特定用例——为我们提供专门的 AI“代理”。

代理商

代理本质上是一个自主的人工智能,它接受输入并按顺序完成这些输入,直到达到最终目标。这涉及到我们的 AI 使用其他 API 来完成发送电子邮件或做数学题等任务。与我们的 LLM + 提示链结合使用,我们可以将合适的 AI 应用串在一起。

现在,这部分的解释会很广泛,所以这里有一个简单的例子,说明如何在 LangChain 中使用 Python 代理来解决一个简单的数学问题。在这种情况下,该代理通过连接我们的 LLM 来运行 Python 代码并使用 NumPy 找到根源来解决问题:

 # Import Python REPL tool and instantiate Python agent
 
 from langchain.agents.agent_toolkits import create_python_agent
 from langchain.tools.python.tool import PythonREPLTool
 from langchain.python import PythonREPL
 from langchain.llms.openai import OpenAI
 
 agent_executor = create_python_agent(
     llm=OpenAI(temperature=0, max_tokens=1000),
     tool=PythonREPLTool(),
     verbose=True
 )
     
 
 # Execute the Python agent
 
 agent_executor.run("Find the roots (zeros) if the quadratic function 3 * x**2 + 2*x -1")

自定义知识聊天机器人本质上是一个代理,它将查询向量化存储的提示和操作链接在一起,获取结果,并将其与原始问题链接起来!

如果您想阅读更多有关 AI 代理的信息,这是一个很好的资源。

其他变化

即使您对 LangChain 的功能有了新的基本了解,我相信此时您的想法还在冒泡。

但到目前为止,我们只看过一个 OpenAI 模型,那就是基于文本的 GPT-3.5-turbo。OpenAI 有一系列模型,您可以将它们与 LangChain 一起使用——包括使用 Dall-E 生成图像。应用我们讨论过的相同概念,我们可以创建AI Art Generator代理、Website Builder 代理等等。

花点时间探索 AI 领域,我相信您会开始获得越来越多的想法。

结论

我希望您对所有这些新 AI 工具的幕后工作有了更多的了解。了解 LangChain 的工作原理是当今作为程序员的一项宝贵技能,可以为您的 AI 开发开辟可能性。

(人工智能教程:https://www.java567.com/search.html?sWord=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&v=2306035