基于飞书的知识库 RAG 搭建,可用于全文搜索的接口方式主要有以下几种:
此外,在本地部署资讯问答机器人实现 RAG 时,会涉及加载所需的库和模块,如 feedparse 用于解析 RSS 订阅源,ollama 用于在 python 程序中跑大模型。还会为文档内容生成向量,如使用文本向量模型 bge-m3 等。
在开发 LangChain 应用开发指南中,实现 LangChain 和 RAG 的结合时,需要加载数据、分割文档、转换嵌入并存储到向量存储器、创建检索器以及聊天模型等步骤。
检索就是根据用户的问题从向量数据库中获取匹配的内容。要理解检索环节,最主要的是理解检索有那几种方式,这里我们先不用技术语言,我们先来思考下你期望的检索方式是怎样的。假设你有一个问答对:问题:你的产品多少钱?答案:199元/年针对这个问答对,你肯定期望只要用户问了跟产品价格相关的问题,都能获取准确的答案。例如用户的问题可能是:你的产品这么卖的呀这个产品是怎么收费的你的产品多贵......无论上面是哪个问题,你肯定期望都能够检索出来:199元/年这个答案你期望的这种检索方式使用专业术语来表达就是:语义检索[heading3]语义检索[content]语义匹配关注的是查询和文档内容的意义,而不仅仅是表面的词汇匹配那语义匹配是怎么做到的呢,这里就要提到前面说的向量。我们可以通过向量的相似性来判断语义的相似性,这里就不展开了[heading3]全文检索[content]语义检索成本是比较高的,成本较低的方案则是全文检索。全文检索是基于关键词的检索方式,这里我们还是直接通过例子的方式进行说明:有一个句子是:“猫的饮食习惯包括吃鱼和鸡肉”如果用户输入了“猫”、“饮食”、“猫的饮食习惯”、“吃鱼”都可以搜索到这个句子。但是如果用户搜索了猫喜欢吃什么呀,这个时候是无法搜索到上面这个句子的。你可以简单的理解为全文检索就是根据关键词进行匹配的。[heading3]混合检索[content]混合模式结合了语义匹配和全文检索的优点,同时利用关键词匹配和语义理解来提高检索效果。通常,系统先进行全文检索获取初步结果,然后再对这些结果进行语义匹配和排序。
[title]本地部署资讯问答机器人:Langchain+Ollama+RSSHub实现RAG加载所需的库和模块。其中,feedparse用于解析RSS订阅源ollama用于在python程序中跑大模型,使用前请确保ollama服务已经开启并下载好模型|从订阅源获取内容下面函数用于从指定的RSS订阅url提取内容,这里只是给了一个url,如果需要接收多个url,只要稍微改动即可。然后,通过一个专门的文本拆分器将长文本拆分成较小的块,并附带相关的元数据如标题、发布日期和链接。最终,这些文档被合并成一个列表并返回,可用于进一步的数据处理或信息提取任务。|为文档内容生成向量这里,我们使用文本向量模型bge-m3。https://huggingface.co/BAAI/bge-m3bge-m3是智源研究院发布的新一代通用向量模型,它具有以下特点:支持超过100种语言的语义表示及检索任务,多语言、跨语言能力全面领先(M ulti-Lingual)最高支持8192长度的输入文本,高效实现句子、段落、篇章、文档等不同粒度的检索任务(M ulti-Granularity)同时集成了稠密检索、稀疏检索、多向量检索三大能力,一站式支撑不同语义检索场景(M ulti-Functionality)从hf下载好模型之后,假设放置在某个路径/path/to/bge-m3,通过下面函数,利用FAISS创建一个高效的向量存储。|实现RAG
[title]开发:LangChain应用开发指南-大模型的知识外挂RAG[heading3]LangChain和RAG的结合首先,我们需要加载我们的数据。我们可以使用数据加载器来实现这一步,根据数据源的类型选择合适的数据加载器。例如,如果我们的数据源是一个网页,我们可以使用WebBaseLoader,它可以使用urllib和BeautifulSoup()来加载和解析网页,返回一个文档对象。然后,我们需要将我们的文档对象分割成较小的文档对象。我们可以使用文本分割器来实现这一步,根据文本的特点选择合适的文本分割器。例如,如果我们的文本是一个博客文章,我们可以使用RecursiveCharacterTextSplitter,它可以递归地使用常见的分隔符(如换行符)来分割文本,直到每个文档对象的大小符合要求。接下来,我们需要将我们的文档对象转换为嵌入,并存储到向量存储器中。我们可以使用文本嵌入器和向量存储器来实现这一步,根据嵌入的质量和速度选择合适的文本嵌入器和向量存储器。例如,如果我们想要使用OpenAI的嵌入模型和Chroma的向量存储器,我们可以使用OpenAIEmbeddings()和ChromaVectorStore。然后,我们需要创建一个检索器,用于根据用户的输入检索相关的文档对象。我们可以使用向量存储器检索器来实现这一步,-传递一个向量存储器对象和一个文本嵌入器对象作为参数,创建一个向量存储器检索器对象。最后,我们需要创建一个聊天模型,用于根据用户的输入和检索到的文档对象生成一个输出消息。我们可以使用LangChain提供的聊天模型来实现这一步,根据模型的性能和成本选择合适的聊天模型。例如,如果我们想要使用OpenAI的GPT-3模型,我们可以使用OpenAIChatModel。下面是一个使用LangChain构建RAG应用的示例代码: