搜索是内容库的隐形引擎,而 Embedding 把它从「关键词匹配」升级成「语义匹配」:用户输入一个问题,应用直接返回视频里讲到答案的那个时间点。这篇以视频课程库为例,把语义搜索应用从索引构建到 Azure 资源准备完整走一遍。
语义搜索和关键词搜索差在哪
语义搜索用的是查询里词语的「含义」:搜「我的 dream car」,它理解为你想买理想中的车,而不是字面上「梦见汽车」;关键词搜索则会老老实实去匹配「梦」和「车」两个字面词,经常返回不相关的内容 [1]。这就是用 Embedding 的根本理由:用户输入的是问题不是关键词,语义搜索回答的是用户真正想问的东西。
具体目标是:学生输入「What are Jupyter Notebooks?」或「What is Azure ML」,应用返回相关的 YouTube 视频——而且返回的链接里带时间戳,点开直接跳到视频中讲答案的位置 [1]。
文本嵌入是什么
文本嵌入(text embeddings)是自然语言处理里的一种文本表示技术:把文本变成语义化的数值表示,机器比对数字远比比对原始文字容易 [1]。把「Today we are going to learn about Azure Machine Learning.」传给 OpenAI 的 Embedding API,会返回一个 1536 个数字组成的向量,每个数字代表文本的一个不同侧面 [1]:
[-0.006655829958617687, 0.0026128944009542465, 0.008792596869170666, -0.02446001023054123, -0.008540431968867779, 0.022071078419685364, -0.010703742504119873, 0.003311325330287218, -0.011632772162556648, -0.02187200076878071, ...]建索引:五步流水线
视频库的嵌入索引由一组 Python 脚本按五步建成 [1]:
- 下载播放列表里每个视频的字幕文本;
- 用 OpenAI Functions 从字幕开头 3 分钟里提取主讲人姓名;
- 把字幕切成 3 分钟的文本段,相邻段之间保留约 20 个词的重叠——这样嵌入不会被截断,搜索上下文也更完整;
- 把每段传给 OpenAI Chat API,总结成 60 词;
- 把每段传给 OpenAI Embedding API,将文本段连同 1536 维向量一起存进名为
embedding_index_3m.json的索引文件。
小规模内容库,索引就是一个 JSON 文件,加载进 Pandas DataFrame 就能用;生产环境则应该放进向量数据库,比如 Azure Cognitive Search、Redis、Pinecone、Weaviate [1]。第 3 步的重叠设计值得留意:段落边界切在一段解释中间,产生的嵌入会「四不像」,20 词重叠正是为了防止这种情况 [1]。
找答案:余弦相似度
所有段落都有向量之后,搜索就变成了最近邻问题。余弦相似度(cosine similarity)衡量两个向量的相似程度:先把用户问题用 Embedding API 向量化,再和索引里每个向量算余弦相似度,按分数排序,得分最高的文本段就是和问题最相似的 [1]。
为什么不用普通距离?余弦相似度度量的是多维空间里两个向量夹角的余弦值:两份文档可能因为长短悬殊、按欧氏距离隔得很远,但只要谈的是同一件事,夹角依然很小、相似度依然很高 [1]。
备好 Azure 资源
应用本体在 Windows 11、macOS、Ubuntu 22.04 上用 Python 3.10 以上即可运行 [1]。嵌入模型跑在 Azure OpenAI 上,在 Azure 门户的 Cloud Shell 里开通。先建资源组 [1]:
az group create --name semantic-video-search --location eastus再建 Azure OpenAI 服务资源 [1]:
az cognitiveservices account create --name semantic-video-openai --resource-group semantic-video-search \
--location eastus --kind OpenAI --sku s0取应用要用的接入点和密钥 [1]:
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最后部署嵌入模型 [1]:
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"之后应用的循环很短:拿用户问题、用部署好的模型做嵌入、对索引算余弦相似度、返回得分最高的视频和时间戳。示例的笔记本运行时会弹出输入框让用户键入查询 [1]。
本文改编自 Microsoft 开源课程《Generative AI for Beginners》第 8 课[1],原文以 MIT 许可证发布。
来源
- 1Building a Search Application | Generative AI for BeginnersMicrosoft generative-ai-for-beginners (MIT)
引用本页: 用 Embedding 做语义搜索应用. TellWorld, https://www.tellworld.net/zh/practice/practice-search-app-embeddings. 更新于 2026-11-14