langchain笔记(3)

118 阅读2分钟

用LangChain快速构建基于“易速鲜花”本地知识库的智能问答系统

核心实现机制:数据处理管道,分为以下5步

1. Loading:文档加载器把Documents 加载为以LangChain能够读取的形式。

2. Splitting:文本分割器把Documents 切分为指定大小的分割,我把它们称为“文档块”或者“文档片”。

3. Storage:将上一步中分割好的“文档块”以“嵌入”(Embedding)的形式存储到向量数据库(Vector DB)中,形成一个个的“嵌入片”。

4. Retrieval:应用程序从存储中检索分割后的文档(例如通过比较余弦相似度,找到与输入问题类似的嵌入片)。

5. Output:把问题和相似的嵌入片传递给语言模型(LLM),使用包含问题和检索到的分割的提示生成答案

 

一.我们首先用LangChain中的document_loaders来加载各种格式的文本文件。

import os

 os.environ["OPENAI_API_KEY"] = '你的Open AI API Key'

 # 1.Load 导入Document Loaders

 from langchain.document_loaders import PyPDFLoader

from langchain.document_loaders import Docx2txtLoader

 from langchain.document_loaders import TextLoader

加载Documents

base_dir = '.\OneFlower' # 文档的存放目录

documents = []

for file in os.listdir(base_dir):     # 构建完整的文件路径    

file_path = os.path.join(base_dir, file)    

if file.endswith('.pdf'):        

loader = PyPDFLoader(file_path)        

documents.extend(loader.load())    

elif file.endswith('.docx'):        

loader = Docx2txtLoader(file_path)        

documents.extend(loader.load())    

elif file.endswith('.txt'):        

loader = TextLoader(file_path)        

documents.extend(loader.load())

二,文本切割

2.Split 将Documents切分成块以便后续进行嵌入和向量存储 

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10) //文档被切成了一个个200字符左右的文档块

chunked_documents = text_splitter.split_documents(documents)
三,向量数据库存储

词嵌入(Word Embedding)是自然语言处理和机器学习中的一个概念,它将文字或词语转换为一系列数字,通常是一个向量。简单地说,词嵌入就是一个为每个词分配的数字列表。这些数字不是随机的,而是捕获了这个词的含义和它在文本中的上下文。因此,语义上相似或相关的词在这个数字空间中会比较接近。  

举个例子,通过某种词嵌入技术,我们可能会得到: "国王" -> [1.2, 0.5, 3.1, ...] "皇帝" -> [1.3, 0.6, 2.9, ...] "苹果" -> [0.9, -1.2, 0.3, ...]  

从这些向量中,我们可以看到“国王”和“皇帝”这两个词的向量在某种程度上是相似的,而与“苹果”这个词相比,它们的向量则相差很大,因为这两个概念在语义上是不同的。  

词嵌入的优点是,它提供了一种将文本数据转化为计算机可以理解和处理的形式,同时保留了词语之间的语义关系。这在许多自然语言处理任务中都是非常有用的,比如文本分类、机器翻译和情感分析等。