尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【AI大模型】不止语义检索,Milvus+LangChain全文检索RAG教程来了

【AI大模型】不止语义检索,Milvus+LangChain全文检索RAG教程来了 前言最近OpenAI和LangChain杠上了。一个是大模型扛把子一个是最受欢迎的大模型框架而抬杠的原因很简单LangChain觉得OpenAI 根本不懂agent但总结一句话来说就是对于agent开发OpenAI更倾向于高级抽象能加速开发而LangChain则觉得大模型要能真正发挥作用需要精确控制能确保可靠性因此workflow和agent都必不可少。实际上两者的争论没有完全的对错之分。OpenAI指出的的是长期趋势而LangChain给出的则是立足当下针对具体问题的更优解决方案。以企业内部知识库问答系统构建来说长期看通过大模型智能调度各种工具然后基于milvus在内的向量数据库进行检索并给出答案会是大势所趋但是具体到各种现实场景仅仅是对接milvus向量数据库中的索引算法有几十种根据用户的需求不同以及成本的不同考量要如何对其中进行抉择往往还需要开发者们的实际经验参与将其写成workflow。一个最简单的例子是全文检索和语义搜索究竟哪个效果更佳答案是看你在搜什么。比如同样是检索鲁迅先生的文章在我们需要查找“藤野先生”“祥林嫂”的时候全文检索就是最优解但是当我们检索诸如“少年在瓜田刺猹”这类描述性内容那么语义检索就是帮你精准找到相关内容的最优解。那么该如何通过LangChain与Milvus构建一个RAG系统本文将对此做出解读。01背景科普如何在向量数据库中实现全文检索本章节主要做一些基础技术内容的科普如果已经了解相关背景可直接跳过全文检索是一种信息检索技术能够从大量文本数据中快速找出包含特定词语或短语的文档非常适合精确术语的查找。例如当你需要查找包含Python 3.9新特性的文档时全文检索能够精确定位包含这些关键词的内容。不过与简单的关键词匹配不同全文检索考虑了词语在文档中的重要性、出现频率以及上下文关系从而提供更加精准和相关的搜索结果。与之相对应的是语义搜索主要关注内容的含义而非具体词语适合理解查询意图。例如当你搜索编程语言最新版本功能时语义搜索可能会返回关于Python、Java等多种语言最新版本的信息即使文档中没有出现你使用的确切词语。长久以来很多人可能会有一个误解那就是ES适合全文检索而向量数据库只适合语义检索。其实Milvus等现代****向量数据库的一个重要创新是实现了稀疏向量用于全文检索和密集向量用于语义搜索的协同工作。这种融合使系统能够同时支持基于关键词的精确匹配和基于语义的相似性搜索为用户提供更全面的搜索体验。稀疏向量想象一个超长的列表对应词汇表中的每个词。如果文档包含某个词对应位置标记为1或词频其余位置为0。例如在一个包含10万词的词汇表中一篇文档可能只包含100个不同的词所以向量中99.9%的元素都是0。密集向量想象一个相对较短的列表如几百个数字每个数字都包含文档的某些语义特征。与稀疏向量不同密集向量中几乎所有元素都有非零值它们共同表示文档的意义而不是具体的词。稀疏向量和密集向量在表示方式和应用场景上有显著差异一句话总结来说就是稀疏向量可以通过更多的维度以及更少的非零元素来实现关键词匹配等效果。在Milvus中通过内部优化机制这两种向量表示能够高效协同工作为用户提供更准确、更全面的搜索结果。02实战LangChain与Milvus构建RAG系统第一步环境准备Python 3.8Docker用于运行MilvusOpenAI API密钥基本的Python编程知识了解向量数据库的基本概念第二步启动Milvus服务使用Docker Compose启动Milvus服务wget https://github.com/milvus-io/milvus/releases/download/v2.2.8/milvus-standalone-docker-compose.yml-O docker-compose.ymldocker-compose up-d验证Milvus服务是否正常运行docker ps|grep milvus安装必要的依赖pip install--upgrade langchain langchain-core langchain-community langchain-text-splitters langchain-milvus langchain-openai bs4设置环境变量# import os 设置OpenAI API密钥os.environ[OPENAI_API_KEY] your-api-key-here# 设置Milvus连接信息URI http://localhost:19530TOKEN your-token-here # 如果需要第三步文档预处理与向量化文档预处理是构建高效RAG系统的关键第一步。以下是使用LangChain和Milvus进行文档预处理和向量化的详细步骤首先我们需要从各种来源加载文档。LangChain提供了多种文档加载器可以处理不同格式的文件。fromlangchain_community.document_loadersimportDirectoryLoader,TextLoader,PyPDFLoader# 加载文本文件def load_text_documents(directory): loader DirectoryLoader(directory, glob**/*.txt, loader_clsTextLoader) return loader.load()# 加载PDF文件def load_pdf_documents(directory): loader DirectoryLoader(directory, glob**/*.pdf, loader_clsPyPDFLoader) return loader.load()# 组合加载多种格式def load_all_documents(directory): text_docs load_text_documents(directory) pdf_docs load_pdf_documents(directory) return text_docs pdf_docs接下来我们需要把长文档分割成较小的块以便更好地进行向量化和检索。from langchain.text_splitter import RecursiveCharacterTextSplitterdef split_documents(documents, chunk_size1000, chunk_overlap200): text_splitter RecursiveCharacterTextSplitter( chunk_sizechunk_size, chunk_overlapchunk_overlap, separators[\n\n, \n, 。, , , ., , ] ) return text_splitter.split_documents(documents)参数说明chunk_size每个文档块的最大字符数chunk_overlap相邻块之间的重叠字符数用于保持上下文连贯性separators分割文本的分隔符列表按优先级排序接下来我们使用OpenAI的嵌入模型将文档块转换为向量并存储在Milvus中。fromlangchain_milvusimportMilvus,BM25BuiltInFunctionfrom langchain_openaiimportOpenAIEmbeddingsdef create_vector_store(documents,collection_name,uriURI):# 创建嵌入模型 embeddings OpenAIEmbeddings() # 配置BM25分析器参数用于生成稀疏向量 analyzer_params { tokenizer: whitespace, # 使用空格分词 filter: [lowercase, {type: stop, stop_words: [the, a, an, and, or, but, is, are, in, to, with, of]}] } # 创建向量存储 vector_store Milvus.from_documents( documentsdocuments, embeddingembeddings, builtin_functionBM25BuiltInFunction(analyzer_paramsanalyzer_params), vector_field[dense, sparse], # 同时存储密集向量和稀疏向量 connection_args{uri: uri}, collection_namecollection_name, ) return vector_store技术说明OpenAIEmbeddings使用OpenAI的嵌入模型生成密集向量BM25BuiltInFunction使用BM25算法生成稀疏向量用于全文检索vector_field[dense, sparse]同时存储两种向量支持混合搜索下面是一个完整的文档处理流程从加载到向量化存储defprocess_documents(directory,collection_name,chunk_size1000,chunk_overlap200):try:# 1. 加载文档 print(正在加载文档...) documents load_all_documents(directory) print(f成功加载 {len(documents)} 个文档) # 2. 分割文档 print(正在分割文档...) chunks split_documents(documents, chunk_size, chunk_overlap) print(f文档已分割为 {len(chunks)} 个块) # 3. 创建向量存储 print(正在创建向量存储...) vector_store create_vector_store(chunks, collection_name) print(f向量存储已创建集合名称{collection_name}) return vector_store except Exception as e: print(f处理文档时出错{str(e)}) raise使用示例# 处理文档并创建向量存储vector_store process_documents( directory./documents, collection_nameknowledge_base, chunk_size1000, chunk_overlap200)保存向量存储配置以便后续使用vector_store.save_local(./vector_store_config)第四步知识库问答系统实现在开始实现之前需要准备以下环境和依赖# 安装必要的依赖包pip install langchain langchain-openai langchain-milvus python-dotenv# 环境变量设置import osfrom dotenv import load_dotenv# 加载环境变量load_dotenv()# 确保设置了OpenAI API密钥if not os.getenv(OPENAI_API_KEY): raise ValueError(请设置OPENAI_API_KEY环境变量)# Milvus连接设置MILVUS_URI os.getenv(MILVUS_URI, http://localhost:19530)完整实现方案importosfrom typingimportList,Dict,Any,Optionalfrom langchain_core.documentsimportDocumentfrom langchain.text_splitterimportRecursiveCharacterTextSplitterfrom langchain_milvusimportMilvus,BM25BuiltInFunctionfrom langchain_openaiimportOpenAIEmbeddings,ChatOpenAIfrom langchain.chainsimportRetrievalQAfrom langchain.promptsimportPromptTemplate# 1. 加载文档def load_documents(directory: str) - List[Document]: 从指定目录加载所有文本文档 Args: directory: 文档所在目录路径 Returns: Document对象列表 documents [] try: for filename in os.listdir(directory): if filename.endswith((.txt, .md, .pdf)): file_path os.path.join(directory, filename) try: with open(file_path, r, encodingutf-8) as f: content f.read() documents.append(Document( page_contentcontent, metadata{source: filename, path: file_path} )) except Exception as e: print(f读取文件 {filename} 时出错: {str(e)}) except Exception as e: print(f读取目录 {directory} 时出错: {str(e)}) print(f成功加载了 {len(documents)} 个文档) return documents# 2. 文档分割def split_documents(documents: List[Document], chunk_size: int 1000, chunk_overlap: int 200) - List[Document]: 将文档分割成更小的块 Args: documents: 要分割的文档列表 chunk_size: 每个块的最大字符数 chunk_overlap: 相邻块之间的重叠字符数 Returns: 分割后的文档块列表 text_splitter RecursiveCharacterTextSplitter( chunk_sizechunk_size, chunk_overlapchunk_overlap, separators[\n\n, \n, 。, , , ., , ] ) split_docs text_splitter.split_documents(documents) print(f文档被分割为 {len(split_docs)} 个块) return split_docs# 3. 创建向量存储def create_vector_store(documents: List[Document], collection_name: str knowledge_base, recreate: bool False) - Milvus: 创建向量存储 Args: documents: 要存储的文档列表 collection_name: Milvus集合名称 recreate: 是否重新创建集合 Returns: Milvus向量存储对象 try: # 配置向量存储 embeddings OpenAIEmbeddings() # 配置BM25分析器参数 analyzer_params { tokenizer: jieba, # 使用结巴分词器处理中文 filter: [lowercase, {type: stop, stop_words: [的, 了, 是]}], } # 创建向量存储 vector_store Milvus.from_documents( documentsdocuments, embeddingembeddings, builtin_functionBM25BuiltInFunction(analyzer_paramsanalyzer_params), vector_field[dense, sparse], # 同时存储密集向量和稀疏向量 connection_args{uri: MILVUS_URI}, collection_namecollection_name, drop_oldrecreate, # 是否删除已存在的集合 ) print(f成功创建向量存储集合名称: {collection_name}) return vector_store except Exception as e: print(f创建向量存储时出错: {str(e)}) raise# 4. 创建问答链def create_qa_chain(vector_store: Milvus, temperature: float 0.0, search_k: int 5) - RetrievalQA: 创建检索问答链 Args: vector_store: Milvus向量存储对象 temperature: 生成模型的温度参数 search_k: 检索的文档数量 Returns: RetrievalQA链对象 try: # 创建混合检索器 retriever vector_store.as_retriever( search_typehybrid, # 使用混合搜索模式 search_kwargs{ k: search_k, # 检索top-k个文档 hybrid_search: { dense_weight: 0.7, # 密集向量权重 sparse_weight: 0.3, # 稀疏向量权重 } } ) # 创建自定义提示模板 template 使用以下上下文来回答最后的问题。如果你不知道答案就说你不知道不要试图编造答案。 {context} 问题: {question} 回答: prompt PromptTemplate( templatetemplate, input_variables[context, question] ) # 创建大语言模型 llm ChatOpenAI(temperaturetemperature) # 创建问答链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, return_source_documentsTrue, chain_type_kwargs{prompt: prompt} ) return qa_chain except Exception as e: print(f创建问答链时出错: {str(e)}) raise# 5. 完整流程示例def build_knowledge_qa_system(docs_directory: str, collection_name: str knowledge_base) - RetrievalQA: 构建完整的知识库问答系统 Args: docs_directory: 文档目录 collection_name: 向量存储集合名称 Returns: 问答系统链 # 加载文档 documents load_documents(docs_directory) # 分割文档 split_docs split_documents(documents) # 创建向量存储 vector_store create_vector_store(split_docs, collection_name) # 创建问答链 qa_chain create_qa_chain(vector_store) return qa_chain# 6. 使用示例def query_example(): 示例如何使用问答系统 # 构建问答系统 qa_system build_knowledge_qa_system(./documents, company_knowledge) # 查询示例 query 公司的年假政策是什么 result qa_system({query: query}) # 输出结果 print(f问题: {query}) print(f回答: {result[result]}) # 输出来源文档 print(\n来源文档:) for i, doc in enumerate(result[source_documents]): print(f文档 {i1}: {doc.metadata[source]}) print(f内容片段: {doc.page_content[:100]}...\n)第五步运行效果示例。以下是系统运行的示例输出成功加载了15个文档文档被分割为78个块成功创建向量存储集合名称:company_knowledge问题:公司的年假政策是什么回答:根据公司政策正式员工每年享有15天带薪年假。工作满3年的员工额外增加3天年假满5年的员工额外增加5天年假。年假可以分多次使用但每次至少使用半天。未使用的年假可以结转到下一年但最多结转5天。来源文档:文档1:company_policy.txt内容片段:# 公司员工手册 ## 休假政策 ### 年假 正式员工每年享有15天带薪年假。工作满3年的员工额外增加3天年假满5年...文档 2: hr_faq.txt内容片段: # 人力资源常见问题 ## 休假相关 Q: 年假如何申请 A: 员工可通过OA系统提交年假申请需提前3个工作日申请...03经验总结通过上文我们展示了一个比较初级的基于全文检索的企业知识库系统的构建但是实操中我们可能还会遇到一些更加具体且琐碎的问题比如比如全文检索基于精确的词语匹配可能无法处理同义词不同词语表达相同含义和多义词同一词语有多种含义的问题。例如用户搜索汽车时可能无法找到只包含轿车或车辆的文档。**我们可以有三个解决思路。1同义词扩展在索引和查询时添加同义词2****查询扩展**自动扩展用户查询以包含相关术语3结合语义搜索通过密集向量捕捉语义关系。再比如不同语言有不同的语法结构和词形变化规则这给全文检索带来挑战。例如中文不像英文那样有明显的词语边界需要特殊的分词技术。解决方案主要有两个。1语言特定分词器为不同语言使用专门的分词技术2多语言支持构建支持多种语言的索引。此外随着数据量的增长全文检索系统需要处理越来越多的文档这对系统性能提出了挑战。解决方案有三个。1分布式索引将索引分散到多个服务器2增量索引更新只更新变化的部分3冷热数据缓存机制缓存热门查询结果。最后的最后感谢你们的阅读和喜欢作为一位在一线互联网行业奋斗多年的老兵我深知在这个瞬息万变的技术领域中持续学习和进步的重要性。为了帮助更多热爱技术、渴望成长的朋友我特别整理了一份涵盖大模型领域的宝贵资料集。这些资料不仅是我多年积累的心血结晶也是我在行业一线实战经验的总结。这些学习资料不仅深入浅出而且非常实用让大家系统而高效地掌握AI大模型的各个知识点。如果你愿意花时间沉下心来学习相信它们一定能为你提供实质性的帮助。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】大模型知识脑图为了成为更好的 AI大模型 开发者这里为大家提供了总的路线图。它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。经典书籍阅读阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。实战案例光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。面试资料我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表