从零搭建RAG知识库:基于腾讯云Embedding模型完整部署教程

2026/7/18·2 views

一、为什么需要RAG?彻底解决大模型核心痛点

当前通用大模型普遍存在两大致命短板,也是多数AI落地失效的核心原因:模型幻觉知识滞后

1. 知识时效性受限:大模型训练数据存在固定截止时间,无法获取最新行业资料、私有业务文档、个人学习资料,面对专属、小众、实时场景完全失效。

2. AI幻觉严重:通用模型无依据生成内容,面对专业问题、定制化文档、规范条款时,容易编造数据、篡改逻辑,无法用于学术、办公、企业生产等严谨场景。

而**RAG(检索增强生成)**是解决以上问题的最优工程方案。核心逻辑:不强迫大模型记住所有知识,而是让大模型实时检索外部私有知识库,基于真实资料生成答案

RAG的核心价值:

  • 消除幻觉:所有回答基于自有文档溯源生成,有据可查,杜绝捏造内容;

  • 动态更新知识:无需微调模型,新增、修改文档即可更新AI知识体系,低成本迭代;

  • 适配私有场景:支持个人笔记、项目文档、企业规章、行业报告等非公开资料落地AI问答;

  • 低成本、轻量化:相比模型微调,RAG无需大量算力、数据集,普通人可快速部署落地。

二、RAG核心工作原理(通俗工程拆解)

一套标准RAG系统分为文档向量化入库用户检索问答两大流程,全程依赖Embedding模型完成语义理解,共4个核心步骤:

1. 文档预处理与切片

将PDF、Word、TXT、Markdown等原始文档,清洗冗余内容,按固定字符长度切片(Chunk),避免单段文本过长或过短影响检索精度。

2. Embedding语义向量化(核心步骤)

调用Embedding模型,将每一段文本切片转化为高维数字向量。文字无法被机器直接理解,而向量可以精准捕捉文本语义相似度,实现“意思相近即匹配”,而非传统关键词死板匹配。

3. 向量数据库存储

将生成的文本向量、对应原文、元数据统一存入向量数据库,构建专属私有语义知识库。

4. 语义检索+大模型生成

用户提问时,先将问题通过同款Embedding模型转为向量,在向量库中匹配语义最相似的文档片段,将检索到的真实上下文投喂给大模型,最终基于检索内容生成精准、合规、可溯源的回答。

三、方案选型:为什么选用腾讯云Embedding模型?

本次部署采用腾讯云 lke-text-embedding-v1 通用文本向量化模型,适配绝大多数中文RAG场景,相比开源模型优势显著:

  • 中文语义精度更高:针对中文语境、语序、专业术语优化,优于开源通用Embedding模型;

  • 低延迟、高稳定:云端API调用,无需本地显卡算力,低配电脑也能部署;

  • 适配场景广:支持文档检索、知识库问答、文本相似度匹配、内容聚类等全RAG场景;

  • 接入简单:官方标准化API,开箱即用,无需复杂模型部署与调优。

四、前置环境准备

1. Python 3.8+ 运行环境;

2. 腾讯云账号,开通「大模型知识引擎」服务,获取SecretId、SecretKey、地域节点

3. 安装依赖库:向量存储、文本处理、腾讯云SDK

bash 复制代码
pip install tencentcloud-sdk-python chromadb langchain python-dotenv

五、完整部署教程:腾讯Embedding + Chroma向量库 搭建RAG

本教程采用腾讯云Embedding做向量化、Chroma做本地向量库、LangChain串联RAG链路,轻量化、零服务器成本、可直接落地。

步骤1:配置腾讯云密钥环境变量

新建 .env 文件,填入腾讯云密钥与地域信息

plain 复制代码
TENCENT_SECRET_ID=你的腾讯云SecretId
TENCENT_SECRET_KEY=你的腾讯云SecretKey
TENCENT_REGION=ap-guangzhou

步骤2:封装腾讯云Embedding调用类

适配LangChain标准接口,实现文本向量化能力统一调用

python 复制代码
import os
from dotenv import load_dotenv
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.lke.v20231130 import lke_client, models

# 加载环境变量
load_dotenv()

class TencentEmbedding:
    def __init__(self):
        # 初始化腾讯云认证
        cred = credential.Credential(
            os.getenv("TENCENT_SECRET_ID"),
            os.getenv("TENCENT_SECRET_KEY")
        )
        http_profile = HttpProfile()
        http_profile.endpoint = "lke.tencentcloudapi.com"
        client_profile = ClientProfile()
        client_profile.httpProfile = http_profile
        self.client = lke_client.LkeClient(cred, os.getenv("TENCENT_REGION"), client_profile)

    # 单文本向量化
    def embed_query(self, text: str):
        req = models.GetEmbeddingRequest()
        params = {
            "Text": text,
            "Model": "lke-text-embedding-v1"
        }
        req.from_json_string(str(params))
        resp = self.client.GetEmbedding(req)
        return resp.Embedding

    # 批量文档向量化
    def embed_documents(self, texts: list):
        embeddings = []
        for text in texts:
            embeddings.append(self.embed_query(text))
        return embeddings

步骤3:文档加载、切片与向量入库

实现本地TXT/MD文档自动解析、切片、腾讯Embedding向量化、存入Chroma向量库

python 复制代码
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
from langchain.vectorstores import Chroma

# 初始化自定义腾讯Embedding
embedding = TencentEmbedding()

# 1. 加载本地文档
loader = TextLoader("test_doc.txt", encoding="utf-8")
documents = loader.load()

# 2. 文本切片(适配中文场景)
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=800,
    chunk_overlap=150,
    separators=["\n\n", "\n", "。", ","]
)
split_docs = text_splitter.split_documents(documents)

# 3. 腾讯Embedding向量化 + 向量入库
vectordb = Chroma.from_documents(
    documents=split_docs,
    embedding=embedding,
    persist_directory="./tencent_rag_db"
)
# 持久化向量库
vectordb.persist()
print("文档向量入库完成!")

步骤4:构建RAG检索问答链路

实现问题检索、上下文召回、答案生成的完整闭环

python 复制代码
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

# 自定义RAG提示词(约束模型基于知识库回答)
prompt_template = """
请严格基于以下知识库内容回答用户问题,禁止编造信息,无匹配内容则如实告知。
知识库内容:{context}
用户问题:{question}
"""
prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"])

# 加载持久化向量库
vectordb = Chroma(
    persist_directory="./tencent_rag_db",
    embedding_function=embedding
)

# 构建检索器:召回Top3相似度最高文档片段
retriever = vectordb.as_retriever(search_kwargs={"k": 3})

# 搭建RAG问答链
qa_chain = RetrievalQA.from_chain_type(
    llm=OpenAI(temperature=0),
    chain_type="stuff",
    retriever=retriever,
    chain_type_kwargs={"prompt": prompt}
)

# 测试问答
if __name__ == "__main__":
    res = qa_chain.run("你的自定义问题")
    print("RAG回答结果:", res)

六、核心参数调优指南(提升RAG精度)

  • 切片大小chunk_size:通用文档800-1000字符,精密专业文档500-600字符,避免信息碎片化;

  • 重叠度chunk_overlap:100-200字符,保证上下文连贯,切断语义断层;

  • 检索TopK:默认3条,长文档复杂问题可调整为4-5条,丰富上下文信息;

  • 模型选择:统一使用 lke-text-embedding-v1,腾讯云针对中文知识库场景最优适配。

七、常见问题排查

  • 调用报错:检查腾讯云密钥、地域配置,确认已开通大模型知识引擎权限;

  • 检索不准:优化文档切片规则,增加文本重叠度,清洗文档冗余无效内容;

  • 回答幻觉:强化Prompt约束,强制模型仅基于检索内容作答,禁止外部知识拓展。