前言
目前 AIGC
的浪潮很火,不管你是什么方向的程序员,都可以通过大模型去构建自己的 App,但是搜索资料学习的时候发现:
- 目前构建 AI 应用的中文资源比较少,大多数都是英文的。
- 教程大多是
demo
级别,没有生产级的构建教程,更没有带有完整代码且一步步教学的资源。 - 构建应用一般会使用
Langchain
提升构建效率,但是Langchain
文档有点乱,并且版本迭代较快,使用方式有差异。
由于以上原因,本人在学习构建自己的 AI 应用时候踩了很多坑,加上身边的小伙伴也想要一个完整的教程。本着 以输出倒逼输入
的目的,决定开一个系列,从零基础一步步构建 生产级 AI 应用
,只需要一点点 🤏🏻 Python 基础就 ok。
无 Python 基础的同学可以通过 Python 官网教程,快速学习一波,有这个基础就够了。
目标产品 ChatWithPDF
实践是最快的一种学习方式,所以本系列的目的就是构建一个对标 PDF.ai 的产品,用户可以上传自己的 PDF 文件,然后通过 ChatWithPDF
对 PDF 文件内容提问学习,得到总结,查找信息等等。
这类应用一般都是要收费的(根据上传的 PDF 大小,PDF 数量收取对应费用),通过学习这个系列可以自己本地构建一个应用,免费辅助学习知识,绝壁不亏
。
环境准备
构建这个产品需要的东西就2个:Python 环境 + OpenAI API Key ,由于 Python 环境安装比较简单,这里就不介绍了,直接按照 Python 官网教程 就ok。
如果有不知道 OpenAI 是神马,直接浏览器搜索下就知道了,这里也不赘述。但是由于 OpenAI API 的访问问题,这里建议使用 Azure OpenAI API。
注册一个微软云 Azure 账号,绑定下自己的信用卡就有免费的额度,足够我们整个系列的使用。
方案概览
开始编码之前,需要先做方案设计。针对 ChatWithPDF 的应用功能,有两个方案,如下所示:
方案1:全量提交所有内容(不推荐)
这个方案在 PDF 内容比较少时,不会有问题。但是当 PDF 内容比较长的时候有3个问题:
- 发送给 ChatGPT 的内容是有长度限制的(token数量限制),PDF 内容比较长的时候会发送失败。
- 即使 ChatGPT 没有内容限制,当一次性提交大量文本时,获取回复效果并没想象中好。
- 发送内容多少等于消耗token数量的多少,内容多token消耗多相当于成本高。
方案2:提交和用户问题相关的 PDF 内容(推荐)
方案 2 主要分为 4 个步骤:
- 当用户上传 PDF 之后,摘取 PDF 的文本内容,将所有内容切割成文本块。
- 存储每个文本块的内容。
- 当用户提问时,找到和问题最相关的文本块。
- 将相关联的文本块 + 用户问题一起提交给 ChatGPT。
上图是完整的流程,其实分为两个步骤:
- 构建通过用户上传的 PDF 构建相关的向量数据库
- 处理用户的问题
在本系列中我们采用方案2,目前的流程是为了方便大家在学习前有个整体的印象,在实际开发过程中还有很多细节需要处理,目前是忽略的。但最终效果的好坏很大程度上就是细节决定的,所以后续对于细节方面也会做详细的分析。
Embedding 介绍
👆🏻上个小节有个关键步骤就是需要检索出 PDF 中与用户提问相关联的文本块,要实现这个过程就是通过使用 Embedding 对文本进行向量化处理。
Embedding 是一种将物体(如文本)表示为低维向量的技术。这些向量具有以下特性:
- 距离相近的向量对应含义相近的物体。
- 支持数学运算,如Embedding(马德里)-Embedding(西班牙)+Embedding(法国)≈Embedding(巴黎)。
- 能够揭示物体间的潜在关系。
举个具体的例子,"我感到很快乐" 这句话通过 Embedding
算法之后就会得到一个向量,如下图所示。
在这里,我们并不需要知道 Embedding 算法的具体实现,因为已经有人帮我们实现好,我们需要知道的是一个基本原理,方便我们后续的开发工作。
为什么通过 Embedding 之后的内容可以进行相关联程度的检索呢?
因为 Embedding 就是将文本(高维度)映射到了一个低维度(每个维度都有个评分)向量,然后通过计算向量之间的相似度来决定文本之间的相关联性。
总结
本文是从零构建生产级 AI 应用的第一篇,主要介绍了做这个事情的背景原因以及整体的方案概述,下一篇将介绍如何利用 Langchain
加速我们的 AI 应用的构建,敬请期待~😉