LangChain简单使用教程之搭建本地知识库AI问答

LangChain是一个开源的框架,本身不提供 LLM,但是它可以让AI开发人员把像chatgpt这样的大型语言模型(LLM)和外部数据结合起来。LangChain 提供通用的接口访问 LLM,支持OpenAI, HuggingFace, 自定义api等多种LLM。听起来很复杂,但其实它很容易上手。下面我们就用LangChain+chatgpt搭建一个简单的本地知识库。

本地知识库问答流程如下
  1. 加载(Document loading): 首先,我们需要加载我们的本地文本数据,使用LangChain的loader组件可以实现。
  2. 文档切片(Splitting): 通过LangChain的文本拆分器将 Documents 切割为指定大小的文本片段。
  3. 存储(Storage): 将切割好的文档片段,通过嵌入模型计算文档特征向量,然后存储到向量数据库。
  4. 检索(Retrieval): 根据问题,去向量数据库查询相似的文档片段。
  5. 生成(Generation): 使用LangChain QA链执行问答,将跟问题相关的文档片段和问题一起拼接到自己设计的AI提示词,传给LLM,让AI回答问题。
安装 LangChain
pip install langchain

在这个例子中,我们将使用 OpenAI 的 API,因此我们需要安装OpenAI的SDK:

pip install openai

其他用到的python库:

pip install unstructured
pip install pdf2image
pip install chromadb
pip install tiktoken
代码实例:
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain import OpenAI,VectorDBQA
from langchain.document_loaders import DirectoryLoader
from langchain.chains import RetrievalQA

import os
os.environ["OPENAI_API_KEY"] = 'Your openai key'

#从指定的abc目录中加载文件所有的txt文件
loader = DirectoryLoader('abc', glob='**/*.txt')

# 将数据转成 document 对象,每个文件会作为一个 document
documents = loader.load()

# 初始化加载器
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
# 切割加载的 document
split_docs = text_splitter.split_documents(documents)

# 初始化 openai 的 embeddings 对象
embeddings = OpenAIEmbeddings()
# 将 document 通过 openai 的 embeddings 对象计算 embedding 向量信息并临时存入 Chroma 向量数据库,用于后续匹配查询
docsearch = Chroma.from_documents(split_docs, embeddings)

# 创建问答对象
qa = VectorDBQA.from_chain_type(llm=OpenAI(), chain_type="stuff", vectorstore=docsearch,return_source_documents=True)

# 进行问答
result = qa({"query": "这里是要提问的问题"})
print(result)
Lanchain常用数据加载器

DirectoryLoader:加载目录中的所有文档,默认情况下使用UnstructuredLoader

loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader)
docs = loader.load()
len(docs)

TextLoader:txt文本加载器

from langchain.document_loaders import TextLoader
# 定义文本加载器,指定读取的文件路径
loader = TextLoader("test.txt")
loader.load()

CSVLoader:csv文件加载器

from langchain.document_loaders.csv_loader import CSVLoader

# 定义csv加载器,加载指定csv文件
loader = CSVLoader(file_path='./example_data/test.csv')

UnstructuredHTMLLoader:HTML文档加载

from langchain.document_loaders import UnstructuredHTMLLoader
# 定义html加载器
loader = UnstructuredHTMLLoader("test.html")

UnstructuredMarkdownLoader:Markdown文档加载

from langchain.document_loaders import UnstructuredMarkdownLoader
loader = UnstructuredMarkdownLoader(path)

PyPDFLoader:PDF加载器

from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("test.pdf")
Split(切割文档)

因为大模型提示词有最大token限制,我们不能把太多的文档内容传给AI,通常是把相关的文档片段穿过去就行,所以这里需要对文档切片处理。
Langchain提供了很多文本切割的工具,其中langchain默认使用RecursiveCharacterTextSplitter:

  • RecursiveCharacterTextSplitter():按字符串分割文本,递归地尝试按不同的分隔符进行分割文本。
  • CharacterTextSplitter():按字符来分割文本。
  • MarkdownHeaderTextSplitter():基于指定的标题来分割markdown 文件。
  • TokenTextSplitter():按token来分割文本。
  • SentenceTransformersTokenTextSplitter() : 按token来分割文本
  • Language() - 用于 CPP、Python、Ruby、Markdown 等。
  • NLTKTextSplitter():使用 NLTK(自然语言工具包)按句子分割文本。
  • SpacyTextSplitter() - 使用 Spacy按句子的切割文本。
Store(向量存储)

为了能够根据问题查询相关的文档片段,我们需要把前面拆分的文档片段,分别使用embedding(嵌入模型)计算文本特征向量,然后存储到向量数据库中。
这里我们使用langchain默认的向量数据库chroma。

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# 初始化 openai 的 embeddings 对象
embeddings = OpenAIEmbeddings()
# 将 document 通过 openai 的 embeddings 对象计算 embedding 向量信息并临时存入 Chroma 向量数据库,用于后续匹配查询
docsearch = Chroma.from_documents(split_docs, embeddings)

  • 博客主页:https://blog.csdn.net/qq233325332
  • 欢迎点赞 收藏 ⭐留言 如有错误敬请指正!
  • 本文由 陌北v1 原创,首发于 CSDN博客
  • 停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

你可能感兴趣的:(人工智能,langchain)