极客时间已完结课程限时免费阅读

24|提示语工程(六):超越智能,让你的AI系统成为全知超人

24|提示语工程(六):超越智能,让你的AI系统成为全知超人-AI大模型系统实战-极客时间
下载APP

24|提示语工程(六):超越智能,让你的AI系统成为全知超人

讲述:Tyler

时长10:47大小9.84M

你好,我是 Tyler。
前几节课中,我们学习了如何让大语言模型高效地利用外部记忆,来增强自己的能力。今天这节课,我们重点来学习一下如何高效地存储和检索这些外部记忆。
这其中有两个很重要的问题需要解决。第一是如何表示这些知识,也就是知识表征,只有对知识库中的文档进行合适的表达,才能最精准地检索出我们想要的信息。还有第二个重要问题,完成知识表征以后,我们还需要一个高效的检索方法,在海量的外部记忆信息中检索出我们想要的内容。
这两个问题的解决方案,学完今天的内容你就能掌握。但是真实工业环境中的真实情况往往更加复杂,为了让你能够持续学习,不断应对新的挑战,我还会带你领略工业级外部记忆系统的风采,学习一下阿里巴巴开源的 HA3 这个外部记忆引擎如何应用。

知识表征技术

首先,我们来聊聊知识表征,知识表征中常见的方法有很多,这里我列出了一些主流方法,其中很多内容我们之前已经学习过了。在这节课呢,我来带你梳理总结一下你所学过的这几个方法的区别,为了方便你查看,我特意梳理成了表格的形式。
首先是倒排索引,这是知识表征技术中最经典的技术之一,直接通过文档中的字面关键词,作为文档的特征表示。
接下来是嵌入表征,它是利用知识在高维空间的映射,来表示知识的语义信息。
最后是知识图谱,知识图谱则可以将知识的内容进一步结构化,并且通过图神经网络的方式,把知识转化为富含结构语义的高维特征信息。
这里需要你重点掌握的是,我们在外部记忆中所说的嵌入表征方法,和我们前面学过的 Work2Vec,BERT 以及各类的图神经网络算法等等没有区别。只不过 BERT 模型在计算两个句子的语义相似度时,需要将它们同时按下面的形式输入到模型。这种方式叫做 Cross-Encoder。
[CLS] sentence 1 [SEP] sentence 2 [SEP]
不过这种两两比对的推理开销,在真实的业务环境中几乎是不能接受的。因此,在外部记忆表征检索中用到的嵌入表征方法通常是指 sentence-bert(SBERT) 这类投影表征方法。SBERT 本质上也是通过我们学过的对比学习方法,用相似句子的表征向量之间的距离更近这个原则,来微调 BERT 模型。
我们可以看到,每种单一的表征方法都会有自己的局限性。所以在真实的应用场景中,为了发挥各类表征能力的优点,补足其他方法的不足,通常会使用多路召回的方式进行表征。
每种不同的表征方法也对应了不同的存储和检索策略,上述方法中倒排索引的存储逻辑我们已经很熟悉了,其中 ElasticSearch 是当仁不让的开源顶流,这里重点介绍一下向量检索引擎。

最大内积搜索 (MIPS)

顾名思义,向量索引是一个可以用于快速检索相似向量的存储引擎,其中最有名的当属早期工业界广泛使用的 Faiss,它早在 2017 年就已开源了。前面的课程我们也学习过,该引擎早已广泛应用在 AIRC 领域,并不是一项新技术。
虽然我们经常听说或者使用向量数据库,但大多数人并不知道其中的原理。不过从系统性学习技术的角度来说,理解原理,能够帮你理解这项技术的落地挑战,接下来我们就为你把它层层剥开,娓娓道来。
向量检索的根本目标是找到与查询向量最相似的 K 个向量(KNN),或者找到距离查询量小于某个距离阈值的所有向量(RNN)。但工业场景中数据量往往很大,如果采用精确最近邻算法,会导致检索效率太低。所以我们通常选择牺牲一定准确性来提高速度,采用近似最近邻算法(ANN)。
不同的检索算法都有自己的优缺点,选择合适的检索算法可以提高检索效率。
常用的检索算法包括后面这三类。
空间划分法:将数据空间划分为多个子空间,然后在子空间内进行检索。常见的空间划分方法有 KD-Tree、聚类检索等。
空间编码和转换法:将高维数据映射到低维空间进行检索。常见的空间编码和转换方法有 p-Stable LSH、PQ 等。
邻居图法:构建数据之间的邻居关系,然后在邻居图上进行检索。常见的邻居图法有 HNSW、SPTAG、ONNG 等。
下面我们以最常使用的 Faiss 为例聊一下实现思路。
在 Faiss 中就使用了 PQ 算法,PQ 算法是一种近似最近邻算法,它将高维数据映射到低维空间进行检索。PQ 算法的基本思想是将原始向量空间分解为多个低维向量空间的笛卡尔积,然后对每个低维向量空间进行量化。这样,每个原始向量就可以由多个低维量化编码表示。

向量检索数据库

理解了原理后,你是不是发现向量数据库没什么神秘的了,只不过是通过 ANN 的方法在检索数据库的一些相似向量而已。基于对这部分知识的理解,我们很容易推测出向量数据库在应用中的挑战有哪些。
其中一个挑战是超大规模索引的精度和效率问题。随着数据量的不断增加,在亿级、甚至十亿级时,向量索引的构建和检索成本也会随之增加,这可能会影响向量检索的性能和准确性。
另一个挑战是高维数据的处理问题。随着维度的增加,向量检索的计算复杂度也会呈指数级增长,这可能会导致查询效率下降、存储成本升高。
此外,向量检索还面临分布式数据分片构建和快速合并检索、流式索引的在线更新、多路召回等等挑战。
为了应对这些工业环境的真实挑战,就需要用到工业级的外部记忆引擎。我会和你一起探索,如何用阿里巴巴开源的 HA3 ,实现一个工业级知识系统。之所以使用 HA3 来带你学习,是为了让你深入学习其中外部记忆的存储和检索能力,它是阿里巴巴 AI 在线架构 AI·OS 的最重要的组成部分之一,而且现在它已经开源了,我们可以在自己的场景进行使用。

多路召回环境搭建

首先,我们要获取项目代码,通过 docker 启动 HA3 服务。注意,这里大部分人都是使用单机模式,所以和 Hadoop 的单机分布式实验一样,这里需要确保本机的免密 SSH 登录,具体方法你可以参考这篇文章 Why Do We Need Hadoop Passwordless SSH
$ git clone https://github.com/alibaba/havenask.git
$ cd havenask/docker/havenask
$ ./create_container.sh havenask registry.cn-hangzhou.aliyuncs.com/havenask/ha3_runtime:latest
之后,我们为实验准备一个单独的 conda 环境。
conda create --name havenask_llm python=3.10
conda activate havenask_llm
然后,我们进入 HA3 项目的 llm 文件夹,从名字可以看出来,阿里已经将自己兼容大语言模型的方法暴露了出来,我们按要求安装 python 依赖包即可。
$ pip install -r requirements.txt
接下来,我们来配置大语言模型相关的内容,这里我们以 ChatGLM-6B 为例。
LLM_NAME=ChatGLM
VECTOR_STORE=Havenask
HA_QRS_ADDRESS=127.0.0.1:45800
HA_TABLE_NAME=llm
# 模型服务地址, 可选
#CHATGLM_SERVER_ENDPOINT=http://127.0.0.1:8001/
#EMBEDDING_SERVER_ENDPOINT=http://127.0.0.1:8008/
# 开源模型名称,如果服务地址为空,则本地加载模型
EMBEDDING_MODEL=GanymedeNil/text2vec-large-chinese
CHATGLM_MODEL=THUDM/chatglm-6b
下面我们开始正式构建索引,这里就以 HA3 的技术文档为例,构建它的知识库的索引。
$ git clone https://github.com/alibaba/havenask.wiki.git
$ python -m script.embed_files -f havenask.wiki -o ./llm.data -i .git,english
extract ha3_home/havenask/llm/havenask.wiki/Hape工作目录与日志.md
extract ha3_home/havenask/llm/havenask.wiki/单字分析器.md
extract ha3_home/havenask/llm/havenask.wiki/简单分析器.md
...
之后,将索引放在 HA3 的指定文件夹下。
$ cp ./llm.data ../hape/example/data/llm.data
然后,通过脚本将数据写入引擎。我们先进入 hape 文件夹安装相关的依赖,注意这里使用的是 Python2.7 版本。
$ cd ../hape
$ python2.7 -m pip install -r requirements.txt
$ python2.7 example/common/case.py run --case llm
接下来回到 llm 文件夹,运行测试脚本,你可以试着让它回答你一些关于 HA3 文档的问题。
$ python api_demo.py
$ curl -H "Content-Type: application/json" http://127.0.0.1:8000/chat -d '{"query": "havenask是什么"}'
{
"success":true,
"result":"havenask 是一个分布式数据库管理系统,由阿里巴巴开发。它支持 SQL 查询语句,并提供了内置的 UDF(User Defined Function)功能,允许客户以插件形式开发自己的 UDF。havenask 可以用于存储、处理和分析大规模数据,具有高可用性、可扩展性和高性能的特点。havenask 可以通过分布式运维工具进行部署,支持在物理机上拉起分布式集群,也可以在云平台上使用云原生架构进行部署。",
"history":[
[
"已知信息:\n Content: NAME> havenask/ha3_runtime:latest\n```\n\n* 登陆容器\n```\n./<CONTAINER_NAME>/sshme\n```\n\n* 运行测试 \n启动运行时容器后,构建测试数据索引以及查询引擎的方法见example\n\n## 集群模式\n集群模式需要通过Havenask的分布式运维工具部署,详细信息请参考Havenask分布式运维工具\n# 编译代码\n\n## 编译环境\n* 请确保编译的机器内存在15G以上,mac编译时需调整Docker容器资源上限(包括CPU、Memory、Swap等),具体路径:Docker Desktop->setting->Resources。\n* 请确保cpu位8core以上,不然编译比较慢。\n\n## 获取开发镜像\n\n```\ndocker pull havenask/ha3_dev:latest\n```\n## 下载代码\n```\ncd ~\ngit clone [email protected]:alibaba/havenask.git\n```\n\n## 启动容器\n```\ncd ~/havenask/docker\n./\nContent: ### 简介\n\nhavenask SQL支持在查询语句中使用内置的UDF(User Defined Function),也允许客户以插件形式开发自己的UDF。\nContent: # 介绍\nHavenask PE tools,简称hape,是havenask的简易分布式运维工具。用户可以利用hape在单台或者多台物理机上拉起分布式havenask集群,并进行基础的运维操作。\n\n# 名词解释\n* domain\n * 一个havenask集群被称为一个domain,一个hape工具可以管理多个domain\n* config\n * hape config:关于havenask集群部署计划的配置文件,一个domain有一个hape config\n * biz config:havenask引擎本身加载的配置,分为离线配置offline config和在线配置online config\n* hape cmd\n * hape命令行工具,负责向domain daemon提交用户请求\n* hape domain daemon\n * 每当用户使用hape cmd创建一个domain,hape cmd都会在所在机器后台启动一个domain daemon进程用于专门管理该domain。所有hape cmd命令都会在后台被domain daemon异步处理\n* hape worker & worker daemon\n * hape worker\n \n\n 根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说不知道,不允许在答案中添加编造成分,答案请使用中文。\n 问题是:havenask是什么",
"havenask 是一个分布式数据库管理系统,由阿里巴巴开发。它支持 SQL 查询语句,并提供了内置的 UDF(User Defined Function)功能,允许客户以插件形式开发自己的 UDF。havenask 可以用于存储、处理和分析大规模数据,具有高可用性、可扩展性和高性能的特点。havenask 可以通过分布式运维工具进行部署,支持在物理机上拉起分布式集群,也可以在云平台上使用云原生架构进行部署。"
]
],
"source":["快速开始.md","UDF.md","Havenask分布式运维工具.md"],
"finished":true
}
$ python web_demo.py
当然,官方也提供了由 Gradio 搭建的简易网页,方便我们和它对话。
可以看出 HA3 正在拥抱大语言模型,它不但支持 chatglm 的配置,还支持 openAI API 的方式调用,你也可以实现自己的 adapter 来兼容更多的 LLM。

总结

我们来做个总结吧。
这节课我们串联了之前学过的向量表征技术,并且着重学习了 SBERT 和 MIPS 这些在 AIGC 领域出现频率更高的技术。
学到这里,你会意识到 AIRC(AI Recommended Content) 和 AIGC (AI Generated Content)天然的连贯性,以及向量数据库被作为外部知识库这种形式被大众广泛接受的原因。
这节课不是结束,而是一个开始,希望你能够深入探寻工业级 AIGC 记忆存储引擎的乐趣,HA3 的向量检索能力深度融合了达摩院的 Proxima 能力,除此之外它还支持了各类的检索能力,我在课后为你准备了不少习题,希望你能继续探索,认真完成。
下节课开始,我们将进入大模型训练部分的学习,敬请期待!

思考题

在学完这节课之后,你会发现目前所有的外部记忆使用方法都逃不出这个框架,而且大多数标榜自己能力的检索方法也还在使用极为基础的方法。
今天我给你留的思考题比较多,但建议你认真作答,积极参与思考有助于你更好地掌握大模型技术。第一道题目比较简单,后面三道更有挑战性。如果你暂时没有能力实现代码,也可以先聊聊你的思路。
结合我们课程里学过的知识,谈一下你对大语言模型外部记忆作用的理解。
结合 HA3 为你的知识库增加倒排索引的能力。
结合 HA3 为你的知识库增加多路召回的能力。
如何通过 HA3 来存储人工智能小镇智能体的记忆流?
恭喜完成我们第 24 次打卡学习,期待你在留言区和我交流互动。如果你觉得有收获,也欢迎你分享给你身边的朋友,邀 TA 一起讨论。

本文介绍了如何让AI系统成为全知超人的方法。首先讨论了知识表征技术,包括倒排索引、嵌入表征和知识图谱等方法。重点介绍了嵌入表征方法的应用,以及向量检索引擎的最大内积搜索(MIPS)原理和常用检索算法。接着讨论了向量检索数据库的挑战,包括超大规模索引的精度和效率问题,以及高维数据的处理问题。最后,介绍了如何搭建多路召回环境,使用阿里巴巴开源的外部记忆引擎进行实验。通过配置环境和安装依赖包,读者可以学习如何应用外部记忆引擎来构建工业级知识系统。 文章还提到了HA3正在拥抱大语言模型,支持chatglm的配置,以及openAI API的方式调用。此外,还介绍了通过HA3来存储人工智能小镇智能体的记忆流。整体来看,本文深入探讨了向量表征技术在AI领域的应用,以及外部记忆引擎在构建工业级知识系统中的重要作用。读者可以通过本文了解到最新的技术趋势和应用场景,为进一步深入研究提供了有益的参考。

分享给需要的人,Ta购买本课程,你将得18
生成海报并分享
2023-10-13

赞 5

提建议

上一篇
23|提示语工程(五):构建你自己的西部世界——AI小镇搭建实战
下一篇
25|模型工程(一):如何让你的训练数据无中生有?
unpreview
 写留言

全部留言(1)

  • 最新
  • 精选
  • 学习的一天天
    2024-05-31 来自上海
    cp ./llm.data ../hape/example/data/llm.data 老师,这一段会报错,没有这个目录,这个目录是需要自己创建的吗,还是最新的拉的项目里面结构变了