文本向量化是指将自然语言文本转换为数值向量的过程,使其能够被机器学习模型或向量数据库理解和处理。向量化后的文本可以用于相似度检索、聚类、分类、RAG 问答等多种NLP任务。

主要原理

  • 将文本编码为高维向量:每个文本被表示为一个固定长度的数值数组(如 384 维、768 维等)。
  • 语义相近的文本向量距离更近:向量空间中的距离(如余弦相似度)可以衡量文本间的语义相关性。

常见文本向量化方法

  1. 词袋模型(Bag of Words, TF-IDF)
    早期方法,按词频统计,无法表达语义。
  2. Word2Vec、GloVe
    将单词映射为向量,句子/文本向量通常用词向量平均。
  3. 句向量/文本向量模型
    • BERT、Sentence-BERT、all-MiniLM-L6-v2 等预训练模型,能直接输出句子或段落的语义向量。
    • 适合检索、问答、RAG等场景。

案例

例1:Embedding

Embedding(嵌入/向量表示) 是指将离散的对象(如单词、句子、图片等)映射为连续的高维向量,使其能够被机器学习模型理解和处理。在自然语言处理中,embedding 通常指“文本向量化”,即把文本(单词、句子、段落)转为数值向量。

import os
from openai import OpenAI

# 初始化混元 embedding llm
client = OpenAI(
    api_key=os.environ.get("HUNYUAN_API_KEY"),  # 从环境变量获取API密钥
    base_url="https://api.hunyuan.cloud.tencent.com/v1"  # 指定混元API地址
)

# 需要进行向量化的文本列表
texts = [
    "你好,我是混元助手,很高兴认识你",
    "我是一个AI助手,很高兴认识你",
    "你好,我叫Alex",
    "请给我一首1000字的诗歌",
    "你知道我叫什么吗?"
]

# 调用混元 embedding API 获取文本向量
response = client.embeddings.create(
    model="hunyuan-embedding",  # 指定使用混元 embedding 模型
    input=texts
)

# 输出嵌入向量的数量
print(f"Number of embeddings: {len(response.data)}")
# 输出每个嵌入向量的维度
print(f"Embedding dimension: {len(response.data[0].embedding)}")

结果:

Number of embeddings: 5
Embedding dimension: 1024

例2:将文本转换为向量表示

# 定义查询问题:询问对话中提到的名字
query = "这段对话中提到了什么名字?"

# 使用混元大模型API将查询文本转换为向量表示
query_response = client.embeddings.create(
    model="hunyuan-embedding",  # 使用混元embedding模型
    input=[query]  # 输入查询文本列表
)

# 提取生成的向量表示
embedded_query = query_response.data[0].embedding

# 显示向量的前5个维度值,用于验证向量化结果
embedded_query[:5]

结果:

[0.0260467529296875,
 -0.036865234375,
 0.029022216796875,
 -0.0191802978515625,
 -0.02117919921875]

例3:嵌入向量缓存

为每个文本生成 embedding 向量时,优先查找本地缓存,只有没有缓存时才调用腾讯混元 embedding API,并将结果写入本地缓存文件。这样可以大幅减少API调用次数,提高效率,适合大批量文本向量化和重复检索场景。

#嵌入向量缓存

import os
import json
from openai import OpenAI

# 初始化混元 embedding client
client = OpenAI(
    api_key=os.environ.get("HUNYUAN_API_KEY"),
    base_url="https://api.hunyuan.cloud.tencent.com/v1"
)

# 缓存文件夹
cache_dir = "./cache/"
os.makedirs(cache_dir, exist_ok=True)

def get_cached_embedding(text, model="hunyuan-embedding"):
    # 用文本内容和模型名生成唯一缓存文件名
    cache_key = f"{model}_{hash(text)}.json"
    cache_path = os.path.join(cache_dir, cache_key)
    # 如果有缓存,直接读取
    if os.path.exists(cache_path):
        with open(cache_path, "r") as f:
            return json.load(f)
    # 没有缓存,调用API
    response = client.embeddings.create(
        model=model,
        input=[text]
    )
    embedding = response.data[0].embedding
    # 写入缓存
    with open(cache_path, "w") as f:
        json.dump(embedding, f)
    return embedding

# 示例:批量获取嵌入并缓存
texts = [
    "你好,我是混元助手,很高兴认识你",
    "我是一个AI助手,很高兴认识你",
    "你好,我叫Alex",
    "请给我一首1000字的诗歌",
    "你知道我叫什么吗?"
]

embeddings = [get_cached_embedding(text) for text in texts]
# 查看缓存文件
print(os.listdir(cache_dir))

结果:

['hunyuan-embedding_-7001292377929613164.json', 'hunyuan-embedding_4786895752177458815.json', 'hunyuan-embedding_-3576815256225966858.json', 'hunyuan-embedding_3759464812231047736.json', 'hunyuan-embedding_6821016714426568893.json', 'hunyuan-embedding_1365236777839348857.json', 'hunyuan-embedding_4485805353698170922.json', 'hunyuan-embedding_-4439296814109638924.json', 'hunyuan-embedding_9178553820733704574.json', 'hunyuan-embedding_2232310775832201920.json']

例4:加载文档,切分文档,将切分文档向量化并存储在缓存中

# 加载文档,切分文档,将切分文档向量化并存储在缓存中

from openai import OpenAI  # 导入OpenAI客户端,用于调用腾讯混元API
from langchain.document_loaders import TextLoader  # 导入文本加载器
from langchain.text_splitter import CharacterTextSplitter  # 导入字符分割器
import os  # 导入os模块,用于环境变量和路径操作

# 加载原始文档
raw_documents = TextLoader("letter.txt").load()
# 按字符数切分文档,每块400字符,无重叠
text_splitter = CharacterTextSplitter(chunk_size=400, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)

# 定义腾讯混元嵌入类
class HunyuanEmbeddings:
    def __init__(self, api_key, api_base, model="hunyuan-embedding"):
        # 初始化OpenAI客户端,指定API密钥和API地址
        self.client = OpenAI(api_key=api_key, base_url=api_base)
        self.model = model

    def embed_documents(self, texts):
        # 批量获取文本嵌入
        response = self.client.embeddings.create(
            model=self.model,
            input=texts
        )
        # 返回所有文本的嵌入向量
        return [item.embedding for item in response.data]

# 实例化嵌入对象,使用环境变量中的API密钥
embedding = HunyuanEmbeddings(
    api_key=os.environ.get("HUNYUAN_API_KEY"),
    api_base="https://api.hunyuan.cloud.tencent.com/v1"
)

from langchain.vectorstores import FAISS  # 导入FAISS向量数据库

# 计时:将文档向量化并存入FAISS数据库
%timeit -r 1 -n 1 db=FAISS.from_documents(documents, embedding)

结果:

587 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)

这段代码实现了一个完整的“文档加载→分割→向量化→存入向量数据库(FAISS)”流程,适用于RAG等知识检索场景。

关于向量数据库

向量数据库是一种专门用于存储、管理和检索高维向量(embedding)的数据库。它是现代AI应用(如语义检索、RAG问答、推荐系统等)中的核心基础设施之一。

  1. 为什么需要向量数据库?
    • 传统数据库不适合高维向量检索:传统关系型数据库擅长结构化数据的精确查找,但不适合高维向量的相似度搜索。
    • 支持大规模语义检索:向量数据库能高效地在数百万甚至数十亿条向量中,找到与查询向量“最相似”的内容(如TopK最近邻)。
    • 适配AI场景:如文本、图片、音频、视频等内容的embedding检索,RAG、推荐、聚类等。
  2. 工作原理
    • 存储:将每个文本、图片等对象的embedding向量存入数据库,并关联原始内容或元数据。
    • 检索:用户输入查询内容,先转为向量,再用“向量相似度”(如余弦相似度、欧氏距离等)在数据库中查找最相近的向量,返回对应的原始内容。
  3. 常见向量数据库
    • FAISS(Facebook AI Similarity Search):本地库,速度快,适合小型/中型项目。
    • Chroma:易用、支持本地和持久化,适合知识库、RAG等场景。
    • Milvus、Weaviate、Pinecone、Qdrant:分布式、可扩展,适合大规模生产环境。
Logo

更多推荐