从零搭建RAG知识库:基于腾讯云Embedding模型完整部署教程
一、为什么需要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约束,强制模型仅基于检索内容作答,禁止外部知识拓展。