保姆级教程!手把手带你入门 RAG,从原理到代码实战,建议收藏

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

本文对比了RAG与AI Agent,详解了RAG检索增强生成的核心流程。文章提供了基于LlamaIndex(千问)和LangChain(DeepSeek)的完整代码实战,涵盖环境配置、依赖安装及示例运行。适合小白入门大模型开发,建议收藏学习。

前排提示,文末有大模型AGI-CSDN独家资料包哦!

前言

在学习 RAG 之前,我们先来对比一下 RAG 和 AI Agent 的概念,只有先了解这些概念,才能继续往前推进。

什么是RAG

简单来说就是允许你查阅书本,再来回答问题。

标准一点来说(也是简化过的):

  1. 整理原始文档,比如:pdf、word、excel、ppt 等
  2. 把整理好的文档内容进行清洗、切块
  3. 把切块好的数据向量化,并存储到向量数据库中
  4. 用户问一个问题
  5. 把这个问题的字符串向量化
  6. 然后根据【问题向量】去向量数据库查找相似的知识点
  7. 把查到的知识和问题一起传递给大模型
  8. 大模型根据查到的知识点来回答问题当然了,这个流程也是简化过的,不过不用在意,这个只是便于你理解这个概念。

还有你需要知道的是:RAG 可以解决一些时效性的问题和幻觉问题。相比 Fing-turning 微调,RAG 更节省成本,而且数据可以溯源,可以知道相关的知识点源自哪个文档。

或许看这个流程图或许会更直观一点

图片

什么是AI Agent

如果把 RAG 比作是查知识库,那么 AI Agent 就是可以执行具体任务的助手。主要包括这几个特点:

  1. 规划:规划步骤,比如说买机票可以先查日期,再查天气,然后买机票
  2. 记忆:可以记住聊天上下文
  3. 工具使用:可以决定使用查天气的 API 还是执行一段 Python 代码
  4. 执行:规划好之后,可以执行具体的任务,并根据结果来执行下一步任务

主流RAG框架

目前主流的 RAG 框架有 LlamaIndex、langchain、Dify 等,我这边选择前面两个来做个示例:

大模型也分别选了 千问和 DeepSeek 来做展示:

环境准备

1. Python 环境要求
  • Python 3.8 或更高版本(推荐 3.10+)
  • 建议使用虚拟环境
2. 安装依赖包

LlamaIndex 示例所需依赖:

pip install llama-index  
pip install llama-index-llms-dashscope  
pip install llama-index-embeddings-dashscope  
pip install dashscope  
pip install python-dotenv

LangChain 示例所需依赖:

pip install langchain  
pip install langchain-community  
pip install langchain-huggingface  
pip install langchain-deepseek  
pip install langchain-text-splitters  
pip install python-dotenv  
pip install sentence-transformers  # HuggingFace embeddings 依赖

一键安装所有依赖:

pip install llama-index llama-index-llms-dashscope llama-index-embeddings-dashscope /  
            dashscope langchain langchain-community langchain-huggingface /  
            langchain-deepseek langchain-text-splitters python-dotenv sentence-transformers
3. API Key 配置

创建 .env 文件,放到项目根目录:

# DeepSeek API 配置  
DEEPSEEK_API_KEY=sk-xxx  
# 千问  
DASHSCOPE_API_KEY=sk-yyy

如何获取 API Key:

  • DeepSeek: https://platform.deepseek.com/
  • 千问(DashScope): https://dashscope.aliyun.com/

LlamaIndex 示例(千问)

文件名:01_LlamaIndex.py

importos  
fromllama_index.llms.dashscopeimportDashScope, DashScopeGenerationModels  
fromllama_index.embeddings.dashscopeimportDashScopeEmbedding  
fromllama_index.coreimportVectorStoreIndex, SimpleDirectoryReader, Settings  
  
fromdotenvimportload_dotenv  
  
os.environ['USER_AGENT'] = 'my-rag-app/1.0'  
load_dotenv()  
DATA_DIR = "./data"  
  
# 1. 配置 LLM  
Settings.llm = DashScope(  
    model_name=DashScopeGenerationModels.QWEN_MAX,  
    api_key=os.getenv("DASHSCOPE_API_KEY")  
)  
  
# 2. 设置嵌入模型  
Settings.embed_model = DashScopeEmbedding(  
    model_name='text-embedding-v2',  
    api_key=os.getenv("DASHSCOPE_API_KEY"),  
    timeout=60,  # 增加超时时间  
    max_retries=5  # 增加重试次数  
)  
  
# 3. 加载与索引  
ifnotos.path.exists(DATA_DIR):  
    print(f"错误:未找到路径 {DATA_DIR}")  
else:  
    # 建议直接使用绝对路径,避免相对路径带来的困扰  
    print("正在加载文档...")  
    documents = SimpleDirectoryReader(DATA_DIR).load_data()  
  
    print("正在创建索引(此步涉及 Embedding 接口调用)...")  
    index = VectorStoreIndex.from_documents(documents)  
  
    # 4. 查询  
    query_engine = index.as_query_engine()  
  
    print("正在提问...")  
    response = query_engine.query("2026春运时间是什么时候?")  
    print(f"AI 回答结果:/n{response}")

运行方式:

python 01_LlamaIndex.py

运行结果:

正在加载文档...  
正在创建索引(此步涉及 Embedding 接口调用)...  
正在提问...  
AI 回答结果:  
2026年春运的时间是从2月2日至3月13日。

LangChain 示例(DeepSeek)

文件名:02_LangChain_DeepSeek.py

importos  
fromdotenvimportload_dotenv  
  
os.environ['USER_AGENT'] = 'my-rag-app/1.0'  
load_dotenv()  
  
# 1. 加载数据  
fromlangchain_community.document_loadersimportTextLoader  
  
# 随便复制一些即时新闻放到 txt 文件中,例如:https://baike.baidu.com/item/2026%E5%B9%B4%E6%98%A5%E8%BF%90/66941026?fromModule=home_hotspot  
loader = TextLoader(  
    file_path="data/a.txt",  
    encoding="utf-8"  # 如果是中文文件,确保使用 utf-8 编码  
)  
  
docs = loader.load()  
  
# 2. 文档分块  
fromlangchain_text_splittersimportRecursiveCharacterTextSplitter  
  
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)  
all_splits = text_splitter.split_documents(docs)  
  
# 3. 设置嵌入模型  
# 使用本地 HuggingFace 模型(推荐,免费且稳定),可能需要科学网络  
fromlangchain_huggingfaceimportHuggingFaceEmbeddings  
  
embeddings = HuggingFaceEmbeddings(  
    model_name="BAAI/bge-small-zh-v1.5",  # 中文模型  
    model_kwargs={'device': 'cpu'},  
    encode_kwargs={'normalize_embeddings': True}  
)  
  
# 4. 存到向量数据库中,为了方便测试,这里使用内存数据库  
fromlangchain_core.vectorstoresimportInMemoryVectorStore  
  
vector_store = InMemoryVectorStore(embeddings)  
vector_store.add_documents(all_splits)  
  
# 5. 构建用户查询,针对前面的即时新闻提问  
question = "2026春运时间是什么时候?"  
  
# 6. 在向量数据库中搜索最相似的文档  
retrived_docs = vector_store.similarity_search(question, k=3)  
docs_content = "/n/n".join(doc.page_contentfordocinretrived_docs)  
  
# 7. 构建提示模板  
fromlangchain_core.promptsimportChatPromptTemplate  
  
prompt = ChatPromptTemplate.from_template(  
    """  
    基于以下上下文回答问题。如果没有结果,就说没有找到对应信息。  
                上下文: {context}  
                问题: {question}  
                回答:  
    """  
)  
  
# 8. 把结果和问题都发给大模型,生成答案  
fromlangchain_deepseekimportChatDeepSeek  
  
llm = ChatDeepSeek(  
    model="deepseek-chat",  # DeepSeek API 支持的模型名称  
    temperature=0.7,  # 随机性  
    max_tokens=2048,  # 最大输出长度  
    api_key=os.getenv("DEEPSEEK_API_KEY")  # 从环境变量加载API key  
)  
  
answer = llm.invoke(prompt.format(question=question, context=docs_content))  
print(answer.content)  # 只打印回答内容

运行方式:

python 02_LangChain_DeepSeek.py

运行结果:

2026年春运时间为2026年2月2日至2026年3月13日。

学习路径

  1. 简易RAG 学习

  2. LCEL 语法学习

  3. LangChain 读取数据

  4. LangChain 读取文本数据

  5. LangChain 读取图片数据

  6. LangChain 读取 PDF 数据

  7. LangChain 读取表格数据

  8. 文本切块

  9. 向量嵌入

  10. 向量存储

  11. 检索前处理

  12. 索引优化

  13. 检索后处理

  14. 响应生成

  15. 系统评估

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值