潇大

Mar 16, 2023

2023-03-16 回顾:构建搜索系统

受到 ChatPDF 等类似应用的启发,准备构建一个基础版本的文字搜索系统,以实现一个基于文本的问答机器人。
预计开发周期:1~2周(开发+迭代)
目录:
 

如何构建一个基于文本的问答机器人

文本是人类知识的主要载体,也是我们日常交流的重要方式。如果能够让机器理解和回答文本中的问题,那么我们就可以更方便地获取和利用信息,也可以更自然地与机器进行对话。在这篇博客文章中,我将介绍如何受到 ChatPDF 等类似应用的启发,准备构建一个基础版本的文字搜索系统,以实现一个基于文本的问答机器人。
同样,你还可以将自己以前写过的文章集合作为语料放入到其中,达到近似与过去的自己对话的效果。这个也可以作为一个数字分身,成为其他人了解你或者你的产品的窗口。
在这篇博客文章中,我将介绍如何使用 OpenAI 的 Embedding 模型来构建一个基础版本的文字搜索系统,以实现一个基于文本的问答机器人。我计划分为以下几个步骤:
  • 首先,我需要对网站文本的爬取和预处理,或者将 PDF 文件转换为文本格式,并对文本进行分段处理,使每个段落都有一个唯一的标识符。
  • 其次,我需要使用 OpenAI 的 Embedding API 来将每个段落的文本转换为高维度的向量表示,这样可以捕捉文本的语义信息和相似度。
  • 然后,我需要使用一个合适的向量引擎来存储和检索这些向量,例如 Faiss 或 Annoy。这样可以快速地在大规模的数据集中找到最相似或最相关的向量。
  • 最后,当用户输入一个问题时,我需要先将问题也转换为向量表示,然后使用向量引擎来查询最匹配的段落向量,并返回给用户相应的段落文本作为答案。
通过这样的方法,我希望能够实现一个简单而有效的基于文本的问答机器人,能够对用户提出的各种问题给出合理和准确的回复。

网站文本的爬取和预处理

要构建一个基于文本的问答机器人,首先需要有一些文本作为知识源。这些文本可以来自于不同的领域和主题,例如新闻、百科、教育、娱乐等。为了获取这些文本,我们可以使用一些网络爬虫工具,例如 Scrapy、BeautifulSoup等,来抓取网站上的内容,并保存为 PDF 或者 TXT 格式。
但是,并不是所有网站上的内容都适合作为问答机器人的知识源。有些网站可能包含了大量的广告、评论、导航栏等无关信息,有些网站可能存在版权或者隐私问题。因此,在爬取网站文本之后,我们还需要进行一些预处理工作,例如去除无用标签、提取正文内容、过滤敏感词汇等。这样才能保证我们得到的文本是高质量且合法合规的。
 

使用 OpenAI 的 Embedding 转换成向量

在得到了一些高质量且合法合规的网站文本之后,我们就可以开始构建我们的文字搜索系统了。文字搜索系统的核心功能是根据用户输入的问题,在知识源中找到最相关最准确的答案。
要让机器能够理解和处理文本,我们首先需要把文本转换成一种机器能够识别和操作的格式。这就是所谓的向量化(Vectorization)过程。向量化就是把每个词或每段文字用一个数值数组来表示,这个数组就叫做向量(Vector)。向量可以捕捉到文字之间的语义关系和相似度,并且可以用数学运算来处理。
有很多方法可以实现向量化,比如词袋模型(Bag-of-Words)、TF-IDF、Word2Vec、GloVe 等等。但是这些方法都有一些局限性,比如无法处理多义词、无法考虑上下文、无法表达复杂语义等等。为了解决这些问题,OpenAI 开发了一种新颖且强大的向量化方法:Embedding
要使用 OpenAI 的 Embedding 模型,首先需要注册并获取一个 API key。然后就可以通过调用 API 来获取任意文本或代码的向量表示。OpenAI 提供了多种不同类型和规模的 Embedding 模型 ,其中最新和最推荐使用的是 text-embedding-ada-002。这个模型可以将任意长度(最大 2048 个字符)和任意语言(支持 100 多种语言)的文本转换成一个约 1300 维度(dimension)的向量。
例如,如果我们想要获取以下这段中文文本(摘自《三体》第一章) 的向量表示:
“红岸之战”发生在公元前二百八十四年冬天。 这场战役被认为是中国历史上规模最大、影响最深远、最具传奇色彩和悲剧性质 的战争之一。
我们可以使用以下方式来调用 API:
curl https://api.openai.com/v1/embeddings \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d '{ "input": "“红岸之战”发生在公元前二百八十四年冬天。这场战役被认为是中国历史上规模最大、影响最深远、最具传奇色彩和悲剧性质 的战争之一。", "model": "text-embedding-ada-002" }'
 
 

使用向量引擎进行计算

略。

根据问题进行向量匹配

略。
 
先前的一些想法:
 
一些有用的参考资料:
 

Copyright © 2025 潇大

logo