HoRain云--LangChain RAG
RAGRetrieval-Augmented Generation检索增强生成让 AI 能够基于你的私有文档回答问题不需要微调模型只需将文档向量化存储Agent 就能检索相关内容来回答。RAG 是什么普通的大模型只能回答训练数据中有的内容。如果你的文档是私有的公司内部文档、个人笔记模型就不知道。RAG 解决了这个问题离线阶段将文档切分成小块 → 用 Embedding 模型转换为向量 → 存入向量数据库在线阶段用户提问 → 将问题转为向量 → 在向量数据库中搜索最相似的内容 → 将检索到的内容作为上下文发给模型 → 模型基于检索内容回答RAG 工作流程┌──────────────────────────────────────────────────────┐ │ 离线阶段索引 │ │ │ │ 文档 → DocumentLoader → TextSplitter → Embedding │ │ ↓ │ │ VectorStore │ └──────────────────────────────────────────────────────┘ ┌──────────────────────────────────────────────────────┐ │ 在线阶段检索 │ │ │ │ 用户提问 → Embedding → 相似度搜索 → 检索结果 │ │ ↓ │ │ 检索结果 用户问题 → 模型 → 回答 │ └──────────────────────────────────────────────────────┘环境准备安装 RAG 相关依赖$ pip install langchain-deepseek langchain-chroma chromadb包用途langchain-deepseek提供 OpenAI Embedding 模型langchain-chromaChroma 向量数据库的 LangChain 集成chromadbChroma 向量数据库轻量级适合入门Embedding 模型初始化实例from dotenv import load_dotenvload_dotenv()from langchain_openai import OpenAIEmbeddings# OpenAI 的文本嵌入模型# 将文本转换为向量一组浮点数embeddings OpenAIEmbeddings(modeltext-embedding-3-small)# 测试将一段文本转为向量text 菜鸟教程 RUNOOB 是一个编程学习平台vector embeddings.embed_query(text)print(f文本: {text})print(f向量维度: {len(vector)}) # text-embedding-3-small 是 1536 维print(f向量前 5 个值: {vector[:5]})运行结果文本: 菜鸟教程 RUNOOB 是一个编程学习平台 向量维度: 1536 向量前 5 个值: [0.0123, -0.0045, 0.0234, -0.0012, 0.0089]创建向量存储实例from langchain_openai import OpenAIEmbeddingsfrom langchain_chroma import Chroma# 初始化 Embedding 模型embeddings OpenAIEmbeddings(modeltext-embedding-3-small)# 创建 Chroma 向量存储数据保存在本地目录vector_store Chroma(collection_namerunoob_docs,embedding_functionembeddings,persist_directory./chroma_db, # 持久化目录)# 添加文档最简单的形式文本列表texts [菜鸟教程RUNOOB是一个免费的编程学习网站提供 HTML、CSS、JavaScript、Python 等教程。,Python3 基础教程共 30 章适合零基础入门包含环境搭建、语法基础、面向对象等内容。,HTML 基础教程共 25 章覆盖 HTML 标签、表单、多媒体等基础知识。,]# add_texts 自动将文本转为向量并存储vector_store.add_texts(texts)print(f已添加 {len(texts)} 个文档到向量存储)语义检索实例# 语义搜索——不依赖关键词匹配而是语义相似度results vector_store.similarity_search(我想学 Python有什么教程推荐,k2, # 返回最相似的 2 个结果)print(搜索结果)for i, doc in enumerate(results):print(f\n结果 {i1}:)print(f 内容: {doc.page_content})print(f 元数据: {doc.metadata})运行结果搜索结果 结果 1: 内容: Python3 基础教程共 30 章适合零基础入门... 元数据: {} 结果 2: 内容: 菜鸟教程RUNOOB是一个免费的编程学习网站... 元数据: {}注意第一个搜索结果比第二个更相关——虽然第一个包含 Python 关键词但它按 语义相似度 而非关键词匹配排序。这就是向量检索的优势。创建 Retriever 检索器Retriever 是 Vector Store 的标准化接口实例# 从 vector_store 创建 retrieverretriever vector_store.as_retriever(search_typesimilarity, # 相似度搜索search_kwargs{k: 3}, # 返回前 3 个结果)# 使用 retrieverdocs retriever.invoke(Python 学习路线)for doc in docs:print(f- {doc.page_content[:60]}...)