RAG从入门到精通(一)动手实现RAG

目的

小白快速本地实现RAG。

核心概念

RAG的基本工作流程

  1. 索引:将知识库文档进行切分、向量化,存入向量数据库。
  2. 检索:根据用户问题,从向量数据库中找出最相关的文档片段。
  3. 增强:将问题和检索到的片段一起组合成提示词。
  4. 生成:大模型基于增强后的提示词生成最终答案。
文档准备
文档加载
文本分割
向量化
向量存储
用户提问
查询向量化
向量相似度检索
Top-K相关片段
构建增强提示
LLM生成答案
最终回答

RAG的优势

特性传统LLM微调模型RAG
知识实时性❌ 训练数据截止❌ 训练数据截止✅ 实时更新
私有数据支持❌ 无法访问⚠️ 需要训练✅ 直接支持
减少幻觉❌ 容易编造⚠️ 有所改善✅ 显著减少
答案可追溯❌ 黑盒生成❌ 黑盒生成✅ 完全可追溯
成本效益✅ 零训练成本❌ 高成本训练✅ 低成本构建
多领域适应✅ 通用能力强❌ 领域特定✅ 灵活切换
部署速度✅ 即时可用❌ 数周至数月✅ 数小时至数天

技术栈初探

向量数据库

数据库核心优势适用场景
Milvus分布式架构,支持十亿级向量规模;支持多种索引算法(如IVF_FLAT、HNSW);支持向量与标量数据联合检索大规模AI搜索(图像/视频/文本)、推荐系统、企业级知识库
Chroma与LangChain等框架深度集成,可快速搭建RAG原型;API简单易用快速原型验证、小规模语义搜索、开发测试
QdrantRust语言开发,查询延迟低(可在20ms内);支持动态数据更新与混合搜索高并发实时检索、生成式AI应用(如聊天机器人)
PgVectorPostgreSQL扩展,完美融入现有SQL生态;支持ACID事务;开发门槛低中小规模向量检索、现有PG生态升级
Weaviate结合图数据库与向量检索;支持混合查询(向量+结构化过滤);内置BM25文本搜索语义搜索、知识图谱、需要多条件混合检索的场景

嵌入模型

模型名称维度上下文长度特点适用场景
BAAI/bge系列384-1024512中文优化、开源、性能强劲中文RAG首选
text2vec系列768-1024512中文社区活跃、轻量高效中小规模中文应用
M3E系列1024-2048512-8192专门为中文优化、多任务训练复杂中文语义理解
OpenAI text-embedding15368192英文表现优秀、稳定性高英文为主的应用
Cohere Embed384-1024512多语言支持、商业级服务多语言商业应用
E5系列384-1024512中英文均衡、指令微调中英文混合场景

大语言模型(国内)

模型名称核心特点主要适用场景
通义千问 (Qwen)- 综合性能强劲,尤其在数学和编程领域表现突出
- 支持多模态输入(文本、图像)和联网搜索
- 开源协议宽松,生态活跃
多媒体内容分析、企业服务、跨模态推理任务
DeepSeek- 数学推理和代码生成能力强
- 强调高性价比和低成本部署
- 上下文窗口大 (64K),适合长文本分析
编程开发、复杂逻辑任务、学术研究、深度文本分析
文心一言- 中文语义理解细致,逻辑推理严谨
- 在医疗、法律等专业领域知识全面
- 生态集成度高,日均调用量大
政务、教育、创意写作、专业领域问答
Kimi (月之暗面)- 原生支持超长上下文(如32K)
- 在长文本理解和内容生成方面有优势
长文档处理、内容创作、文本摘要

动手实践 - 搭建第一个RAG

核心组件选型

组件类型推荐选择特点依赖
大语言模型Deepseek性价比高、中文优化Ollama
嵌入模型BAAI/bge系列中文表现优秀、开源免费Ollama
向量数据库Chroma轻量、无序部署python包
开发框架LangChain生态丰富、文档完善python包

ollama安装

1、ollama

ollama pull bge-large:335m
ollama pull deepseek-r1:8b

代码实现

pip install langchain chromadb langchain-ollama langchain-community

from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama.llms import OllamaLLM
from langchain_ollama.embeddings import OllamaEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.output_parsers import StrOutputParser

# 1. 初始化中文嵌入模型
embeddings = OllamaEmbeddings(
    model="bge-large:335m"
)

# 2. 加载和切分文档
loader = TextLoader("docs/技术文档.txt", encoding='utf-8')
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
texts = text_splitter.split_documents(documents)

# 3. 构建向量数据库
vectorstore = Chroma.from_documents(
    documents=texts,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

model = OllamaLLM(
    base_url="http://127.0.0.1:11434",
    model="deepseek-r1:8b",
    temperature=0.3,
    num_ctx=4096,
)

output_parser = StrOutputParser()

# 4. ollama 调用函数
def ask_llm(question, context):

    prompt = f"""基于以下上下文回答问题:

上下文:
{context}

问题:{question}

如果上下文不包含相关信息,请回答“我不知道”。"""

    prompt_template = ChatPromptTemplate.from_messages([
        ("system", "你是一个乐于助人的助手。请根据用户输入进行回复。"),
        ("user", prompt),
    ])


    chain = prompt_template | model | output_parser
    return chain.invoke({'question': question, 'context': context})


# 5. RAG查询流程
def rag_query(question):
    # 检索相关文档
    docs = vectorstore.similarity_search(question, k=3)
    context = "\n".join([doc.page_content for doc in docs])

    # 调用LLM生成答案
    answer = ask_llm(question, context)
    return answer, docs


# 测试
question = "如何配置数据库连接?"
answer, sources = rag_query(question)
print(f"问题:{question}")
print(f"答案:{answer}")
print(f"来源:{[doc.metadata.get('source', '') for doc in sources]}")

思考

  1. 检索不到
  2. 检索不准
  3. 上下文长度限制
  4. 多论对话如何解决
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值