使用LangChain和OpenAI API构建生成性AI应用程序

使用LangChain和OpenAI API构建AI应用程序

介绍

生成式人工智能正在引领行业的最新技术浪潮。生成式人工智能应用,如图像生成、文本生成、摘要和问答机器人等,正在蓬勃发展。随着OpenAI最近引领大型语言模型浪潮,许多初创公司开发了工具和框架,允许开发人员使用这些LLM构建创新应用程序。其中一个工具就是LangChain,它是一个具有组合和可靠性的开发基于LLM的应用程序的框架。LangChain已经成为全球人工智能开发者构建生成式人工智能应用程序的首选工具。LangChain还允许连接外部数据源和与市场上许多LLM进行集成。除此之外,LLM驱动的应用程序还需要一个向量存储数据库来存储它们以后将检索的数据。在本博客中,我们将通过使用OpenAI API和ChromaDB构建一个应用程序流水线来了解LangChain及其功能。

学习目标:

  • 学习LangChain的基础知识,以构建生成式人工智能流水线
  • 使用开源模型和向量存储数据库(如Chromadb)进行文本嵌入
  • 学习使用LangChain与OpenAI API集成LLM到您的应用程序中

本文是Data Science Blogathon的一部分。

LangChain概述

LangChain最近已成为大型语言模型应用程序的热门框架。LangChain提供了一个复杂的框架,用于与LLM、外部数据源、提示和用户界面进行交互。

LangChain的价值主张

LangChain的主要价值主张有:

  • 组件:这些是处理语言模型所需的抽象。组件是模块化的,易于用于许多LLM用例。
  • 现成的链:各种组件和模块的结构化组合,用于完成特定任务,如摘要、问答等。

项目详情

LangChain是一个开源项目,自推出以来,该项目已获得超过54K+的Github星标,显示了该项目的受欢迎程度和可接受性。

项目自述文件描述了该框架的目的,大致如下:

大型语言模型(LLMs)正在成为一种变革性技术,使开发人员能够构建以前无法实现的应用程序。然而,仅仅将这些LLMs孤立使用往往是不够的,真正的力量在于将它们与其他计算源或知识源结合使用。

来源:项目存储库

显然,它定义了该框架的目的,旨在帮助开发这样的应用程序,其中利用了用户的知识。

LangChain组件(来源:ByteByteGo)

LangChain有六个主要组件,用于构建LLM应用程序:模型I/O、数据连接、链路、内存、代理和回调。该框架还允许与许多工具进行集成,以开发全栈应用程序,如OpenAI、Huggingface Transformers和向量存储(如Pinecone和chromadb)等。

组件的全面解释:

  1. 模型I/O:与语言模型进行交互的接口。它由提示、模型和输出解析器组成
  2. 数据连接:与应用程序特定的数据源进行交互,包括数据转换器、文本分割器、向量存储和检索器
  3. 链路:使用AI应用程序的其他组件构建一个调用序列。一些链路的示例包括顺序链、摘要链和检索问答链
  4. 代理:LangChain提供代理,允许应用程序根据用户输入使用对各种工具(包括LLMs)的动态调用链。
  5. 内存:在链路的运行之间保持应用程序状态
  6. 回调:记录和流式传输顺序链的步骤,以便高效运行链路并监控资源消耗

现在让我们来看一些LangChain的用例。

  1. 问题回答或针对特定文档的聊天
  2. 聊天机器人
  3. 摘要
  4. 代理
  5. 与API的交互

这些只是众多用例中的一部分。我们将使用OpenAI APIs和开源向量数据库ChromaDB来学习和开发一个用于特定文档问题回答的语义搜索应用程序。要了解更多关于LangChain框架的信息,我强烈建议阅读官方文档。(链接:这里)

环境设置和加载文档

现在,我们将使用OpenAI的LLM APIs为我们的语义搜索应用程序设置环境,以回答用户在一组文档上的问题。本文中使用的是示例文档,但您可以使用您自己的文档来构建一个问答应用程序。首先,我们需要安装以下库:

安装项目依赖项

# 安装openai、langchain、sentence_transformers和其他依赖项
!pip install openai langchain sentence_transformers -q
!pip install unstructured -q

# 安装环境依赖项
!pip install pydantic==1.10.8
!pip install typing-inspect==0.8.0 typing_extensions==4.5.
!pip install chromadb==0.3.26

LangChain需要一些特定版本的环境依赖项,例如pydantic、typing extensions和ChromaDB。安装完成后,您可以在colab或任何其他笔记本环境中运行以下代码。

LangChain文档加载器

LangChain提供了文档加载器类,用于从用户输入或数据库中加载文档。它支持各种文件格式,例如HTML、JSON、CSV等。我们有一些文本文件将用于我们的用例。您可以在GitHub存储库中找到这些文件。(GitHub存储库-链接)

# 从文档加载器导入langchain dir
from langchain.document_loaders import DirectoryLoader

# 目录路径
directory = '/content/pets'

# 加载文本文档的函数
def load_docs(directory):
  loader = DirectoryLoader(directory)
  documents = loader.load()
  return documents

documents = load_docs(directory)
len(documents)

---------------------------[输出]----------------------------------------
[nltk_data] Downloading package punkt to /root/nltk_data...
[nltk_data]   Unzipping tokenizers/punkt.zip.
[nltk_data] Downloading package averaged_perceptron_tagger to
[nltk_data]     /root/nltk_data...
[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.
5

数据加载完成后,我们将使用文本分割器将文本文档分割为固定大小的块,以将它们存储在向量数据库中。LangChain提供了多个文本分割器,例如按字符分割、按代码分割等。

# 使用文本分割器将文本分割成块
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 使用递归字符分割器将文档分割成块
def split_docs(documents,chunk_size=1000,chunk_overlap=20):
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
  docs = text_splitter.split_documents(documents)
  return docs

# 将分割后的文档存储在docs变量中
docs = split_docs(documents)

一旦文档被转换为块,我们将在下一节中使用开源嵌入模型将它们嵌入为向量。

使用LangChain和开源模型进行文本嵌入

文本嵌入是LLM应用程序开发流程中最重要的概念。在对文本文档进行语义搜索、摘要等任务之前,所有文本文档都需要进行向量化。我们将使用开源句子嵌入模型“all-MiniLM-L6-v2”进行文本嵌入。文档嵌入完成后,我们可以将它们存储在开源向量数据库ChromaDB中进行语义搜索。让我们看一下实际代码示例。

# 使用langchain进行嵌入
from langchain.embeddings import SentenceTransformerEmbeddings
embeddings = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")

# 使用Chroma作为向量存储库并将文档存储在其中
from langchain.vectorstores import Chroma
db = Chroma.from_documents(docs, embeddings)

# 使用查询进行相似性搜索
query = "人们通常拥有哪些不同种类的宠物?"
matching_docs = db.similarity_search(query)

matching_docs[0]

--------------------------[输出]----------------------------------------
Document(page_content='宠物动物有各种各样的形状和大小,
每种适合不同的生活方式和家庭环境。
狗和猫是最常见的,以其陪伴和独特的个性而闻名。
小型哺乳动物如仓鼠、豚鼠和兔子通常被选择为其低维护需求。
鸟类提供美丽和歌声,而乌龟和蜥蜴可以成为有趣的宠物。
即使是鱼类,凭借其平静的存在,也可以成为美妙的宠物。', 
metadata={'source': '/content/pets/Different Types of Pet Animals.txt'})

在上面的代码中,我们使用嵌入来存储在ChromaDB中,它支持内存存储,所以我们可以查询数据库以从我们的文本文档中获取答案。我们询问了关于人们常常拥有的不同种类的宠物,并得到了一个带有答案来源的正确答案。

使用OpenAI API、ChromaDB和LangChain的生成式AI应用

使用LangChain和OpenAI API进行语义搜索问答

该流程包括解释搜索词和文档的意图和上下文,以产生更精确的搜索结果。它可以通过理解用户意图,检查单词和概念之间的联系,并利用自然语言处理中的注意机制来生成上下文感知的搜索结果,从而提高搜索准确性。

LangChain提供了一个OpenAI聊天界面,将模型API调用到您的应用程序中,并创建一个基于给定上下文或输入文档回答用户查询的问答流程。它基本上执行向量化搜索,以找到与问题最相似的答案。(参考下面的流程图。)

基于上下文的搜索流程(来源:LangChain文档)
# 在下面的参数中插入OpenAI密钥
import os
os.environ["OPENAI_API_KEY"] = "YOUR-OPENAI-KEY"

# 加载LLM模型
from langchain.chat_models import ChatOpenAI
model_name = "gpt-3.5-turbo"
llm = ChatOpenAI(model_name=model_name)

# 使用q&a链获取我们查询的答案
from langchain.chains.question_answering import load_qa_chain
chain = load_qa_chain(llm, chain_type="stuff",verbose=True)

# 编写您的查询并执行相似性搜索以生成答案
query = "拥有宠物有哪些情感上的好处?"
matching_docs = db.similarity_search(query)
answer =  chain.run(input_documents=matching_docs, question=query)
answer

-----------------------------------[结果]---------------------------------
'拥有宠物可以提供许多情感上的好处。宠物提供陪伴,可以帮助减少孤独和孤立感。它们提供无条件的爱和支持,可以提高情绪和整体福祉。与宠物互动,例如拍摄或与它们玩耍,已被证明可以降低压力激素水平并增加缔合和放松相关的催产素的释放。宠物还提供目标感和责任感,照顾它们可以给人一种成就感,并分散日常压力。此外,宠物与主人之间的纽带可以在个人或社会压力时提供稳定感和一致性感。'

上面的代码使用LangChain的ChatOpenAI()函数调用“gpt-3.5-turbo”模型API,并创建了一个问答链来回答我们的查询。有关代码的更详细信息,您可以访问LangChain的官方文档(此处)和Github代码笔记本(此处)

使用LLMChain生成公司名称

大型语言模型的另一个用例是使用LangChain的LLMChain、OpenAI LLM和PromptTemplate生成公司名称。您可以根据给定的描述作为提示来生成公司或产品名称。请参考下面的代码:

# 从langchain导入必要的组件
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 使用OpenAI的LLM
llm = OpenAI(temperature=0.9)

# 使用PromptTemplate编写提示
prompt = PromptTemplate(
    input_variables=["product"],
    template="一个制造{product}的公司的好名字是什么?",
)

# 使用LLMChain创建链
chain = LLMChain(llm=llm, prompt=prompt)

# 只指定输入变量运行链。
print(chain.run("五颜六色的袜子"))

输出>>>    五颜六色的脚趾有限公司

使用LangChain链进行文本摘要

链条还可以用于开发文本摘要应用程序,这在法律行业中可以帮助总结大量的法律文件以加快司法流程。请参考以下使用LangChain函数的示例代码:

# 导入langChain的load_summarize_chain函数和OpenAI llm
from langchain.llms import OpenAI
from langchain.chains.summarize import load_summarize_chain

# OpenAI的LLM 
llm = OpenAI(temperature=0.9)

# 使用OpenAI LLM创建一个chain实例,类型为map_reduce
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)

LangChain的易用界面为最终用户提供了许多不同的应用程序,并解决了许多问题。正如您所见,只需几行简单的代码,我们就可以利用LLM的强大功能来总结来自Web上任何来源的任何数据。

结论

总之,本博客文章探讨了使用LangChain和OpenAI API构建生成式AI应用程序的令人兴奋的领域。我们了解了LangChain的概述、其各种组件以及LLM应用的用例。生成式AI已经在各个领域进行了革命性的改变,使我们能够生成逼真的文本、图像、视频等等。语义搜索是一种应用,它使用OpenAI LLM(如GPT-3.5和GPT-4)来构建问答应用程序。让我们来看一下本博客的主要要点:

  1. 我们了解了LangChain的简要概述 – 一种用于构建基于LLM的应用程序的开源框架。
  2. 我们学会了使用LangChain和ChromaDB – 一种用于存储相似性搜索应用程序的嵌入向量数据库。
  3. 最后,我们了解了使用LangChain构建生成式AI应用程序的OpenAI LLM API。

常见问题

本文中显示的媒体不归Analytics Vidhya所有,仅由作者自行决定使用。