AI Agent开发学习系列 - langchain之RAG检索增强生成(4):文本向量化
文本向量化与向量数据库应用 文本向量化是将文本转换为数值向量(如1024维数组)的技术,使机器学习模型能处理语义信息。常用方法包括TF-IDF、Word2Vec和BERT等预训练模型,其中Sentence-BERT等直接生成句向量,适用于检索和RAG场景。通过腾讯混元API可实现高效向量化,并利用缓存机制提升批量处理效率。向量数据库(如FAISS)专为高维向量设计,支持快速语义检索,是RAG问答等
·
文本向量化是指将自然语言文本转换为数值向量的过程,使其能够被机器学习模型或向量数据库理解和处理。向量化后的文本可以用于相似度检索、聚类、分类、RAG 问答等多种NLP任务。
主要原理
- 将文本编码为高维向量:每个文本被表示为一个固定长度的数值数组(如 384 维、768 维等)。
- 语义相近的文本向量距离更近:向量空间中的距离(如余弦相似度)可以衡量文本间的语义相关性。
常见文本向量化方法
- 词袋模型(Bag of Words, TF-IDF)
早期方法,按词频统计,无法表达语义。 - Word2Vec、GloVe
将单词映射为向量,句子/文本向量通常用词向量平均。 - 句向量/文本向量模型
- 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问答、推荐系统等)中的核心基础设施之一。
- 为什么需要向量数据库?
- 传统数据库不适合高维向量检索:传统关系型数据库擅长结构化数据的精确查找,但不适合高维向量的相似度搜索。
- 支持大规模语义检索:向量数据库能高效地在数百万甚至数十亿条向量中,找到与查询向量“最相似”的内容(如TopK最近邻)。
- 适配AI场景:如文本、图片、音频、视频等内容的embedding检索,RAG、推荐、聚类等。
- 工作原理
- 存储:将每个文本、图片等对象的embedding向量存入数据库,并关联原始内容或元数据。
- 检索:用户输入查询内容,先转为向量,再用“向量相似度”(如余弦相似度、欧氏距离等)在数据库中查找最相近的向量,返回对应的原始内容。
- 常见向量数据库
- FAISS(Facebook AI Similarity Search):本地库,速度快,适合小型/中型项目。
- Chroma:易用、支持本地和持久化,适合知识库、RAG等场景。
- Milvus、Weaviate、Pinecone、Qdrant:分布式、可扩展,适合大规模生产环境。
更多推荐
所有评论(0)