llama-index Embedding 落地到 RAG 系统

实战扩展: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-v1v2 效果更优);
  • 文本预处理:去除无关字符(如换行、特殊符号),保证文本语义完整;
  • 分割文本时使用 SentenceSplitter,避免截断完整句子。

总结

  1. 阿里云百炼 text-embedding-v2 是轻量高效的嵌入模型,基于 LlamaIndex 可快速实现文本向量化,输出固定 1024 维向量;
  2. 文本 Embedding 的核心价值是将非结构化文本转化为可计算的向量,是 RAG 系统的基础;
  3. 落地时需保证 "模型维度→向量库维度→文本分割粒度" 三者匹配,才能最大化检索和问答效果;
  4. 批量向量化、添加重试机制、合理配置超时时间,可提升 Embedding 流程的稳定性。

通过本文的代码和思路,你可以快速实现从 "文本向量化" 到 "RAG 智能问答" 的完整落地,适配中文场景下的各类 NLP 应用。

相关推荐
gorgeous(๑>؂<๑)2 小时前
【西北工业大学-邢颖慧组-AAAI26】YOLO-IOD:实时增量目标检测
人工智能·yolo·目标检测·计算机视觉·目标跟踪
飞哥数智坊2 小时前
TRAE 国际版限免开启!一份给新手的入门说明书
人工智能·ai编程·trae
翱翔的苍鹰2 小时前
神经网络中损失函数(Loss Function)介绍
人工智能·深度学习·神经网络
狼爷2 小时前
【译】Skills 详解:Skills 与 prompts、Projects、MCP 和 subagents 的比较
人工智能·aigc
元智启2 小时前
企业AI应用面临“敏捷响应”难题:快速变化的业务与相对滞后的智能如何同步?
人工智能·深度学习·机器学习
jghhh012 小时前
传递对准MATLAB仿真程序
开发语言·matlab
ISACA中国3 小时前
2026年网络安全与AI趋势预测
人工智能·安全·web安全
lambo mercy3 小时前
自回归生成任务
人工智能·数据挖掘·回归
5Gcamera3 小时前
边缘计算视频分析智能AI盒子使用说明
人工智能·音视频·边缘计算