🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】 深度学习【DL】
🖍foreword
✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。
如果你对这个系列感兴趣的话,可以关注订阅哟👋
文章目录
ChatGPT和CustomGPT AI等人工智能工具对人们来说非常有用,这是有充分理由的。您需要滚动浏览 50 页文档才能找到简单答案的日子已经一去不复返了。相反,您可以依靠人工智能来完成繁重的工作。
但这些开发人员到底是如何创建和使用这些工具的呢?嗯,他们中的许多人都在使用一个名为 LangChain 的开源框架。
在本文中,我将向您介绍 LangChain,并向您展示如何将其与 OpenAI 的 API 结合使用来创建这些改变游戏规则的工具。希望我能激励你们中的一位提出自己的想法。那么让我们开始吧!
什么是LangChain?
LangChain是一个开源框架,允许 AI 开发人员将 GPT-4 等大型语言模型 (LLM) 与外部数据相结合。它以 Python 或 JavaScript (TypeScript) 包的形式提供。
如您所知,GPT 模型一直使用 2021 年之前的数据进行训练,这可能是一个重大限制。虽然这些模型的常识很丰富,但能够将它们连接到自定义数据和计算打开了许多大门。这正是浪链所做的。
从本质上讲,它允许您的法学硕士在得出答案时参考整个数据库。因此,您现在可以让 GPT 模型以报告、文档和网站信息的形式访问最新数据。
最近,浪链的人气大幅飙升,尤其是在3月份推出GPT-4之后。这要归功于它的多功能性以及与强大的法学硕士相结合所带来的多种可能性。
LangChain如何运作?
虽然您可能认为 LangChain 听起来很复杂,但实际上它很容易上手。
简而言之,LangChain只是组成了大量的数据,这些数据可以很容易地被法学硕士以尽可能少的计算能力引用。它的工作原理是获取大量数据源(例如 50 页的 PDF),并将其分解为“块”,然后将其嵌入到矢量存储中。
创建矢量存储的简单图
现在我们已经有了大型文档的矢量化表示,我们可以将其与 LLM 结合使用,以仅检索创建提示完成对时需要引用的信息。
当我们在新的聊天机器人中插入提示时,LangChain将查询Vector Store以获取相关信息。将其视为文档的迷你 Google。一旦检索到相关信息,我们就会将其与提示结合起来提供给法学硕士以生成我们的答案。
LangChain 如何与 OpenAI 的LLM合作
LangChain 还允许您创建可以执行操作的应用程序,例如上网、发送电子邮件以及完成其他与 API 相关的任务。
有很多可能的用例——这里只是我想到的几个:
- 个人AI邮件助手
- 人工智能学习伙伴
- 人工智能数据分析
- 定制公司客户服务聊天机器人
- 社交媒体内容创作助理
而这样的例子不胜枚举。我将在以后的文章中介绍正确的构建教程,所以请继续关注。
如何开始使用浪链
浪链应用程序由 5 个主要组件组成:
- 模型(LLM 包装器)
- 提示
- 链条
- 嵌入和向量存储
- 代理商
我将为您提供每个方面的概述,以便您能够对 LangChain 的工作原理有一个高层次的了解。展望未来,您应该能够应用这些概念来开始制作自己的用例并创建自己的应用程序。
我将使用 Rabbitmetrics ( Github ) 中的简短代码片段来解释所有内容。他提供了关于这个主题的精彩教程。这些片段应该可以让您完成所有设置并准备好使用 LangChain。
首先,让我们设置环境。您可以 pip install 为此所需的 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 环境和 Pinecone API 的 API 密钥存储到您的环境文件中。您可以在各自的网站上找到此信息。然后我们只需使用以下内容加载该环境文件:
# Load environment variables
from dotenv import load_dotenv,find_dotenv
load_dotenv(find_dotenv())
现在,我们准备好开始了!
模型(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 界面中输入的内容 - 您的提示。
但对于自定义知识聊天机器人,我们经常抽象出提示中的重复组件。例如,如果我正在创建一个推文生成器应用程序,我不想继续输入“给我写一条关于...的推文”。
那么让我们看看如何使用提示模板将其抽象出来。
提示
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,这对您来说应该很舒服。
链条
链允许您采用简单的 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 如此多功能的原因。但它真正的亮点在于将其与前面讨论的矢量存储结合使用。我们来介绍一下这个组件。
嵌入和向量存储
这就是我们整合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
获得这些块后,我们需要将它们转化为嵌入。这允许向量存储在查询时查找并返回每个块。我们将使用 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)
现在我们可以从我们的松果矢量商店查询相关信息了!剩下要做的就是结合我们所学到的知识来创建我们的特定用例——为我们提供专门的人工智能“代理”。
Agent
代理本质上是一个自主人工智能,它接收输入并按顺序完成这些任务,直到达到最终目标。这涉及到我们的 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")
自定义知识聊天机器人本质上是一个代理,它将查询矢量化存储的提示和操作链接在一起,获取结果,并将其与原始问题链接起来!
其他变化
即使您对 LangChain 的功能有了新的基本了解,我相信您此时也会充满想法。
花一些时间探索人工智能领域,我相信你会开始得到越来越多的想法。
结论
我希望您能更多地了解所有这些新人工智能工具的幕后情况。了解 LangChain 的工作原理是当今程序员的一项宝贵技能,可以为您的 AI 开发开辟可能性。