发布于 2026-01-06 5 阅读
0

🔥嵌入:人工智能和搜索背后的隐藏力量

🔥嵌入:人工智能和搜索背后的隐藏力量

开发者们好👋

你有没有想过Spotify是如何知道你下一首会喜欢的歌的,或者谷歌是如何瞬间找到让你感觉很对的答案的?即使这些答案可能并不包含你输入的确切短语?🤔

当你搜索信息、获取产品推荐或向人工智能助手提问时,后台会发生一些看不见的事情。这不仅仅是大型语言模型或庞大的推荐引擎,而是一种规模较小但极其重要的东西,叫做:词嵌入

_Embeddings_词嵌入是机器表示意义的方式。它们将词语、句子、图像甚至代码转换成数字(向量),这些数字能够捕捉事物之间的关系和相似性。如果没有词嵌入,我们今天看到的绝大多数智能搜索、推荐和问答系统都无法运行。

本文将深入探讨嵌入:

  • 它们是什么
  • 他们如何衡量相似性
  • 嵌入模型的工作原理(以Qodo-Embed-1为例)
  • 他们的申请
  • 当今最佳嵌入模型

什么是嵌入?

嵌入是输入数据的数值向量表示。它们将高维、复杂的事物(如单词、句子、图像甚至源代码)转换为稠密的数字向量

核心思想:词嵌入能够捕捉数据点之间的语义含义关系。在这个向量空间中,相似的项彼此靠近,而不相似的项则彼此远离。这使得算法更容易处理推荐系统中诸如词语、图像或音频等复杂数据。

想象一下,你正试图解释词语之间的关系。

  • 苹果橙子都是水果。
  • 都是宠物。
  • 苹果其实并不搭调。😑

在人脑中,我们能够凭直觉理解这些联系。嵌入技术通过将这些联系映射到数学空间,使计算机也能做到这一点。

例如,嵌入可能如下所示:

  • 苹果:[0.21, -0.87, 0.45, …]
  • 橙色:[0.20, -0.88, 0.50, …]
  • :[0.91, 0.10, -0.34, …]

如果我们尝试为上述数据绘制二维图:

水果 vs 宠物


水果 vs 宠物

在这里,你可以注意到苹果橙子的向量彼此更接近,而苹果狗的向量则相距甚远。这就是词嵌入的魔力所在,它捕捉的是含义,而不仅仅是原始文本。

衡量相似性

由于嵌入只是一个向量(浮点数列表),我们可以测量向量之间的距离或角度来确定两个项目之间的关联程度:

  • 距离越近,相似度越高
  • 距离越大,相似度越低

我们可以使用简单的数学运算快速衡量两段文本的相似度,而无需考虑它们的原始长度或结构。一些常见的相似度指标包括:

  • 余弦相似度:衡量两个向量之间夹角的余弦值。
  • 欧氏距离:测量两点之间的直线距离。
  • 点积:衡量一个向量在另一个向量上的投影。相似性度量的选择应基于模型。

👉 在实践中,余弦相似度是最广泛使用的方法。

例如:苹果 vs 橙子 🍏🍊

import numpy as np

def cosine_similarity(vec1, vec2):
    dot_product = np.dot(vec1, vec2)
    norm_vec1 = np.linalg.norm(vec1)
    norm_vec2 = np.linalg.norm(vec2)
    return dot_product / (norm_vec1 * norm_vec2)

similarity = cosine_similarity([ 0.12, -0.03,  0.45], [ 0.11, -0.04,  0.47])
print("Cosine Similarity:", similarity)
Enter fullscreen mode Exit fullscreen mode
Cosine Similarity: 0.9993630530517253
Enter fullscreen mode Exit fullscreen mode

例如:苹果 vs 狗🍏🐶

import numpy as np

def cosine_similarity(vec1, vec2):
    dot_product = np.dot(vec1, vec2)
    norm_vec1 = np.linalg.norm(vec1)
    norm_vec2 = np.linalg.norm(vec2)
    return dot_product / (norm_vec1 * norm_vec2)

similarity = cosine_similarity([ 0.12, -0.03,  0.45], [ 0.88,  0.20, -0.33])
print("Cosine Similarity:", similarity)
Enter fullscreen mode Exit fullscreen mode
Cosine Similarity: -0.10904568968509583
Enter fullscreen mode Exit fullscreen mode

从以上例子我们可以看出:

  • 如果两个向量指向几乎相同的方向,它们就非常相似(接近1)。
  • 如果它们指向相反的方向,它们就非常不同(接近-1)。

嵌入模型是如何工作的?

嵌入模型


鸣谢:Qdrant

到目前为止,我们已经看到嵌入只是向量,但是我们如何才能将原始文本转换为数字呢

让我们把它分解成几个简单的步骤👇

1. 分词

输入的文本会被分割成称为词元的更小片段。这些词元可以是单词,甚至是单词的一部分。

例子:

  • 文本:"My name is Kiran"
  • 代币:["My", "name", "is", "Kiran"]

2. 使用神经网络进行编码

这些词元会通过神经网络编码器(通常是Transformer模型)。编码器会学习上下文含义。

例如:

河岸银行中的“bank”一词会有不同的词嵌入,因为该模型使用周围的上下文来理解含义。

💡 你可以从这篇HuggingFace 指南中了解更多关于变形金刚的信息

3. 向量输出

最后,该模型输出一个固定长度的向量(例如 768 维或 1536 维)。这便成为我们可以用于相似性分析、聚类或搜索的嵌入向量。

隆重推出 Qodo-Embed-1-1.5B 🚀

现在我们知道了这个过程,让我们来看一个真实的嵌入模型:Qodo-Embed-01

Qodo-Embed-1-1.5B 是一个轻量级(1.5B 参数)的先进代码嵌入模型,专为软件开发领域的检索任务而设计。

它针对自然语言到代码代码到代码的检索进行了优化,因此非常适合开发人员使用。

核心能力:

🔍代码搜索:支持在大型代码库中高效搜索

🧠检索增强生成 (RAG):通过上下文理解增强代码生成

🤓语义代码理解:捕捉代码片段之间复杂的关联关系

🌐多语言支持:可处理来自 9 种主流编程语言的代码。(Python、C++、C#、Go、Java、JavaScript、PHP、Ruby、Typescript)

📈高维嵌入:生成丰富的 1536 维表示

如果您有兴趣了解更多相关信息,可以查看这篇博客。

Qodo-Embed-1 示例

您可以通过 Hugging Face TransformersSentenceTransformers使用该模型。

我将使用sentence-transformers

# Install required libraries
pip install sentence-transformers
Enter fullscreen mode Exit fullscreen mode

以下是一个衡量句子相似度的简单示例:

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# Load the model
model = SentenceTransformer("Qodo/Qodo-Embed-1-1.5B")

# Source sentence and comparison list
source_sentence = "That is a very happy person"
sentences_to_compare = [
    "That is a happy person",
    "That is a happy dog",
    "Today is a sunny day",
    "The man is joyful and smiling"
]

# Encode source and comparison sentences
source_embedding = model.encode([source_sentence])
comparison_embeddings = model.encode(sentences_to_compare)

# Compute cosine similarity (returns a 2D array)
similarity_scores = cosine_similarity(source_embedding, comparison_embeddings)[0]

# Find most similar sentence
most_similar_idx = int(np.argmax(similarity_scores))
most_similar_sentence = sentences_to_compare[most_similar_idx]
similarity_score = similarity_scores[most_similar_idx]

# Print results
print(f"Source Sentence: \"{source_sentence}\"")
print(f"Most Similar Sentence: \"{most_similar_sentence}\"")
print(f"Similarity Score: {similarity_score:.4f}")
Enter fullscreen mode Exit fullscreen mode

说明

  • 将源句子与多个候选句子进行比较。
  • 该模型为所有句子生成词向量。
  • 我们计算余弦相似度来找到最接近的匹配项。

输出:

Source Sentence: "That is a very happy person"
Most Similar Sentence: "That is a happy person"
Similarity Score: 0.9795
Enter fullscreen mode Exit fullscreen mode

这表明词嵌入如何能够捕捉到超越字面意义的语义含义。

嵌入的应用

嵌入的应用


鸣谢:Qdrant

嵌入并非只是抽象的数学概念,它为我们日常使用的实际人工智能应用提供动力。让我们通过代码示例来了解一些关键的应用场景。

1. 语义搜索🔍

词嵌入技术让我们能够通过语义进行搜索,而不是通过关键词匹配。

from sklearn.neighbors import NearestNeighbors
import numpy as np
from sentence_transformers import SentenceTransformer

# Download from the Hub
model = SentenceTransformer("Qodo/Qodo-Embed-1-1.5B")

docs = [
    "New York pizza is thin and crispy.",
    "I love making homemade Italian pasta.",
    "Best coffee shops in Brooklyn.",
    "Top-rated pizza restaurants in Manhattan.",
    "A guide to Italian restaurants in NYC."
]

# Embed docs
doc_embeds = model.encode(docs, normalize_embeddings=True)
index = NearestNeighbors(n_neighbors=2, metric="cosine").fit(doc_embeds)

query = "Where can I eat pizza in New York?"
qvec = model.encode([query], normalize_embeddings=True)

distances, indices = index.kneighbors(qvec)

print("Query:", query, "\n")
for i, d in zip(indices[0], distances[0]):
    print(f"{docs[i]} (distance={d:.3f})")
Enter fullscreen mode Exit fullscreen mode

输出:

Query: Where can I eat pizza in New York?
 Top-rated pizza restaurants in Manhattan. (distance=0.245)
 A guide to Italian restaurants in NYC. (distance=0.303)
Enter fullscreen mode Exit fullscreen mode

👉嵌入技术让模型能够理解意图,而不是依赖像披萨纽约这样的关键词。

2. 推荐 🎵🍿
Spotify、Netflix 和 YouTube 等平台使用嵌入功能来推荐与你喜欢的内容相似的项目。

例如:推荐电影:

from sklearn.neighbors import NearestNeighbors
from sentence_transformers import SentenceTransformer

# Download from the Hub
model = SentenceTransformer("Qodo/Qodo-Embed-1-1.5B")

movies = [
    "The Matrix - SciFi action with AI and virtual reality.",
    "Inception - Dream within dream, sci-fi thriller.",
    "The Notebook - Romantic love story.",
    "Titanic - Tragic romance on a ship.",
    "Avengers - Superheroes saving the world."
]

embs = model.encode(movies, normalize_embeddings=True)
index = NearestNeighbors(n_neighbors=2, metric="cosine").fit(embs)

query = "I like science fiction movies about AI"
qvec = model.encode([query], normalize_embeddings=True)

distances, indices = index.kneighbors(qvec)
print("Query:", query, "\n")
for i, d in zip(indices[0], distances[0]):
    print(f"{movies[i]} (distance={d:.3f})")
Enter fullscreen mode Exit fullscreen mode

输出:

Query: I like science fiction movies about AI
 The Matrix - SciFi action with AI and virtual reality. (distance=0.205)
 Inception - Dream within dream, sci-fi thriller. (distance=0.245)
Enter fullscreen mode Exit fullscreen mode

👉 注意该模型如何推荐与查询语义接近的电影。

3. 聚类和主题发现 📊
嵌入可以自动对相关项目进行分组。

from sklearn.cluster import KMeans
from sentence_transformers import SentenceTransformer

# Download from the Hub
model = SentenceTransformer("Qodo/Qodo-Embed-1-1.5B")

sentences = [
    "I love football",
    "Basketball is exciting",
    "Tennis players train hard",
    "Apples and oranges are fruits",
    "Bananas are tasty",
    "Strawberries are sweet"
]

X = model.encode(sentences, normalize_embeddings=True)
kmeans = KMeans(n_clusters=2, random_state=42, n_init=10).fit(X)

for i, label in enumerate(kmeans.labels_):
    print(f"{sentences[i]} → Cluster {label}")
Enter fullscreen mode Exit fullscreen mode

输出:

I love football  Cluster 1
Basketball is exciting  Cluster 1
Tennis players train hard  Cluster 1
Apples and oranges are fruits  Cluster 0
Bananas are tasty  Cluster 0
Strawberries are sweet  Cluster 0
Enter fullscreen mode Exit fullscreen mode

👉 该模型无需我们手动设置,就能自动将运动与水果归为一类!

4. 去重/相似度检查 ✅
检测两个句子是否意思相同。

from sentence_transformers import SentenceTransformer

# Download from the Hub
model = SentenceTransformer("Qodo/Qodo-Embed-1-1.5B")

s1 = "AI is transforming the world."
s2 = "Artificial intelligence is changing our world."
s3 = "Bananas are yellow."

vecs = model.encode([s1, s2, s3], normalize_embeddings=True)

def cosine(v1, v2): return float(np.dot(v1, v2))

print("s1 vs s2:", cosine(vecs[0], vecs[1]))  # high similarity
print("s1 vs s3:", cosine(vecs[0], vecs[2]))  # low similarity
Enter fullscreen mode Exit fullscreen mode

输出:

s1 vs s2: 0.8994590044021606
s1 vs s3: 0.471836119890213
Enter fullscreen mode Exit fullscreen mode

👉 这就是嵌入技术如何帮助进行重复检测或抄袭检查的。

5. RAG(检索增强生成)🔗
嵌入为现代 RAG 系统提供支持,其中模型在生成答案之前检索事实。

docs = [
    "Python is great for data science.",
    "Transformers are neural networks for sequences.",
    "Qodo-Embed-1 is a model for embeddings.",
]

query = "Which model can create embeddings?"

# Embed docs + query
doc_vecs = model.encode(docs, normalize_embeddings=True)
query_vec = model.encode([query], normalize_embeddings=True)

scores = np.dot(doc_vecs, query_vec.T).flatten()
best_doc = docs[scores.argmax()]

print("Query:", query)
print("Retrieved:", best_doc)
Enter fullscreen mode Exit fullscreen mode

输出:

Query: Which model can create embeddings?
Retrieved: Qodo-Embed-1 is a model for embeddings.
Enter fullscreen mode Exit fullscreen mode

👉 这是当今许多聊天机器人和人工智能助手的基础。

当今最佳嵌入模型(2025)

如果你正在寻找适合下一个项目的模型,我在这里整理了一份清单:

嵌入看起来可能只是一些数字,但它们是现代人工智能的真正功臣,为从搜索引擎和推荐系统到聊天机器人和代码助手等一切应用提供动力。

就这样。🙏

感谢您阅读至此。如果您觉得这篇文章有用,请点赞并分享。也许其他人也会觉得它有用。💖

您可以通过XGitHubLinkedIn与我联系。

文章来源:https://dev.to/dev_kiran/embeddings-the-hidden-power-behind-ai-search-21eb