实战扩展:Embedding 落地到 RAG 系统
文本 Embedding 最核心的应用场景是 RAG(检索增强生成),以下是结合 LlamaIndex + 阿里云千问大模型 + Qdrant 向量库的完整 RAG 示例,实现 "本地文档向量化存储→语义检索→智能问答" 全流程。
1. 新增依赖安装
# 向量数据库(本地部署)
pip install qdrant-client
# 文本分割器
pip install llama-index-core node_parser
2. 完整 RAG 代码
import os
from dotenv import load_dotenv
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, StorageContext
from llama_index.core.node_parser import SentenceSplitter
from llama_index.embeddings.dashscope import DashScopeEmbedding
from llama_index.llms.openai_like import OpenAILike
from llama_index.vector_stores.qdrant import QdrantVectorStore
from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance
# 1. 基础配置
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY")
# 匹配 text-embedding-v2 的 1024 维向量
EMBEDDING_DIM = 1024
COLLECTION_NAME = "poetry_demo"
QDRANT_PATH = "./qdrant_db"
# 2. 初始化核心组件
# 2.1 Embedding 模型
embedder = DashScopeEmbedding(
model_name="text-embedding-v2",
api_key=api_key,
timeout=30
)
# 2.2 千问大模型(对话生成)
llm = OpenAILike(
model="qwen-plus",
api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key=api_key,
is_chat_model=True,
temperature=0.1
)
# 2.3 Qdrant 向量库(存储向量)
client = QdrantClient(path=QDRANT_PATH)
# 重建向量集合(确保维度匹配)
if client.collection_exists(COLLECTION_NAME):
client.delete_collection(COLLECTION_NAME)
client.create_collection(
collection_name=COLLECTION_NAME,
vectors_config=VectorParams(size=EMBEDDING_DIM, distance=Distance.COSINE)
)
vector_store = QdrantVectorStore(client=client, collection_name=COLLECTION_NAME)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 3. 加载并处理本地文档(如 poetry.txt,包含《登高》全文)
# 3.1 文本分割器(保证语义完整)
splitter = SentenceSplitter(chunk_size=300, chunk_overlap=50)
# 3.2 加载文档
documents = SimpleDirectoryReader(
input_dir="./data", # 文档目录,存放 poetry.txt
required_exts=[".txt"]
).load_data()
# 3.3 分割文档并向量化
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
embed_model=embedder,
transformations=[splitter]
)
# 4. 构建查询引擎并问答
query_engine = index.as_query_engine(llm=llm)
# 提问:基于嵌入的文本向量检索相关内容,再由千问模型生成答案
response = query_engine.query("《登高》中表达时光流逝、壮志难酬的诗句是什么?")
print("问答结果:", response)
常见问题与优化建议
1. 向量维度不匹配报错
若出现 ValueError: could not broadcast input array from shape (1024,) into shape (512,),原因是向量库的维度与 Embedding 模型输出维度不一致:
- 解决方案:确保
EMBEDDING_DIM与模型维度匹配(text-embedding-v2为 1024,text-embedding-v1为 1536)。
2. API 调用限流 / 失败
-
阿里云百炼免费额度有限,高并发场景需升级付费套餐;
-
批量处理时控制
batch_size(建议≤50),避免触发接口限流; -
添加重试机制(如下):
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def get_embedding_safe(text_list):
return embedder.get_text_embedding_batch(text_list)
3. 提升 Embedding 效果
- 选择更高版本的模型(如
text-embedding-v1比v2效果更优); - 文本预处理:去除无关字符(如换行、特殊符号),保证文本语义完整;
- 分割文本时使用
SentenceSplitter,避免截断完整句子。
总结
- 阿里云百炼
text-embedding-v2是轻量高效的嵌入模型,基于 LlamaIndex 可快速实现文本向量化,输出固定 1024 维向量; - 文本 Embedding 的核心价值是将非结构化文本转化为可计算的向量,是 RAG 系统的基础;
- 落地时需保证 "模型维度→向量库维度→文本分割粒度" 三者匹配,才能最大化检索和问答效果;
- 批量向量化、添加重试机制、合理配置超时时间,可提升 Embedding 流程的稳定性。
通过本文的代码和思路,你可以快速实现从 "文本向量化" 到 "RAG 智能问答" 的完整落地,适配中文场景下的各类 NLP 应用。