原文出处:Building a Search Application 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。
(译文按资料库规范不保留图片;原文开头是一张课程横幅图,点开为本课视频。)
大语言模型(LLM)的本事超出聊天机器人和文本生成这两样。用嵌入(embedding)还能搭建搜索应用。嵌入是数据的数字表示,也叫向量(vector),可以拿来做数据的语义搜索。
这一课我们要给一家教育创业公司做一个搜索应用。这家公司是非营利组织,为发展中国家的学生提供免费教育。手上有大量 YouTube 视频,学生靠它们学 AI。现在公司想做一个搜索应用:学生输入一个问题,就能搜到对应的 YouTube 视频。
举个例子,学生输入"What are Jupyter Notebooks?"(Jupyter Notebook 是什么?)或者"What is Azure ML"(Azure ML 是什么),搜索应用会返回一批与问题相关的 YouTube 视频。更妙的是,它还会返回一个链接,直接指到视频里给出答案的那个位置。
引言
本课涵盖:
- 语义搜索与关键词搜索的区别。
- 什么是文本嵌入。
- 如何创建文本嵌入索引。
- 如何检索文本嵌入索引。
学习目标
学完本课,你将能够:
- 分清语义搜索和关键词搜索。
- 解释什么是文本嵌入。
- 用嵌入做一个搜数据的应用。
为什么要做搜索应用?
动手做搜索应用,能帮你理解怎么用嵌入去搜数据,也能学会怎么做一个让学生快速找到信息的应用。
本课自带一份嵌入索引(Embedding Index),内容是微软 AI Show YouTube 频道视频的字幕(transcript)。AI Show 是一个教你 AI 和机器学习的 YouTube 频道。这份索引收录了截至 2023 年 10 月的每一期视频字幕的嵌入。你会用它给这家创业公司搭一个搜索应用,应用会返回一个链接,指向视频中给出答案的位置,学生借此能很快找到需要的信息。
下面是一个语义查询的例子,问题是"can you use rstudio with azure ml?"(Azure ML 能配 RStudio 用吗?)。可以打开它返回的 YouTube 链接验证一下:链接里带着时间戳,直接跳到视频里回答这个问题的位置。原文此处有一张截图,展示的就是这条查询的返回结果。
什么是语义搜索?
你可能会问,语义搜索(semantic search)是什么?它是一种搜索技术,看的是查询里词语的语义,也就是含义,再根据含义返回相关结果。
举个例子。你想买车,搜"my dream car"(我梦想的车)。语义搜索明白你不是在"梦见"(dreaming)一辆车,你想要的是买到那辆"理想的"(ideal)车。它读懂了你的意图,返回相关结果。换作关键词搜索(keyword search),就会照着"梦"和"车"字面去匹配,经常返回不相干的内容。
什么是文本嵌入?
文本嵌入(text embeddings)是自然语言处理里的一种文本表示技术。文本嵌入是文本的语义化数字表示,用途是把数据变成机器容易理解的样子。生成文本嵌入的模型有很多,这一课我们聚焦 OpenAI 的嵌入模型。
看个例子。假设 AI Show 频道某期视频的字幕里有这么一句话:
text
Today we are going to learn about Azure Machine Learning.
把这句话传给 OpenAI Embedding API,它会返回一个由 1536 个数字组成的嵌入,也就是一条向量。向量里每个数字对应文本的不同侧面。为了简洁,下面只列出向量的前 10 个数字:
python
[-0.006655829958617687, 0.0026128944009542465, 0.008792596869170666, -0.02446001023054123, -0.008540431968867779, 0.022071078419685364, -0.010703742504119873, 0.003311325330287218, -0.011632772162556648, -0.02187200076878071, ...]
嵌入索引是怎么做出来的?
本课的嵌入索引是用一串 Python 脚本做出来的。脚本和使用说明放在本课 scripts 文件夹的 README 里。完成本课不需要跑这些脚本,索引已经给你备好了。
脚本做了下面这些事:
- 把 AI Show 歌单里每个 YouTube 视频的字幕下载下来。
- 借助 OpenAI Functions,尝试从每个视频字幕的前 3 分钟里提取讲者的名字。每个视频的讲者名字都存进名为
embedding_index_3m.json的嵌入索引里。 - 把字幕文本切成3 分钟一段。每段往后多带大约 20 个词,与下一段重叠,保证段落的嵌入不会被生生截断,也给搜索提供更完整的上下文。
- 每段文本再传给 OpenAI Chat API,压缩成一份 60 词的摘要。摘要同样存进
embedding_index_3m.json。 - 最后,把段落文本传给 OpenAI Embedding API。API 返回一条由 1536 个数字组成的向量,代表这段文本的语义。段落连同它的嵌入向量一起存进嵌入索引
embedding_index_3m.json。
向量数据库
为了教学方便,这份嵌入索引存在一个名为 embedding_index_3m.json 的 JSON 文件里,加载进 Pandas DataFrame。放到生产环境,嵌入索引通常会存进向量数据库(vector database),比如 Azure Cognitive Search、Redis、Pinecone、Weaviate 等等。
理解余弦相似度
文本嵌入学完了,下一步是学会用它搜数据,重点是怎么用余弦相似度(cosine similarity)找出与查询最接近的嵌入。
什么是余弦相似度?
余弦相似度度量两条向量之间的相似程度,你也常听到它被叫作最近邻搜索(nearest neighbor search)。要做余弦相似度搜索,先用 OpenAI Embedding API 把查询文本"向量化"(vectorize),再计算查询向量与嵌入索引里每一条向量的余弦相似度。记住,嵌入索引中每个 YouTube 字幕段落都有一条向量。最后按余弦相似度排序,得分最高的段落就是与查询最相似的。
从数学上说,余弦相似度度量的是两条向量投影到高维空间后夹角的余弦值。这个度量好在:两份文档可能因为篇幅悬殊而在欧氏距离(Euclidean distance)上相距很远,但它们之间的夹角仍然可以很小,余弦相似度照样很高。余弦相似度的公式详见 Cosine similarity。
搭建你的第一个搜索应用
接下来实际动手,用嵌入搭一个搜索应用。学生输入问题搜视频,应用返回与问题相关的视频列表,同时给出直达视频中答案位置的链接。
这套方案在 Windows 11、macOS 和 Ubuntu 22.04 上构建并测试过,用的是 Python 3.10 或更新版本。Python 可以从 python.org 下载。
动手作业:做一个搜索应用,让学生用起来
这课开头介绍了我们的创业公司。现在该让学生自己动手,为他们的课业做一个搜索应用了。
作业里你要创建做这个搜索应用要用的 Azure OpenAI 服务,也就是下面这几项。完成作业需要有一个 Azure 订阅。
启动 Azure Cloud Shell
- 登录 Azure 门户。
- 点击门户右上角的 Cloud Shell 图标。
- 环境类型选 Bash。
创建资源组
按本说明,我们用的是位于 East US、名为 "semantic-video-search" 的资源组。 资源组的名字可以改,但换资源所在的区域时, 要先查模型可用表。
shell
az group create --name semantic-video-search --location eastus
创建 Azure OpenAI Service 资源
在 Azure Cloud Shell 里运行下面的命令,创建一个 Azure OpenAI Service 资源。
shell
az cognitiveservices account create --name semantic-video-openai --resource-group semantic-video-search \
--location eastus --kind OpenAI --sku s0
获取本应用要用的 endpoint 和密钥
在 Azure Cloud Shell 里运行下面的命令,取出这个 Azure OpenAI Service 资源的 endpoint 和密钥。
shell
az cognitiveservices account show --name semantic-video-openai \
--resource-group semantic-video-search | jq -r .properties.endpoint
az cognitiveservices account keys list --name semantic-video-openai \
--resource-group semantic-video-search | jq -r .key1
部署 OpenAI 嵌入模型
在 Azure Cloud Shell 里运行下面的命令,部署 OpenAI 嵌入模型。
shell
az cognitiveservices account deployment create \
--name semantic-video-openai \
--resource-group semantic-video-search \
--deployment-name text-embedding-ada-002 \
--model-name text-embedding-ada-002 \
--model-version "2" \
--model-format OpenAI \
--sku-capacity 100 --sku-name "Standard"
参考答案
在 GitHub Codespaces 里打开参考笔记本,按 Jupyter Notebook 里的步骤操作。
运行笔记本时,它会提示你输入一个查询,输入框就是这个样子。原文此处有一张截图,画的正是这个等待输入查询的输入框。
继续前行
学完本课,可以看看微软的生成式 AI 学习资源合集,继续补充生成式 AI 知识。
接下来去第 9 课,学构建图像生成应用!