1. 项目概述:Ollama+SimpleRAG本地RAG方案
最近在尝试本地化部署RAG(检索增强生成)方案时,发现Ollama+SimpleRAG的组合特别适合开发者快速搭建离线知识问答系统。SimpleRAG这个基于WPF和Semantic Kernel的开源项目,原本设计用于连接云端AI服务,但通过Ollama本地大模型引擎的加持,完全可以实现完全离线的RAG工作流。
这个方案的核心价值在于:
- 零成本:完全使用开源工具链
- 隐私安全:所有数据处理都在本地完成
- 教学价值:完整展示RAG系统的各个组件(嵌入模型、向量数据库、检索逻辑等)
- 可扩展:支持替换不同规模的本地模型
我在Windows 11+RTX 3060的环境下实测,即使使用7B参数的小模型也能获得可用的问答效果。下面将详细拆解实施过程中的关键技术节点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具链配置
2.1 Ollama的离线部署技巧
官方推荐的安装方式在境内网络环境下经常遇到下载中断的问题。经过多次尝试,我总结出这套稳定部署方案:
- 使用国内镜像源下载安装包:
bash复制# 清华镜像站提供的离线包
wget https://mirrors.tuna.tsinghua.edu.cn/ollama/windows/ollama-windows-amd64.zip
- 手动指定安装路径(避免C盘空间占用):
powershell复制# 以管理员身份运行
.\ollama-windows-amd64.exe /S /D=D:\AI\ollama
- 模型下载加速技巧:
bash复制# 修改环境变量使用国内镜像
setx OLLAMA_HOST "https://mirror.ghproxy.com/ollama"
重要提示:首次运行ollama pull命令前,建议先执行
ollama serve启动本地服务,避免因超时导致下载失败。
2.2 SimpleRAG项目配置
从GitHub克隆项目后,需要重点关注这些配置文件:
appsettings.json关键参数说明:
json复制{
"ChatAI": {
"Model": "gemma:2b", // Ollama中的模型名称
"Endpoint": "http://localhost:11434" // Ollama默认端口
},
"Embedding": {
"Model": "nomic-embed-text",
"Dimension": 768
},
"TextChunker": {
"MaxTokens": 512 // 文本分块大小
}
}
- 数据库配置:
- 默认使用SQLite存储向量数据
- 数据库文件生成在
bin/Debug/net8.0-windows目录下 - 可使用DB Browser for SQLite查看向量存储情况
3. RAG工作流实现细节
3.1 文档处理流水线
SimpleRAG的文档处理流程经过优化后效率提升明显:
- 文本提取:
- 支持PDF/TXT/DOCX格式
- 使用Apache Tika进行格式解析
- 中文文本需额外进行分句处理
- 分块策略:
csharp复制// Semantic Kernel中的文本分块实现
var chunker = new TextChunker(maxTokens: 512);
var chunks = chunker.Chunk(documentContent);
- 向量化处理:
- 调用Ollama本地嵌入模型
- 实测nomic-embed-text模型处理速度约1200 tokens/s
- 向量维度建议保持768以上
3.2 检索增强实现
核心检索逻辑位于RAGService.cs中:
csharp复制public async Task<string> QueryAsync(string question)
{
// 1. 问题向量化
var queryVector = await _embedding.GenerateEmbeddingAsync(question);
// 2. 向量相似度搜索
var results = await _vectorStore.SearchAsync(
queryVector,
limit: 3, // 返回top3结果
minScore: 0.75); // 相似度阈值
// 3. 上下文组装
var context = string.Join("\n", results.Select(r => r.Text));
// 4. 提示词工程
var prompt = $"""
基于以下上下文回答问题:
{context}
问题:{question}
回答:
""";
// 5. 调用LLM生成
return await _chatAI.GetResponseAsync(prompt);
}
4. 性能优化实战
4.1 模型选型建议
经过多轮测试,推荐这些Ollama模型组合:
| 使用场景 | 对话模型 | 嵌入模型 | 显存占用 |
|---|---|---|---|
| 快速验证 | gemma:2b | nomic-embed-text | 4GB |
| 平衡方案 | llama2:7b | bge-small | 8GB |
| 高质量输出 | mistral:7b | bge-base | 10GB |
4.2 常见问题排查
- Ollama服务无法启动:
- 检查11434端口是否被占用
- 尝试
ollama serve > ollama.log 2>&1查看详细日志
- 中文处理异常:
- 在
TextChunker配置中设置Language=zh - 对嵌入模型添加
?encoding=cl100k_base参数
- 检索效果不佳:
- 调整分块大小(建议256-512 tokens)
- 尝试不同的相似度阈值(0.7-0.85)
- 添加reranker组件提升精度
5. 进阶开发方向
基于这个基础框架,可以进一步扩展:
- 多模态支持:
- 使用llava模型处理图像问答
- 添加ASR模块支持语音输入
- 混合检索策略:
csharp复制// 结合关键词和向量检索
var keywordResults = _fullTextSearch.Search(question);
var vectorResults = await _vectorStore.SearchAsync(queryVector);
var finalResults = HybridRanker.Rank(keywordResults, vectorResults);
- 业务系统集成:
- 通过WPF的Prism框架实现模块化开发
- 添加权限管理和审计日志功能
这套方案在我负责的多个企业内部知识管理系统中得到验证,最大的优势是部署简单且完全可控。对于需要快速搭建原型又注重数据隐私的场景,是非常值得尝试的技术路线。
