大型语言模型的诞生彻底改变了自然语言处理领域,使得这一技术变得人人可用。本文将探讨并实现一些NLP技术,以创建一个强大的聊天助手,该助手能够根据给定的文章(或PDF)回答问题,所有这些都将使用开源库完成,无需OpenAI API密钥。
工作流程
在本节中,将详细介绍应用程序的工作流程。用户可以提供PDF文件或文章的URL,并提出问题,应用程序将尝试根据提供的来源回答问题。将使用PYPDF2库(针对PDF文件)或BeautifulSoup(针对文章URL)来提取内容。然后,将使用langchain库中的CharacterTextSplitter将其分割成块。
对于每个块,将使用all-MiniLM-L6-v2模型计算其对应的词嵌入向量,该模型将句子和段落映射到384维的密集向量空间(词嵌入是一种将单词/句子表示为向量的技术),相同的技术也应用于用户问题。这些向量将作为输入提供给sentence_transformers提供的语义搜索函数,这是一个用于最先进的句子、文本和图像嵌入的Python框架。
该函数将返回可能包含答案的文本块,问答模型将根据语义搜索+用户问题的输出生成最终答案。请注意,所有提到的模型都可以通过API访问,仅使用HTTP请求即可。代码将使用Python编写。
实现
在本节中,将只关注实现,而详细信息将在FAQ部分提供。首先,下载依赖项,然后导入它们。
pip install -r requirements.txt
import torch
import numpy as np
from sentence_transformers import util
from langchain.text_splitter import CharacterTextSplitter
from bs4 import BeautifulSoup
import requests
torch: 在处理张量时非常有用(Pytorch库)。
requests: 发送HTTP请求。
接下来,将展示如何从PDF和文章中提取内容。对于PDF,尝试提取pdf页面中的文本。对于文章,尝试找到位于html标签之间的内容,如h1、p、li、h2等(这些标签适用于Medium等网站,可能与其他网站不同)。
try:
pdf=PdfReader(path_pdf_file)
result=''
for i in range(len(pdf.pages)):
result+=pdf.pages[i].extract_text()
except:
print('PDF文件不存在')
exit(0)
对于文章,尝试找到位于html标签之间的内容,如h1、p、li、h2等。
try:
request=requests.get(URL_LINK)
request=BeautifulSoup(request.text,'html.parser')
request=request.find_all(['h1','p','li','h2'])
except:
print('错误的URL链接')
exit(0)
接下来,将展示如何将文本分割成块。每个块将包含1000个标记,重叠200个标记,以保持块之间的关联性,防止分离。
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=1000,
chunk_overlap=200,
length_function=len
)
chunks = text_splitter.split_text(result)
然后,将展示如何进行词嵌入。可以从huggingface下载all-MiniLM-L6-v2模型,或者可以通过HTTP请求直接访问它,因为它作为API提供。
hf_token='在这里放置huggingface访问令牌'
api_url= """https://api-inference.huggingface.co/pipeline/feature-extraction/
sentence-transformers/all-MiniLM-L6-v2"""
headers = {"Authorization": f"Bearer {hf_token}"}
接下来,将展示如何进行语义搜索。最终将包含2个可能包含答案的文本块(设置了top_k=2,以增加从QA模型获得正确答案的概率)。
result=util.semantic_search(query_embeddings, output,top_k=2)
final=[chunks[result[0][i]['corpus_id']] for i in range(len(result[0]))]
最后,将展示如何使用问答模型。由于已经有了上下文(文本块)和问题,可以使用任何模型(可以快速查看huggingface QA模型以获得想法)。选择了AI21studio问答模型,可以免费注册以获得访问令牌。
AI21_api_key = 'AI21studio api密钥'
url = "https://api.ai21.com/studio/v1/answer"
payload = {
"context":' '.join(final),
"question":user_question
}
headers = {
"accept": "application/json",
"content-type": "application/json",
"Authorization": f"Bearer {AI21_api_key}"
}
response = requests.post(url, json=payload, headers=headers)
if response.json()['answerInContext']:
print(response.json()['answer'])
else:
print('在文档中未找到答案⚠️,请重新表述问题。')
常见问题
Q1. 关于词嵌入模型MiniLM-L6-v2及其训练过程?
A. 这个模型是在1亿句子对数据集上微调nreimers/MiniLM-L6-H384-uncased模型的结果。使用自监督技术训练基础模型,为模型提供包含缺失单词的短语,并尝试预测它。考虑词嵌入向量作为此模型的权重,有384个隐藏层代表维度。