Ollama+granite-4.0组合:小白也能用的RAG应用搭建

1. 引言:为什么选择这个组合?

你是否曾经想过在自己的电脑上搭建一个智能问答系统,却因为技术门槛太高而放弃?或者想要一个能理解你文档内容的AI助手,但不知道从何入手?

今天我要介绍的Ollama+granite-4.0组合,可能就是你在寻找的解决方案。这个组合最大的特点就是简单易用——不需要深厚的技术背景,不需要昂贵的硬件设备,甚至不需要复杂的配置过程。

granite-4.0-h-350m是一个轻量级但功能强大的指令模型,只有3.5亿参数,却支持12种语言(包括中文),能够处理摘要、分类、问答、代码生成等多种任务。而Ollama则是一个让大型语言模型在本地运行变得异常简单的框架。

最重要的是,这个组合特别适合RAG(检索增强生成)应用——也就是让AI能够基于你的特定文档内容来回答问题,而不是仅仅依靠它训练时学到的通用知识。

2. 环境准备与快速部署

2.1 安装Ollama

首先,我们需要安装Ollama框架。这个过程非常简单:

访问Ollama官网(https://ollama.com),选择适合你操作系统的版本下载。支持Windows、macOS和Linux系统。

以Windows为例:

  1. 下载OllamaSetup.exe文件
  2. 双击安装,点击"Install"按钮
  3. 等待安装完成,Ollama会自动启动

安装完成后,你可以在任务栏看到Ollama的图标,右键可以查看日志或退出程序。

2.2 验证安装

打开命令行终端(CMD或PowerShell),输入以下命令检查Ollama是否正常工作:

ollama --version

如果显示版本信息,说明安装成功。

2.3 调整模型存储位置(可选但推荐)

默认情况下,Ollama会把模型下载到C盘用户目录。如果你希望更改存储位置,可以设置环境变量:

  1. 右键点击"此电脑"→"属性"→"高级系统设置"→"环境变量"
  2. 在"系统变量"中点击"新建"
  3. 变量名:OLLAMA_MODELS
  4. 变量值:你想要存储的路径,比如E:\ollama\models
  5. 重启Ollama服务使设置生效

3. 部署granite-4.0模型

3.1 拉取模型

现在我们来获取granite-4.0-h-350m模型。在命令行中输入:

ollama pull granite4:350m-h

这个过程可能需要几分钟时间,取决于你的网络速度。模型大小约700MB左右,相比动辄几十GB的大模型,可以说是非常轻量了。

3.2 验证模型

下载完成后,运行以下命令测试模型是否正常工作:

ollama run granite4:350m-h "你好,请介绍一下你自己"

如果模型正确回应,说明部署成功!

4. 构建简单的RAG应用

4.1 什么是RAG?

RAG(Retrieval-Augmented Generation,检索增强生成)是一种让AI模型能够基于特定文档内容来回答问题的技术。简单来说,就是:

  1. 把你的文档内容转换成可搜索的形式
  2. 当用户提问时,先找到相关的文档片段
  3. 让AI基于这些片段生成回答

这样得到的答案更加准确和具体,因为是基于你提供的真实内容。

4.2 准备文档数据

首先,我们需要一些文档作为知识库。创建一个名为documents的文件夹,里面放一些文本文件(.txt格式),比如:

  • company_intro.txt(公司介绍)
  • product_manual.txt(产品手册)
  • faq.txt(常见问题解答)

每个文件包含一些文本内容,这些将是我们的知识来源。

4.3 创建简单的检索系统

由于granite-4.0是纯文本模型,我们需要先构建一个简单的检索系统。创建一个Python脚本rag_simple.py

import os
import json
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

class SimpleRAG:
    def __init__(self, documents_folder):
        self.documents = []
        self.document_files = []
        
        # 读取所有文档
        for filename in os.listdir(documents_folder):
            if filename.endswith('.txt'):
                with open(os.path.join(documents_folder, filename), 'r', encoding='utf-8') as f:
                    content = f.read()
                    self.documents.append(content)
                    self.document_files.append(filename)
        
        # 创建TF-IDF向量器
        self.vectorizer = TfidfVectorizer()
        self.document_vectors = self.vectorizer.fit_transform(self.documents)
    
    def retrieve(self, query, top_k=3):
        # 将查询转换为向量
        query_vector = self.vectorizer.transform([query])
        
        # 计算相似度
        similarities = cosine_similarity(query_vector, self.document_vectors)
        
        # 获取最相关的文档
        top_indices = similarities.argsort()[0][-top_k:][::-1]
        
        results = []
        for idx in top_indices:
            results.append({
                'file': self.document_files[idx],
                'content': self.documents[idx][:500] + '...'  # 截取前500字符
            })
        
        return results

# 使用示例
if __name__ == "__main__":
    rag = SimpleRAG('documents')
    results = rag.retrieve("产品有哪些功能?")
    print("相关文档:", results)

4.4 集成Ollama进行问答

现在我们将检索系统与Ollama集成,创建完整的RAG流程:

import requests
import json

class OllamaRAG:
    def __init__(self, documents_folder):
        self.retriever = SimpleRAG(documents_folder)
    
    def ask(self, question):
        # 第一步:检索相关文档
        relevant_docs = self.retriever.retrieve(question)
        
        # 构建提示词
        context = "\n\n".join([f"来自{doc['file']}的内容:{doc['content']}" for doc in relevant_docs])
        
        prompt = f"""基于以下文档内容,请回答用户的问题。

相关文档内容:
{context}

用户问题:{question}

请根据上述文档内容回答问题,如果文档中没有相关信息,请如实告知。"""

        # 第二步:调用Ollama生成回答
        response = requests.post(
            'http://localhost:11434/api/generate',
            json={
                'model': 'granite4:350m-h',
                'prompt': prompt,
                'stream': False
            }
        )
        
        if response.status_code == 200:
            return response.json()['response']
        else:
            return "抱歉,生成回答时出现错误。"

# 使用示例
if __name__ == "__main__":
    rag_system = OllamaRAG('documents')
    
    while True:
        question = input("\n请输入你的问题(输入'退出'结束):")
        if question.lower() == '退出':
            break
            
        answer = rag_system.ask(question)
        print(f"\n回答:{answer}")

5. 进阶技巧与优化建议

5.1 提升检索效果

简单的TF-IDF检索在某些场景下可能不够准确,你可以考虑:

  1. 使用更先进的嵌入模型:如Sentence-BERT等深度学习模型
  2. 添加元数据过滤:根据文档类型、时间等进行筛选
  3. 实现混合检索:结合关键词检索和语义检索

5.2 优化提示词工程

granite-4.0对提示词比较敏感,好的提示词能显著提升效果:

def build_better_prompt(question, context):
    return f"""你是一个专业的助手,需要基于提供的文档内容回答问题。

# 文档内容:
{context}

# 用户问题:
{question}

# 回答要求:
1. 只基于上述文档内容回答,不要使用外部知识
2. 如果文档中没有相关信息,请说"根据现有文档,无法回答这个问题"
3. 回答要简洁明了,直接针对问题
4. 可以适当引用文档中的具体信息

请开始回答:"""

5.3 处理长文档

对于长文档,可以考虑以下策略:

  1. 文档分块:将长文档分成较小的段落(200-500字)
  2. 层次检索:先检索相关文档,再在文档内检索相关段落
  3. 摘要生成:对长文档先生成摘要,检索时先用摘要筛选

6. 实际应用案例

6.1 企业知识库问答

假设你有一家小公司,有很多产品文档、流程说明等。使用这个RAG系统,新员工可以快速找到需要的信息:

  • "我们公司的休假政策是什么?"
  • "产品X的技术规格有哪些?"
  • "报销流程需要哪些步骤?"

6.2 学习助手

如果你正在学习某个主题,可以把相关教材、论文整理成文档:

  • "机器学习中的过拟合是什么意思?"
  • "请总结第三章的主要内容"
  • "这个概念在实际中如何应用?"

6.3 个人知识管理

整理你的读书笔记、项目文档等:

  • "我去年关于项目管理的笔记有哪些要点?"
  • "那本关于习惯养成的书主要讲了什么?"

7. 常见问题解答

7.1 模型响应慢怎么办?

granite-4.0-h-350m本身速度很快,如果感觉慢可能是以下原因:

  1. 硬件限制:确保有足够的内存(至少8GB)
  2. 并发设置:检查Ollama的环境变量配置
  3. 网络问题:如果是第一次运行,可能需要下载模型

7.2 回答不准确如何改善?

  1. 检查检索效果:确保相关文档能被正确检索到
  2. 优化提示词:给模型更明确的指令和约束
  3. 调整温度参数:降低温度值让回答更确定性

7.3 支持哪些文件格式?

目前的简单版本只支持txt文本文件,但你可以扩展支持:

  • PDF:使用PyPDF2或pdfplumber提取文本
  • Word:使用python-docx库
  • 网页:使用BeautifulSoup解析HTML

8. 总结

通过Ollama+granite-4.0组合,我们搭建了一个简单但实用的RAG应用。这个方案的优势在于:

  1. 低门槛:不需要深度学习专业知识
  2. 低成本:可以在普通电脑上运行
  3. 高效率:从安装到应用搭建只需小时级别
  4. 可扩展:可以根据需要不断优化和改进

无论你是想为企业搭建知识库,还是为个人学习创建助手,这个组合都能提供一个很好的起点。最重要的是,你可以完全控制数据和隐私,所有处理都在本地进行。

现在就开始尝试吧,相信你会发现更多有趣的应用场景!


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐