找回密码
 立即注册
首页 业界区 业界 001:简单 RAG 入门

001:简单 RAG 入门

汤昕昕 2 小时前
简单 RAG 入门
本文是 refine-rag 系列教程的第一篇,带你体验一下 RAG 的简单流程。
本文所有代码都在:https://github.com/zonezoen/refine-rag
前言

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

简单来说就是允许你查阅书本,再来回答问题。
标准一点来说(也是简化过的):

  • 整理原始文档,比如:pdf、word、excel、ppt 等
  • 把整理好的文档内容进行清洗、切块
  • 把切块好的数据向量化,并存储到向量数据库中
  • 用户问一个问题
  • 把这个问题的字符串向量化
  • 然后根据【问题向量】去向量数据库查找相似的知识点
  • 把查到的知识和问题一起传递给大模型
  • 大模型根据查到的知识点来回答问题
    当然了,这个流程也是简化过的,不过不用在意,这个只是便于你理解这个概念。
还有你需要知道的是:RAG 可以解决一些时效性的问题和幻觉问题。相比 Fing-turning 微调,RAG 更节省成本,而且数据可以溯源,可以知道相关的知识点源自哪个文档。
或许看这个流程图或许会更直观一点
1.png

什么是AI Agent

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

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

目前主流的 RAG 框架有 LlamaIndex、langchain、Dify 等,我这边选择前面两个来做个示例:
大模型也分别选了 千问和 DeepSeek 来做展示:
环境准备

1. Python 环境要求


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

LlamaIndex 示例所需依赖:
  1. pip install llama-index
  2. pip install llama-index-llms-dashscope
  3. pip install llama-index-embeddings-dashscope
  4. pip install dashscope
  5. pip install python-dotenv
复制代码
LangChain 示例所需依赖:
  1. pip install langchain
  2. pip install langchain-community
  3. pip install langchain-huggingface
  4. pip install langchain-deepseek
  5. pip install langchain-text-splitters
  6. pip install python-dotenv
  7. pip install sentence-transformers  # HuggingFace embeddings 依赖
复制代码
一键安装所有依赖:
  1. pip install llama-index llama-index-llms-dashscope llama-index-embeddings-dashscope \
  2.             dashscope langchain langchain-community langchain-huggingface \
  3.             langchain-deepseek langchain-text-splitters python-dotenv sentence-transformers
复制代码
3. API Key 配置

本文所有代码都在:https://github.com/zonezoen/refine-rag
创建 .env 文件,放到项目根目录:
  1. # DeepSeek API 配置
  2. DEEPSEEK_API_KEY=sk-xxx
  3. # 千问
  4. DASHSCOPE_API_KEY=sk-yyy
复制代码
如何获取 API Key:

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

文件名: 01_LlamaIndex.py
  1. import os
  2. from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels
  3. from llama_index.embeddings.dashscope import DashScopeEmbedding
  4. from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
  5. from dotenv import load_dotenv
  6. os.environ['USER_AGENT'] = 'my-rag-app/1.0'
  7. load_dotenv()
  8. DATA_DIR = "./data"
  9. # 1. 配置 LLM
  10. Settings.llm = DashScope(
  11.     model_name=DashScopeGenerationModels.QWEN_MAX,
  12.     api_key=os.getenv("DASHSCOPE_API_KEY")
  13. )
  14. # 2. 设置嵌入模型
  15. Settings.embed_model = DashScopeEmbedding(
  16.     model_name='text-embedding-v2',
  17.     api_key=os.getenv("DASHSCOPE_API_KEY"),
  18.     timeout=60,  # 增加超时时间
  19.     max_retries=5  # 增加重试次数
  20. )
  21. # 3. 加载与索引
  22. if not os.path.exists(DATA_DIR):
  23.     print(f"错误:未找到路径 {DATA_DIR}")
  24. else:
  25.     # 建议直接使用绝对路径,避免相对路径带来的困扰
  26.     print("正在加载文档...")
  27.     documents = SimpleDirectoryReader(DATA_DIR).load_data()
  28.     print("正在创建索引(此步涉及 Embedding 接口调用)...")
  29.     index = VectorStoreIndex.from_documents(documents)
  30.     # 4. 查询
  31.     query_engine = index.as_query_engine()
  32.     print("正在提问...")
  33.     response = query_engine.query("2026春运时间是什么时候?")
  34.     print(f"AI 回答结果:\n{response}")
复制代码
运行方式:
  1. python 01_LlamaIndex.py
复制代码
运行结果:
  1. 正在加载文档...
  2. 正在创建索引(此步涉及 Embedding 接口调用)...
  3. 正在提问...
  4. AI 回答结果:
  5. 2026年春运的时间是从2月2日至3月13日。
复制代码
LangChain 示例(DeepSeek)

文件名: 02_LangChain_DeepSeek.py
  1. import os
  2. from dotenv import load_dotenv
  3. os.environ['USER_AGENT'] = 'my-rag-app/1.0'
  4. load_dotenv()
  5. # 1. 加载数据
  6. from langchain_community.document_loaders import TextLoader
  7. # 随便复制一些即时新闻放到 txt 文件中,例如:https://baike.baidu.com/item/2026%E5%B9%B4%E6%98%A5%E8%BF%90/66941026?fromModule=home_hotspot
  8. loader = TextLoader(
  9.     file_path="data/a.txt",
  10.     encoding="utf-8"  # 如果是中文文件,确保使用 utf-8 编码
  11. )
  12. docs = loader.load()
  13. # 2. 文档分块
  14. from langchain_text_splitters import RecursiveCharacterTextSplitter
  15. text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
  16. all_splits = text_splitter.split_documents(docs)
  17. # 3. 设置嵌入模型
  18. # 使用本地 HuggingFace 模型(推荐,免费且稳定),可能需要科学网络
  19. from langchain_huggingface import HuggingFaceEmbeddings
  20. embeddings = HuggingFaceEmbeddings(
  21.     model_name="BAAI/bge-small-zh-v1.5",  # 中文模型
  22.     model_kwargs={'device': 'cpu'},
  23.     encode_kwargs={'normalize_embeddings': True}
  24. )
  25. # 4. 存到向量数据库中,为了方便测试,这里使用内存数据库
  26. from langchain_core.vectorstores import InMemoryVectorStore
  27. vector_store = InMemoryVectorStore(embeddings)
  28. vector_store.add_documents(all_splits)
  29. # 5. 构建用户查询,针对前面的即时新闻提问
  30. question = "2026春运时间是什么时候?"
  31. # 6. 在向量数据库中搜索最相似的文档
  32. retrived_docs = vector_store.similarity_search(question, k=3)
  33. docs_content = "\n\n".join(doc.page_content for doc in retrived_docs)
  34. # 7. 构建提示模板
  35. from langchain_core.prompts import ChatPromptTemplate
  36. prompt = ChatPromptTemplate.from_template(
  37.     """
  38.     基于以下上下文回答问题。如果没有结果,就说没有找到对应信息。
  39.                 上下文: {context}
  40.                 问题: {question}
  41.                 回答:
  42.     """
  43. )
  44. # 8. 把结果和问题都发给大模型,生成答案
  45. from langchain_deepseek import ChatDeepSeek
  46. llm = ChatDeepSeek(
  47.     model="deepseek-chat",  # DeepSeek API 支持的模型名称
  48.     temperature=0.7,  # 随机性
  49.     max_tokens=2048,  # 最大输出长度
  50.     api_key=os.getenv("DEEPSEEK_API_KEY")  # 从环境变量加载API key
  51. )
  52. answer = llm.invoke(prompt.format(question=question, context=docs_content))
  53. print(answer.content)  # 只打印回答内容
复制代码
运行方式:
  1. python 02_LangChain_DeepSeek.py
复制代码
运行结果:
  1. 2026年春运时间为2026年2月2日至2026年3月13日。
复制代码
学习路径


  • 简易RAG 学习
  • LCEL 语法学习
  • LangChain 读取数据

    • LangChain 读取文本数据
    • LangChain 读取图片数据
    • LangChain 读取 PDF 数据
    • LangChain 读取表格数据

  • 文本切块
  • 向量嵌入
  • 向量存储
  • 检索前处理
  • 索引优化
  • 检索后处理
  • 响应生成
  • 系统评估
项目地址

本文所有代码示例都在 GitHub 开源:
https://github.com/zonezoen/refine-rag
欢迎 Star 和 Fork,一起学习 RAG 技术!

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册