展馆设计网站推荐,网络服务提供商有哪些,长沙模板建网站需要多久,多多在线免费观看电视剧如何通过语言模型查询 Notion 文档#xff1f;LangChain 和 Milvus 缺一不可。 在整个过程中#xff0c;我们会将 LangChain 作为框架#xff0c;Milvus 作为相似性搜索引擎#xff0c;用二者搭建一个基本的检索增强生成#xff08;RAG#xff09;应用。在之前的文章中LangChain 和 Milvus 缺一不可。 在整个过程中我们会将 LangChain 作为框架Milvus 作为相似性搜索引擎用二者搭建一个基本的检索增强生成RAG应用。在之前的文章中我们已经介绍过 LangChain 中的“自查询”Self-querying。本质上LangChain 中的自查询功能就是构建一个基本的 RAG 架构如图所示 在 LangChain 中处理 Notion 文档共包含三个步骤获取、存储和查询文档。获取是指获取 Notion 文档并将内容加载到内存中。存储步骤包括启动向量数据库Milvus、将文档转化为向量、将文档向量存储至向量数据库中。查询部分包括针对 Notion 文档进行提问。本文将带大家一一拆解这三个步骤代码请参考 colab notebook。 01.获取 Notion 文档 用 LangChain 的 NotionDirectoryLoader将文档加载到内存中。我们提供文档的路径并调用load 函数来获取 Notion 文档。加载完毕后可以得到 Notion 文档的 Markdown 文件。本例中我们以一个 Markdown 文件示意。 接下来用 LangChain 的 markdown 标题文本分割器。我们向其提供一个分割符列表然后传入之前命名的 md_file 来获取分割内容。在实际定义headers_to_split_on列表时请使用自己 Notion 文档的标题。 # Load Notion page as a markdownfile filefrom langchain.document_loaders import NotionDirectoryLoaderpath./notion_docsloader NotionDirectoryLoader(path)docs loader.load()md_filedocs[0].page_content# Lets create groups based on the section headers in our pagefrom langchain.text_splitter import MarkdownHeaderTextSplitterheaders_to_split_on [ (##, Section),]markdown_splitter MarkdownHeaderTextSplitter(headers_to_split_onheaders_to_split_on)md_header_splits markdown_splitter.split_text(md_file) 分割任务并检查分割结果。用 LangChain 的 RecursiveCharacterTextSplitter使用一些不同的字符来进行分割。四个默认的检查字符是换行符、双换行符、空格或无空格。也可以选择传入自己的 separators 参数。 将 Notion文档进行分块时我们还需要定义两个关键超参数——分块大小chunk size和分块重叠chunk overlap。本例中分块大小为 64重叠为 8。随后我们就可以调用 split_documents 函数将所有文档进行分割。 # Define our text splitterfrom langchain.text_splitter import RecursiveCharacterTextSplitterchunk_size 64chunk_overlap 8text_splitter RecursiveCharacterTextSplitter(chunk_sizechunk_size, chunk_overlapchunk_overlap)all_splits text_splitter.split_documents(md_header_splits)all_splits 下图展示了部分分割的 document 对象其中包含了页面内容和元数据。元数据显示了内容是从哪个章节中提取出来的。 02.存储 Notion 文档 所有文档加载和分割完毕后就需要存储这些文档块。首先在 notebook 中直接运行向量数据库 Milvus Lite随后导入所需的 LangChain 模块——Milvus 和 OpenAI Embeddings。 用 LangChain 的 Milvus 模块为文档块创建 Collection。这个步骤中我们需要传入的参数包括文档列表、使用的 Embedding 模型、连接参数、以及 Collection 名称可选。 from milvus import default_serverdefault_server.start()from langchain.vectorstores import Milvusfrom langchain.embeddings import OpenAIEmbeddingsvectordb Milvus.from_documents(documentsall_splits, embeddingOpenAIEmbeddings(), connection_args{host: 127.0.0.1, port: default_server.listen_port}, collection_nameEngineeringNotionDoc) 03.查询 Notion 文档 现在可以开始查询文档了。开始前我们需要从 LangChain 中再导入三个模块 OpenAI用于访问GPT。 SelfQueryRetriever用于搭建基本的 RAG 应用。 Attribute info用于传入元数据的。 首先我们定义元数据。随后需要给自查询检索器提供文档的描述。本例中描述即为“文档的主要部分”。在我们实例化自查询检索器前现将 GPT 的温度Temperature设置为 0并赋值给一个名为 llm 的变量。有了 LLM、向量数据库、文档描述和元数据字段后我们就完成了自查询检索器定义。 from langchain.llms import OpenAIfrom langchain.retrievers.self_query.base import SelfQueryRetrieverfrom langchain.chains.query_constructor.base import AttributeInfometadata_fields_info [ AttributeInfo( nameSection, descriptionPart of the document that the text comes from, typestring or list[string] ),]document_content_description Major sections of the documentllm OpenAI(temperature0)retriever SelfQueryRetriever.from_llm(llm, vectordb, document_content_description, metadata_fields_info, verboseTrue)retriever.get_relevant_documents(What makes a distinguished engineer?) 以下例子中我们提出了一个问题“一名优秀工程师有哪些品质”What makes a distinguished engineer? 响应如下图所示。我们获得了与提问在语义上最相似的文档片段。但不难发现其回答也仅仅只是语义上相似并非完全正确。 本教程介绍了如何加载并解析 Notion 文档并搭建一个基本的 RAG 应用查询 Notion 文档。我们使用到了 LangChain 作为框架Milvus 作为向量数据库用于相似性搜索。如果想要进行深入的探索建议大家调整分块大小和重叠等参数检查不同的参数值是如何影响查询结果的。 所谓分块Chunking是构建检索增强型生成RAG应用程序中最具挑战性的问题。具体的介绍和操作可参考《在 LangChain 尝试了 N 种可能后我发现了分块的奥义》 本文由 mdnice 多平台发布