简单 RAG 入门

张开发
2026/4/4 22:46:50 15 分钟阅读
简单 RAG 入门
整理原始文档比如pdf、word、excel、ppt 等把整理好的文档内容进行清洗、切块把切块好的数据向量化并存储到向量数据库中用户问一个问题把这个问题的字符串向量化然后根据【问题向量】去向量数据库查找相似的知识点把查到的知识和问题一起传递给大模型大模型根据查到的知识点来回答问题当然了这个流程也是简化过的不过不用在意这个只是便于你理解这个概念。还有你需要知道的是RAG 可以解决一些时效性的问题和幻觉问题。相比 Fing-turning 微调RAG 更节省成本而且数据可以溯源可以知道相关的知识点源自哪个文档。或许看这个流程图或许会更直观一点什么是AI Agent如果把 RAG 比作是查知识库那么 AI Agent 就是可以执行具体任务的助手。主要包括这几个特点规划规划步骤比如说买机票可以先查日期再查天气然后买机票记忆可以记住聊天上下文工具使用可以决定使用查天气的 API 还是执行一段 Python 代码执行规划好之后可以执行具体的任务并根据结果来执行下一步任务主流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-dotenvLangChain 示例所需依赖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-transformers3. API Key 配置本文所有代码都在https://github.com/zonezoen/refine-rag创建.env文件放到项目根目录# DeepSeek API 配置 DEEPSEEK_API_KEYsk-xxx # 千问 DASHSCOPE_API_KEYsk-yyy如何获取 API KeyDeepSeek: https://platform.deepseek.com/千问(DashScope): https://dashscope.aliyun.com/LlamaIndex 示例千问文件名01_LlamaIndex.pyimport os from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels from llama_index.embeddings.dashscope import DashScopeEmbedding from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings from dotenv import load_dotenv os.environ[USER_AGENT] my-rag-app/1.0 load_dotenv() DATA_DIR ./data # 1. 配置 LLM Settings.llm DashScope( model_nameDashScopeGenerationModels.QWEN_MAX, api_keyos.getenv(DASHSCOPE_API_KEY) ) # 2. 设置嵌入模型 Settings.embed_model DashScopeEmbedding( model_nametext-embedding-v2, api_keyos.getenv(DASHSCOPE_API_KEY), timeout60, # 增加超时时间 max_retries5 # 增加重试次数 ) # 3. 加载与索引 if not os.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(fAI 回答结果\n{response})运行方式python 01_LlamaIndex.py运行结果正在加载文档... 正在创建索引此步涉及 Embedding 接口调用... 正在提问... AI 回答结果 2026年春运的时间是从2月2日至3月13日。LangChain 示例DeepSeek文件名02_LangChain_DeepSeek.pyimport os from dotenv import load_dotenv os.environ[USER_AGENT] my-rag-app/1.0 load_dotenv() # 1. 加载数据 from langchain_community.document_loaders import TextLoader # 随便复制一些即时新闻放到 txt 文件中例如https://baike.baidu.com/item/2026%E5%B9%B4%E6%98%A5%E8%BF%90/66941026?fromModulehome_hotspot loader TextLoader( file_pathdata/a.txt, encodingutf-8 # 如果是中文文件确保使用 utf-8 编码 ) docs loader.load() # 2. 文档分块 from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter RecursiveCharacterTextSplitter(chunk_size1000, chunk_overlap200) all_splits text_splitter.split_documents(docs) # 3. 设置嵌入模型 # 使用本地 HuggingFace 模型推荐免费且稳定可能需要科学网络 from langchain_huggingface import HuggingFaceEmbeddings embeddings HuggingFaceEmbeddings( model_nameBAAI/bge-small-zh-v1.5, # 中文模型 model_kwargs{device: cpu}, encode_kwargs{normalize_embeddings: True} ) # 4. 存到向量数据库中为了方便测试这里使用内存数据库 from langchain_core.vectorstores import InMemoryVectorStore vector_store InMemoryVectorStore(embeddings) vector_store.add_documents(all_splits) # 5. 构建用户查询针对前面的即时新闻提问 question 2026春运时间是什么时候 # 6. 在向量数据库中搜索最相似的文档 retrived_docs vector_store.similarity_search(question, k3) docs_content \n\n.join(doc.page_content for doc in retrived_docs) # 7. 构建提示模板 from langchain_core.prompts import ChatPromptTemplate prompt ChatPromptTemplate.from_template( 基于以下上下文回答问题。如果没有结果就说没有找到对应信息。 上下文: {context} 问题: {question} 回答: ) # 8. 把结果和问题都发给大模型生成答案 from langchain_deepseek import ChatDeepSeek llm ChatDeepSeek( modeldeepseek-chat, # DeepSeek API 支持的模型名称 temperature0.7, # 随机性 max_tokens2048, # 最大输出长度 api_keyos.getenv(DEEPSEEK_API_KEY) # 从环境变量加载API key ) answer llm.invoke(prompt.format(questionquestion, contextdocs_content)) print(answer.content) # 只打印回答内容运行方式python 02_LangChain_DeepSeek.py运行结果2026年春运时间为2026年2月2日至2026年3月13日。

更多文章