基于开源库的聊天助手实现

大型语言模型的诞生彻底改变了自然语言处理领域,使得这一技术变得人人可用。本文将探讨并实现一些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个隐藏层代表维度。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485