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

总结

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

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

相关推荐
Hello.Reader6 分钟前
一个开源项目,让 AI 做逆向不再靠猜reverse-skill 架构解析与本地实战
人工智能·架构·开源
wespaul1 小时前
VeapAI 自然语言操作实战|第 05 篇:向量与召回——从知识条目到可检索资产
大数据·数据库·人工智能·milvus
mingbaiceping1 小时前
复旦-华盛顿大学EMBA:2026年AI课程矩阵解析
人工智能
蹊黎1 小时前
C++中vector类的部分简单实现
开发语言·c++·visual studio
李福春1 小时前
技术思考问题17:上了LangChain框架就等于AI-Agent工程化吗?
大数据·人工智能·langchain·深圳同盟·腾讯云架构师技术同盟·llm应用架构·编排抽象
揽秀亭长1 小时前
AIGC 检测原理拆解与论文降 AI 率的可复现处理流程(2026版)
人工智能·aigc
羞儿1 小时前
【DSH】为什么需要-Harness
人工智能·大模型·harness·认知构建
JackLam3 小时前
AI-安装ChatGpt Codex
人工智能
强哥聊算力4 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
吴佳浩4 小时前
Run:ai 开源了,我把 GPU 编排摆回 AI 栈里看了一遍
人工智能