使用Ollama本地离线体验SimpleRAG(手把手教程)
Ollama介绍
Ollama是一个开源项目,专注于开发和部署大语言模型,特别是像LLaMA这样的模型,用于生成高质量的文本和进行复杂的自然语言处理任务。Ollama的目标是让大语言模型的运行和使用变得更加容易和普及,而无需复杂的基础设施或深度的机器学习知识。
GitHub地址:https://github.com/ollama/ollama
RAG是什么?
检索生成增强(Retrieval-Augmented Generation,RAG)是一种结合了检索(Retrieval)和生成(Generation)两种技术的自然语言处理方法,主要用于改进文本生成任务的性能,如问答系统、对话系统、文本摘要和文档生成等。RAG模型通过在生成模型的基础上,引入一个检索模块,来增强生成模型的准确性和丰富性。
在传统的生成模型中,模型完全依赖于训练数据中学习到的模式和统计信息来生成文本,这可能导致生成的内容缺乏新颖性或准确性。而检索模块则可以从外部知识库或文档中检索相关的信息,将这些信息作为额外的输入,提供给生成模型,从而帮助生成更准确、更丰富和更具体的文本。
具体来说,RAG模型的工作流程如下:
- 检索阶段:模型首先根据输入的查询或上下文,从外部知识库中检索出与之最相关的文档或片段。
- 融合阶段:检索到的信息与输入的查询或上下文进行融合,形成增强的输入。
- 生成阶段:增强后的输入被送入生成模型,生成模型根据这些信息生成最终的文本输出。
通过这种方式,RAG模型能够在生成过程中利用到外部知识,提高了生成文本的准确性和丰富性,同时也增强了模型的可解释性,因为生成的文本可以追溯到具体的来源。RAG模型在处理需要大量领域知识或具体事实信息的任务时,表现出了显著的优势。
SimpleRAG介绍
A simple RAG demo based on WPF and Semantic Kernel.
SimpleRAG是基于WPF与Semantic Kernel实现的一个简单的RAG应用,可用于学习与理解如何使用Semantic Kernel构建一个简单的RAG应用。
GitHub地址:https://github.com/Ming-jiayou/SimpleRAG
主要功能
AI聊天
支持所有兼容OpenAI格式的大语言模型:
文本嵌入
支持所有兼容OpenAI格式的嵌入模型:
简单的RAG回答
简单的RAG回答效果:
对比不使用RAG的回答:
使用Ollama本地离线体验SimpleRAG
来到SimpleRAG的GitHub参考,注意到这里有个Releases:
点击SimpleRAG-v0.0.1,有两个压缩包,一个依赖net8.0-windows框架,一个独立:
依赖框架的包会小一些,独立的包会大一些,如果你的电脑已经装了net8.0-windows框架可以选择依赖框架的包,考虑到可能大部分人不一定装了net8.0-windows框架,我以独立的包做演示,点击压缩包,就在下载了:
解压该压缩包:
打开appsettings.json文件:
appsettings.json文件如下所示:
在你的电脑上启动Ollama,在命令行中输入ollama list 查看已经下载的模型:
由于我电脑的配置不是很好,对话模型以gemma2:2b为例,嵌入模型以bge-m3:latest为例,appsettings.json文件这样写:
Endpoint输入Ollama的地址,默认是http://localhost:11434,Ollama不需要Api Key随便写。
现在点击SimpleRAG.exe即可运行程序:
程序运行之后,如下所示:
先通过AI聊天测试配置是否成功:
配置已经成功。
现在来测试一下嵌入。
先拿一个简单的文本进行测试:
小k最喜欢的编程语言是C#。
嵌入成功:
这个Demo程序为了方便存储文本向量使用的是Sqlite数据库,在这里可以看到:
如果你有数据库管理软件的话,打开该数据库,会发现文本已经以向量的形式存入Sqlite数据库中:
现在开始测试RAG回答效果:
对比不使用RAG的回答效果:
可以发现大语言模型根本不知道我们想问的私有数据的事情。
现在我们可以来测试一下更复杂一点的文本了,一样的嵌入文本之后,测试RAG效果:
RAG回答失败了,这是因为我使用的模型参数太少了,还不够强大。如果你的电脑配置好,可以改用更智能的模型,如果你的电脑配置不好,可以选择混合使用的方式,即使用在线的对话模型Api,使用本地Ollama中的嵌入模型。
使用在线对话Api+本地Ollama嵌入模型体验SimpleRAG
appsettings.json可以这样写:
测试RAG效果:
RAG还是失败了。
模型换成meta-llama/Meta-Llama-3.1-8B-Instruct:
模型换成google/gemma-2-9b-it:
模型换成Qwen/Qwen2-72B-Instruct:
通过源码找原因:
将相关度调成0.3就可以找到相关文本了,但是感觉这样也会出问题,文档一多很容易找到不相关的文档,后面appsettings.json中会增加相关度的配置:
现在再测试一下Qwen/Qwen2-7B-Instruct:
也可以了。
对比不使用RAG的回答效果:
最后
如果对你有所帮助,点个Star✨,就是最大的支持😊。
如果您看了指南,还是遇到了问题,欢迎通过我的公众号联系我: