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 应用。

相关推荐
蝎子莱莱爱打怪13 分钟前
Claude Code 官宣新升级:子智能体默认后台跑,你边聊它边干活
人工智能
武子康19 分钟前
调查研究-206 DeepSeek DSpark 深度解析:大模型推理加速,正在从“模型能力”转向“系统工程”
人工智能·agent·deepseek
荣码31 分钟前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
甲维斯1 小时前
最佳work模型sonnet5来了,直接就能用!
人工智能
IT_陈寒1 小时前
React hooks 闭包陷阱把我的状态吃掉了,原来问题出在这里
前端·人工智能·后端
金銀銅鐵11 小时前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
冬奇Lab13 小时前
Workflow 系列(03):状态管理——持久化、幂等性与版本绑定
人工智能·工作流引擎
Lyn_Li13 小时前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
冬奇Lab13 小时前
每日一个开源项目(第146篇):openpilot - 开源自动驾驶辅助系统,曾在 Consumer Reports 评测中超过特斯拉 Autopilot
人工智能·开源·自动驾驶