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

相关推荐
li-xun10 小时前
2026年6月9日博客精选
人工智能·每日阅读
黑马师兄10 小时前
RAG混合检索深度解析:让AI真正找到你要的内容
java·人工智能·ai·agent·rag·ai-native
哈伦201910 小时前
第十二章 深度学习基础 案例:MLP实现银行单据手写数字识别
人工智能·深度学习·图像识别
右耳朵猫AI10 小时前
GitHub周趋势2026W22 | AI编程工具、知识图谱、自托管、AI代理、代码智能
人工智能·github·ai编程
Black蜡笔小新10 小时前
企业AI算力工作站DLTM深度学习推理工作站零代码私有化重塑企业AI落地新模式
人工智能·深度学习
宋拾壹10 小时前
同时添加多个类目
android·开发语言·javascript
IT知识分享11 小时前
从零开发在线简繁转换工具:OpenCC 实战、避坑经验与方案选型
javascript·python
2601_9594801511 小时前
Moneta Markets亿汇:“比特币反弹走势仍脆弱”
人工智能
lunzi_082611 小时前
【学习笔记】《Python编程 从入门到实践》第8章:函数定义、参数传递与模块导入
笔记·python·学习
凡人叶枫11 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发