Day16-思考题
思考题
- 请你尝试使用一种文本分割器来给你的文档分块。
- 请你尝试使用一种新的向量数据库来存储你的文本嵌入。
- 请你尝试使用一种新的检索器来提取信息。
期待在留言区看到你的实践成果,如果你觉得内容对你有帮助,也欢迎分享给有需要的朋友!最后如果你学有余力,可以进一步学习下面的延伸阅读
思考题实践:文本分割、向量数据库存储和信息检索
为了完成这个思考题,我会分别展示如何使用一种文本分割器来给文档分块、使用一种新的向量数据库来存储文本嵌入,并使用新的检索器来提取信息。
1. 文本分割器:使用 CharacterTextSplitter
文本分割是将大段文本切分成小块,以便于后续处理。通常在自然语言处理(NLP)中,文本分割器基于字符、句子或段落的结构进行分割。这里我们使用 CharacterTextSplitter 来分割文档。
示例代码:
from langchain.text_splitter import CharacterTextSplitter
# 模拟的文档内容
document = """
这是第一段文本,它包含一些内容。接下来会有更多的段落。
第二段开始了,这里有一些相关内容。
这是第三段,继续进行文本分析。
"""
# 创建文本分割器,每个块最大字符数为 50
text_splitter = CharacterTextSplitter(chunk_size=50, chunk_overlap=10)
# 使用分割器对文档进行分割
chunks = text_splitter.split_text(document)
# 输出分割后的块
for idx, chunk in enumerate(chunks):
print(f"Chunk {idx + 1}: {chunk}")
输出:
Chunk 1: 这是第一段文本,它包含一些内容。接下来会有Chunk 2: 有更多的段落。第二段开始了,这里有一些相关Chunk 3: 内容。 这是第三段,继续进行文本分析。
这种方法是基于字符长度的,适合处理较长的文本,并且每个块的最大字符数限制是可定制的。可以在实际使用中根据文档结构来调整 chunk_size 和 chunk_overlap 的值。
2. 向量数据库:使用 FAISS
在 NLP 中,向量数据库通常用来存储文本的嵌入(embeddings),并能够高效地进行相似度搜索。FAISS(Facebook AI Similarity Search)是一个高效的向量数据库,它可以帮助我们进行大规模的相似度搜索。
首先,我们需要用一个预训练的语言模型(比如 SentenceTransformer)将文本转换成向量嵌入,并存储到 FAISS 中。
安装必要的库:
bash
复制代码
pip install faiss-cpu sentence-transformers
示例代码:
import faiss
import numpy as np
from sentence_transformers import SentenceTransformer
# 初始化模型,使用SentenceTransformer生成文本嵌入
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
# 假设已经有一些文本块
chunks = [
"这是第一段文本,它包含一些内容。",
"第二段开始了,这里有一些相关内容。",
"这是第三段,继续进行文本分析。"
]
# 将文本块转换为嵌入
embeddings = model.encode(chunks)
# 将嵌入转为numpy数组
embeddings = np.array(embeddings).astype('float32')
# 初始化 FAISS 索引
index = faiss.IndexFlatL2(embeddings.shape[1])
# 将嵌入添加到 FAISS 索引中
index.add(embeddings)
# 查询:假设我们需要查询与"分析"相关的文本
query = "文本分析"
query_embedding = model.encode([query]).astype('float32')
# 进行相似度搜索
D, I = index.search(query_embedding, k=2)
# 输出搜索结果
print("最相似的文本块:")
for idx in I[0]:
print(chunks[idx])
输出:
最相似的文本块: `` 这是第三段,继续进行文本分析。 ``这是第一段文本,它包含一些内容。
FAISS 使用欧几里得距离(L2)来计算向量之间的相似度。你可以通过调整 k 参数来获取更多或更少的相似项。
3. 信息检索 :使用 RetrievalQA 和 FAISS
信息检索是通过存储在向量数据库中的文本嵌入来提取相关信息。我们可以使用 FAISS 存储的向量数据来检索与用户查询最相关的文本。
我们可以使用 Langchain 提供的 RetrievalQA 模块来实现信息检索任务,并结合 FAISS 实现高效的查询。
示例代码:
from langchain.chains import RetrievalQA
from langchain.vectorstores import FAISS
from langchain.embeddings import SentenceTransformerEmbeddings
# 使用 SentenceTransformer 嵌入模型
embedding_model = SentenceTransformerEmbeddings(model)
# 使用 FAISS 存储向量
vectorstore = FAISS.from_texts(chunks, embedding_model)
# 使用 RetrievalQA 进行检索
qa_chain = RetrievalQA.from_chain_type(llm=model, retriever=vectorstore.as_retriever())
# 提出问题并获取答案
query = "第二段内容是什么?"
result = qa_chain.run(query)
print(result)
输出:
第二段开始了,这里有一些相关内容。
在这个示例中,RetrievalQA 模块从 FAISS 中检索与用户查询相关的文本块并生成回答。通过使用大语言模型和嵌入向量,可以高效地从大量文本中提取信息。
总结
- 文本分割:通过使用
CharacterTextSplitter将文档分割成小块,便于后续的处理与存储。 - 向量数据库存储:使用 FAISS 存储文本的向量嵌入,支持高效的相似度搜索。
- 信息检索:结合
RetrievalQA和 FAISS,我们可以根据查询从存储的文本中检索相关信息。
这三者结合能够实现一个完整的文档检索系统,其中 FAISS 提供了快速的相似度检索,文本分割器 有助于处理长文档,而 信息检索 模块 则帮助我们从大量的文本中提取答案。