Ollama本地大模型部署与实战指南:从模型管理到私有化API服务与多模型编排全流程解析

举报
江南清风起 发表于 2026/08/25 19:07:46 2026/08/25
【摘要】 Ollama本地大模型部署与实战指南:从模型管理到私有化API服务与多模型编排全流程解析 引言Ollama是2026年最受欢迎的本地大模型运行工具,它让开发者能够在个人电脑上一键运行开源大语言模型,无需复杂的GPU配置和环境依赖。Ollama的设计理念是"Docker for LLMs"——用类似Docker的命令行体验来管理LLM的拉取、运行和管理。它支持Llama、Qwen、Mistr...

Ollama本地大模型部署与实战指南:从模型管理到私有化API服务与多模型编排全流程解析

引言

Ollama是2026年最受欢迎的本地大模型运行工具,它让开发者能够在个人电脑上一键运行开源大语言模型,无需复杂的GPU配置和环境依赖。Ollama的设计理念是"Docker for LLMs"——用类似Docker的命令行体验来管理LLM的拉取、运行和管理。它支持Llama、Qwen、Mistral、DeepSeek、Gemma等主流开源模型,自动处理模型量化、GPU/CPU推理切换、上下文管理等底层细节。本文将从Ollama的安装配置开始,系统性地讲解模型管理、API服务、自定义模型创建、多模型编排、与RAG框架集成、性能优化以及生产部署等核心内容,通过大量可运行的代码示例帮助读者构建本地LLM应用。

一、Ollama安装与核心架构

1.1 安装

# macOS安装
brew install ollama

# Linux一键安装
curl -fsSL https://ollama.com/install.sh | sh

# 验证安装
ollama --version

# 查看运行状态
ollama list

安装完成后,Ollama服务会自动在后台启动(默认端口11434)。在macOS上,Ollama以应用形式运行;在Linux上,以systemd服务形式运行。以下是服务管理命令:

# Linux systemd管理
sudo systemctl status ollama
sudo systemctl restart ollama

# 查看服务日志
journalctl -u ollama -f

# 修改服务配置(如监听地址、模型存储路径)
sudo systemctl edit ollama
# 添加:
# [Service]
# Environment="OLLAMA_HOST=0.0.0.0:11434"
# Environment="OLLAMA_MODELS=/data/ollama/models"

1.2 核心架构

Ollama的架构由以下核心组件构成。Model Registry是模型注册表,存储可用模型的元数据和下载地址,类似于Docker Hub的镜像仓库。llama.cpp是底层推理引擎,Ollama基于llama.cpp构建,支持GGUF格式的量化模型。Model Runner是模型运行器,负责加载模型到GPU或CPU,管理推理会话和上下文。API Server是HTTP API服务器,提供与OpenAI兼容的REST API。Modelfile系统类似Dockerfile,允许用户自定义模型配置、系统提示和参数。以下是架构的概念表示:

┌─────────────────────────────────────────────────┐
│                   Ollama CLI / API               │
├─────────────────────────────────────────────────┤
│  Model Manager  │  API Server (:11434)          │
│  - pull/run/rm  │  - /api/generate              │
│  - Modelfile    │  - /api/chat                  │
│  - Model Store  │  - /api/embeddings            │
├─────────────────────────────────────────────────┤
│              Model Runner / Scheduler            │
│  - GPU/CPU detection  │  - Context management    │
│  - Memory management  │  - Concurrent sessions   │
├─────────────────────────────────────────────────┤
│              llama.cpp (GGUF inference)          │
│  - Quantization (Q4/Q5/Q8/FP16)                 │
│  - KV Cache  │  - Attention (Flash/standard)    │
└─────────────────────────────────────────────────┘

二、模型管理实战

2.1 拉取与运行模型

# 拉取模型(会自动选择适合硬件的量化版本)
ollama pull qwen2.5:72b
ollama pull qwen2.5:7b
ollama pull llama3.2:3b
ollama pull deepseek-r1:14b
ollama pull nomic-embed-text  # 嵌入模型

# 列出已安装模型
ollama list

# 查看模型信息
ollama show qwen2.5:7b

# 运行模型(交互式)
ollama run qwen2.5:7b

# 运行模型(单次查询)
ollama run qwen2.5:7b "解释什么是PagedAttention"

# 删除模型
ollama rm qwen2.5:7b

2.2 模型选择指南

不同模型在显存需求、推理速度和能力上有显著差异。以下是一个模型选择参考脚本:

import subprocess
import json

def get_gpu_info():
    """获取GPU信息。"""
    try:
        result = subprocess.run(
            ["nvidia-smi", "--query-gpu=name,memory.total", "--format=csv,noheader"],
            capture_output=True, text=True
        )
        return result.stdout.strip()
    except Exception:
        return "No NVIDIA GPU detected"

def recommend_model(vram_gb: float, use_case: str = "general"):
    """根据显存大小推荐模型。"""
    models = [
        {"name": "qwen2.5:0.5b", "vram": 1, "speed": "极快", "quality": "基础"},
        {"name": "qwen2.5:1.5b", "vram": 2, "speed": "很快", "quality": "一般"},
        {"name": "qwen2.5:3b", "vram": 3, "speed": "快", "quality": "较好"},
        {"name": "qwen2.5:7b", "vram": 6, "speed": "中等", "quality": "好"},
        {"name": "qwen2.5:14b", "vram": 10, "speed": "中等", "quality": "很好"},
        {"name": "qwen2.5:32b", "vram": 22, "speed": "较慢", "quality": "优秀"},
        {"name": "qwen2.5:72b", "vram": 48, "speed": "慢", "quality": "卓越"},
    ]

    print(f"\nGPU显存: {vram_gb:.1f} GB")
    print(f"使用场景: {use_case}\n")
    print(f"{'模型':25s} {'显存需求':>8s} {'速度':>6s} {'质量':>6s} {'推荐':>6s}")
    print("-" * 60)

    for m in models:
        can_run = m["vram"] <= vram_gb
        # 留20%余量
        recommended = can_run and m["vram"] <= vram_gb * 0.8
        mark = "✓ 推荐" if recommended else ("○ 可用" if can_run else "✗ 超限")
        print(f"{m['name']:25s} {m['vram']:>6d}GB {m['speed']:>6s} {m['quality']:>6s} {mark:>10s}")

# 示例
gpu_info = get_gpu_info()
print(f"GPU信息: {gpu_info}")
recommend_model(vram_gb=24, use_case="代码生成")

三、API服务与编程集成

3.1 REST API

Ollama提供完整的REST API,默认监听11434端口:

import requests
import json

OLLAMA_URL = "http://localhost:11434"

# 1. 生成补全(非对话模式)
response = requests.post(f"{OLLAMA_URL}/api/generate", json={
    "model": "qwen2.5:7b",
    "prompt": "写一个Python快速排序函数",
    "stream": False,
    "options": {
        "temperature": 0.7,
        "top_p": 0.9,
        "num_predict": 512,
    },
})
print(response.json()["response"])

# 2. 对话模式
response = requests.post(f"{OLLAMA_URL}/api/chat", json={
    "model": "qwen2.5:7b",
    "messages": [
        {"role": "system", "content": "你是一个Python专家。"},
        {"role": "user", "content": "如何优化asyncio性能?"},
    ],
    "stream": False,
    "options": {"temperature": 0.3, "num_predict": 1024},
})
print(response.json()["message"]["content"])

# 3. 流式输出
response = requests.post(f"{OLLAMA_URL}/api/chat", json={
    "model": "qwen2.5:7b",
    "messages": [{"role": "user", "content": "写一首关于编程的诗"}],
    "stream": True,
}, stream=True)
for line in response.iter_lines():
    if line:
        data = json.loads(line)
        if "message" in data:
            print(data["message"]["content"], end="", flush=True)

# 4. 生成嵌入
response = requests.post(f"{OLLAMA_URL}/api/embeddings", json={
    "model": "nomic-embed-text",
    "prompt": "vLLM是一个高性能LLM推理引擎",
})
embedding = response.json()["embedding"]
print(f"Embedding维度: {len(embedding)}")

# 5. 查看运行中的模型
response = requests.get(f"{OLLAMA_URL}/api/ps")
print(f"运行中的模型: {response.json()}")

3.2 Python SDK

# 使用ollama Python SDK
import ollama

# 对话
response = ollama.chat(
    model="qwen2.5:7b",
    messages=[
        {"role": "system", "content": "你是一个技术文档助手。"},
        {"role": "user", "content": "解释Docker网络模式。"},
    ],
    options={"temperature": 0.3},
)
print(response["message"]["content"])

# 流式对话
for chunk in ollama.chat(
    model="qwen2.5:7b",
    messages=[{"role": "user", "content": "写一个Go语言的HTTP服务器"}],
    stream=True,
):
    print(chunk["message"]["content"], end="", flush=True)

# 生成嵌入
embed = ollama.embeddings(
    model="nomic-embed-text",
    prompt="PostgreSQL是一个强大的开源关系数据库",
)
print(f"嵌入维度: {len(embed['embedding'])}")

# 模型管理
ollama.pull("qwen2.5:14b")  # 拉取模型
ollama.list()                # 列出模型
ollama.show("qwen2.5:7b")    # 模型信息

3.3 OpenAI兼容API

Ollama提供OpenAI兼容的API端点,可以直接使用OpenAI SDK:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",  # 任意值即可
)

# 完全兼容OpenAI API
response = client.chat.completions.create(
    model="qwen2.5:7b",
    messages=[
        {"role": "system", "content": "你是一个代码审查专家。"},
        {"role": "user", "content": "审查以下代码的安全性:\n```python\ndef query(user_input):\n    cursor.execute(f'SELECT * FROM users WHERE name={user_input}')\n```"},
    ],
    temperature=0.2,
)
print(response.choices[0].message.content)

# 嵌入
embed = client.embeddings.create(
    model="nomic-embed-text",
    input="Docker是一种容器化技术",
)
print(f"维度: {len(embed.data[0].embedding)}")

四、自定义模型(Modelfile)

4.1 创建自定义模型

Modelfile类似Dockerfile,允许自定义模型的行为:

# Modelfile - 技术文档助手模型
FROM qwen2.5:7b

# 系统提示
SYSTEM """
你是一个专业的技术文档撰写助手。你的任务是帮助开发者编写清晰、准确的技术文档。
规则:
1. 使用Markdown格式
2. 包含代码示例
3. 语言简洁专业
4. 中文回答,代码和术语保持英文
"""

# 参数
PARAMETER temperature 0.3
PARAMETER top_p 0.9
PARAMETER num_ctx 8192
PARAMETER stop "<|im_end|>"
PARAMETER repeat_penalty 1.1

# 模板
TEMPLATE """
{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
{{ .Response }}<|im_end|>
"""
# 构建自定义模型
ollama create tech-doc-assistant -f Modelfile

# 运行自定义模型
ollama run tech-doc-assistant "为FastAPI写一份API文档模板"

# 查看自定义模型信息
ollama show tech-doc-assistant --modelfile

4.2 多种自定义模型

# Modelfile.code-reviewer - 代码审查专家
FROM qwen2.5:14b
SYSTEM """
你是资深代码审查员。审查代码时关注:
1. 安全漏洞(SQL注入、XSS、路径遍历)
2. 性能问题(N+1查询、内存泄漏)
3. 错误处理缺失
4. 代码可维护性
输出格式:
## 严重问题(必须修复)
## 建议改进
## 良好实践
## 总评
"""
PARAMETER temperature 0.1
PARAMETER num_ctx 16384
# Modelfile.sql-expert - SQL专家
FROM qwen2.5:7b
SYSTEM """
你是PostgreSQL专家。帮助用户:
1. 编写高效的SQL查询
2. 设计数据库schema
3. 优化查询性能
4. 解决数据建模问题
"""
PARAMETER temperature 0.2
PARAMETER num_ctx 8192
# 构建所有自定义模型
ollama create code-reviewer -f Modelfile.code-reviewer
ollama create sql-expert -f Modelfile.sql-expert

五、多模型编排

5.1 模型路由服务

以下是一个根据查询类型自动路由到不同模型的编排服务:

from fastapi import FastAPI
from pydantic import BaseModel
import ollama
import re
from typing import Optional

app = FastAPI(title="Multi-Model Router")

class QueryRequest(BaseModel):
    query: str
    model: Optional[str] = None  # 手动指定模型
    context: Optional[str] = None

class QueryResponse(BaseModel):
    answer: str
    model_used: str
    routing_reason: str

def route_query(query: str) -> tuple[str, str]:
    """根据查询内容自动路由到最合适的模型。"""
    query_lower = query.lower()

    # 代码审查
    if any(kw in query_lower for kw in ["审查", "review", "代码质量", "安全漏洞"]):
        return "code-reviewer", "检测到代码审查相关关键词"

    # SQL相关
    if any(kw in query_lower for kw in ["sql", "查询", "数据库", "表结构", "索引"]):
        return "sql-expert", "检测到数据库相关关键词"

    # 代码生成
    if any(kw in query_lower for kw in ["写", "实现", "函数", "代码", "code", "implement"]):
        return "qwen2.5:14b", "代码生成任务需要更强模型"

    # 日常对话
    return "qwen2.5:7b", "通用对话使用轻量模型"

@app.post("/query", response_model=QueryResponse)
async def query(req: QueryRequest):
    # 路由
    if req.model:
        model = req.model
        reason = "用户手动指定"
    else:
        model, reason = route_query(req.query)

    # 构建消息
    messages = []
    if req.context:
        messages.append({"role": "system", "content": f"上下文:{req.context}"})
    messages.append({"role": "user", "content": req.query})

    # 调用Ollama
    response = ollama.chat(
        model=model,
        messages=messages,
        options={"temperature": 0.3, "num_predict": 2048},
    )

    return QueryResponse(
        answer=response["message"]["content"],
        model_used=model,
        routing_reason=reason,
    )

@app.get("/models")
async def list_models():
    """列出可用模型及其用途。"""
    return {
        "models": [
            {"name": "qwen2.5:7b", "purpose": "通用对话", "speed": "快"},
            {"name": "qwen2.5:14b", "purpose": "代码生成", "speed": "中等"},
            {"name": "code-reviewer", "purpose": "代码审查", "speed": "中等"},
            {"name": "sql-expert", "purpose": "SQL专家", "speed": "快"},
            {"name": "tech-doc-assistant", "purpose": "技术文档", "speed": "快"},
        ]
    }

5.2 流水线编排

以下是一个多模型流水线编排示例,实现从需求到代码到测试的完整开发流程:

import ollama
from typing import Dict, List

class DevPipeline:
    """多模型开发流水线。"""

    def __init__(self):
        self.steps: List[Dict] = []

    def add_step(self, name: str, model: str, system_prompt: str, extract_fn=None):
        """添加流水线步骤。"""
        self.steps.append({
            "name": name,
            "model": model,
            "system_prompt": system_prompt,
            "extract_fn": extract_fn,
        })
        return self

    def run(self, task: str) -> Dict:
        """执行完整流水线。"""
        results = {}
        current_input = task

        for step in self.steps:
            print(f"\n=== Step: {step['name']} (model: {step['model']}) ===")

            response = ollama.chat(
                model=step["model"],
                messages=[
                    {"role": "system", "content": step["system_prompt"]},
                    {"role": "user", "content": current_input},
                ],
                options={"temperature": 0.3, "num_predict": 2048},
                stream=True,
            )

            output = ""
            for chunk in response:
                content = chunk["message"]["content"]
                print(content, end="", flush=True)
                output += content

            # 提取关键内容传递给下一步
            if step["extract_fn"]:
                current_input = step["extract_fn"](output)
            else:
                current_input = output

            results[step["name"]] = output

        return results


# 使用示例
pipeline = DevPipeline()

# 步骤1: 需求分析
pipeline.add_step(
    name="requirements",
    model="qwen2.5:7b",
    system_prompt="你是产品经理。分析用户需求,输出结构化的功能需求列表和非功能需求。格式:用Markdown列表。",
)

# 步骤2: 架构设计
pipeline.add_step(
    name="architecture",
    model="qwen2.5:14b",
    system_prompt="你是架构师。基于需求设计系统架构,包括技术选型、模块划分和数据流。输出Markdown格式。",
    extract_fn=lambda x: f"需求分析:{x}\n\n请基于以上需求设计架构。",
)

# 步骤3: 代码实现
pipeline.add_step(
    name="implementation",
    model="qwen2.5:14b",
    system_prompt="你是资深开发者。基于架构设计,实现核心代码。输出完整的代码,包含类型注解和错误处理。",
    extract_fn=lambda x: f"架构设计:{x}\n\n请基于以上架构实现核心代码。",
)

# 步骤4: 测试用例
pipeline.add_step(
    name="testing",
    model="qwen2.5:7b",
    system_prompt="你是测试工程师。为代码编写单元测试,覆盖正常路径和边界条件。",
    extract_fn=lambda x: f"代码实现:{x}\n\n请为以上代码编写测试。",
)

# 执行流水线
results = pipeline.run("实现一个用户注册API,支持邮箱验证、密码强度检查和防止重复注册")

六、Ollama与RAG集成

6.1 完整本地RAG系统

以下是一个完全基于Ollama的本地RAG系统,不依赖任何外部API:

import ollama
import chromadb
from typing import List, Dict
import re
import hashlib

class LocalRAG:
    """完全本地的RAG系统,使用Ollama进行嵌入和生成。"""

    def __init__(self, embedding_model: str = "nomic-embed-text", llm_model: str = "qwen2.5:7b"):
        self.embedding_model = embedding_model
        self.llm_model = llm_model
        self.chroma = chromadb.PersistentClient(path="./chroma_db")
        self.collection = self.chroma.get_or_create_collection(
            name="documents",
            metadata={"hnsw:space": "cosine"},
        )

    def embed(self, text: str) -> List[float]:
        """使用Ollama生成嵌入。"""
        response = ollama.embeddings(model=self.embedding_model, prompt=text)
        return response["embedding"]

    def add_documents(self, texts: List[str], metadatas: List[Dict] = None):
        """添加文档到知识库。"""
        metadatas = metadatas or [{} for _ in texts]

        # 分块
        all_chunks = []
        all_embeddings = []
        all_ids = []
        all_metadatas = []

        for i, text in enumerate(texts):
            chunks = self._split_text(text, chunk_size=500, overlap=50)
            for j, chunk in enumerate(chunks):
                content_hash = hashlib.md5(chunk.encode()).hexdigest()
                all_chunks.append(chunk)
                all_embeddings.append(self.embed(chunk))
                all_ids.append(f"doc_{i}_chunk_{j}_{content_hash[:8]}")
                all_metadatas.append({
                    **metadatas[i],
                    "chunk_index": j,
                    "total_chunks": len(chunks),
                })

        # 存入ChromaDB
        self.collection.upsert(
            ids=all_ids,
            documents=all_chunks,
            embeddings=all_embeddings,
            metadatas=all_metadatas,
        )
        print(f"添加 {len(texts)} 个文档,共 {len(all_chunks)} 个块")

    def _split_text(self, text: str, chunk_size: int = 500, overlap: int = 50) -> List[str]:
        """文本分块。"""
        sentences = re.split(r'(?<=[。!?.!?])\s+', text)
        chunks = []
        current = ""
        for sent in sentences:
            if len(current) + len(sent) > chunk_size and current:
                chunks.append(current)
                current = sent
            else:
                current = f"{current} {sent}" if current else sent
        if current:
            chunks.append(current)
        return chunks

    def retrieve(self, query: str, top_k: int = 5) -> List[Dict]:
        """检索相关文档。"""
        query_embedding = self.embed(query)
        results = self.collection.query(
            query_embeddings=[query_embedding],
            n_results=top_k,
        )

        docs = []
        for i in range(len(results["documents"][0])):
            docs.append({
                "text": results["documents"][0][i],
                "score": 1 - results["distances"][0][i],  # 转换距离为相似度
                "metadata": results["metadatas"][0][i],
            })
        return docs

    def generate(self, query: str, retrieved_docs: List[Dict]) -> str:
        """基于检索结果生成答案。"""
        context = "\n\n".join([
            f"[文档{i+1}] (相关度: {d['score']:.2f})\n{d['text']}"
            for i, d in enumerate(retrieved_docs)
        ])

        response = ollama.chat(
            model=self.llm_model,
            messages=[
                {"role": "system", "content": f"""你是一个专业的问答助手。
基于以下检索到的文档上下文回答问题。
如果文档中没有相关信息,说明"根据现有文档无法回答"。

文档上下文:
{context}"""},
                {"role": "user", "content": query},
            ],
            options={"temperature": 0.1, "num_predict": 1024},
        )
        return response["message"]["content"]

    def query(self, question: str) -> Dict:
        """完整RAG查询。"""
        retrieved = self.retrieve(question, top_k=5)
        answer = self.generate(question, retrieved)
        return {
            "answer": answer,
            "sources": [
                {"text": d["text"][:200], "score": d["score"], "metadata": d["metadata"]}
                for d in retrieved
            ],
        }


# 使用示例
rag = LocalRAG(embedding_model="nomic-embed-text", llm_model="qwen2.5:7b")

# 添加文档
rag.add_documents([
    """FastAPI是一个现代的Python Web框架,基于ASGI标准构建。
    它使用Python类型提示进行数据验证和序列化,支持async/await异步编程。
    FastAPI的性能接近NodeJS和Go,是Python中最快的Web框架之一。

    核心特性:
    1. 基于Starlette的ASGI框架
    2. 使用Pydantic进行数据验证
    3. 自动生成OpenAPI文档
    4. 依赖注入系统
    5. WebSocket支持""",

    """Django是一个全功能的Python Web框架,遵循"内置一切"的理念。
    包含ORM、认证系统、admin后台、表单处理、模板引擎等。

    Django的优势:
    1. 完善的ORM支持多种数据库
    2. 内置admin后台
    3. 成熟的安全机制
    4. 丰富的第三方包生态
    5. 适合快速开发内容管理系统""",

    """Flask是一个轻量级Python Web框架,提供最小核心功能。
    通过扩展添加数据库、认证、表单等功能。

    Flask的特点:
    1. 微框架设计,核心简洁
    2. 高度可定制
    3. Jinja2模板引擎
    4. 适合小型项目和微服务
    5. 学习曲线平缓""",
])

# 查询
result = rag.query("哪个Python Web框架适合快速开发CMS?")
print(f"答案: {result['answer']}")
print(f"\n来源: {len(result['sources'])} 个文档")

七、Ollama与LangChain/LlamaIndex集成

7.1 LangChain集成

from langchain_community.llms import Ollama
from langchain_community.embeddings import OllamaEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 使用Ollama作为LLM
llm = Ollama(model="qwen2.5:7b", temperature=0.3)
embeddings = OllamaEmbeddings(model="nomic-embed-text")

# 构建链
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个Python技术专家。"),
    ("user", "{input}"),
])
chain = prompt | llm | StrOutputParser()

result = chain.invoke({"input": "如何使用asyncio实现并发HTTP请求?"})
print(result)

7.2 LlamaIndex集成

from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.core import VectorStoreIndex, Settings, SimpleDirectoryReader

# 配置LlamaIndex使用Ollama
Settings.llm = Ollama(model="qwen2.5:7b", temperature=0.3)
Settings.embed_model = OllamaEmbedding(model_name="nomic-embed-text")

# 加载文档
documents = SimpleDirectoryReader("./docs").load_data()

# 构建索引
index = VectorStoreIndex.from_documents(documents)

# 查询
query_engine = index.as_query_engine(similarity_top_k=3)
response = query_engine.query("什么是PagedAttention?")
print(response.response)

八、性能优化与生产部署

8.1 并发处理

Ollama默认串行处理请求。对于高并发场景,需要配置并发数:

# 设置环境变量
export OLLAMA_NUM_PARALLEL=4  # 同时处理的请求数
export OLLAMA_MAX_LOADED_MODELS=2  # 同时加载的模型数
export OLLAMA_KEEP_ALIVE=10m  # 模型在内存中保持的时间

# 重启服务
sudo systemctl restart ollama

8.2 上下文窗口优化

import ollama

# 增大上下文窗口
response = ollama.chat(
    model="qwen2.5:7b",
    messages=[{"role": "user", "content": "总结这篇长文档"}],
    options={
        "num_ctx": 8192,       # 上下文窗口大小
        "num_predict": 2048,   # 最大生成token数
        "temperature": 0.3,
        "top_p": 0.9,
        "repeat_penalty": 1.1,
    },
)

8.3 Docker部署

# docker-compose.yml
version: '3.8'

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    environment:
      - OLLAMA_NUM_PARALLEL=4
      - OLLAMA_KEEP_ALIVE=10m

  ollama-webui:  # 可选:Open WebUI前端
    image: ghcr.io/open-webui/open-webui:main
    container_name: ollama-webui
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    volumes:
      - webui_data:/app/backend/data
    depends_on:
      - ollama

volumes:
  ollama_data:
  webui_data:

8.4 负载均衡

# 多节点Ollama负载均衡
import requests
from itertools import cycle
from typing import List

class OllamaLoadBalancer:
    """多节点Ollama负载均衡器。"""

    def __init__(self, nodes: List[str]):
        self.nodes = cycle(nodes)
        self.node_health = {node: True for node in nodes}

    def chat(self, model: str, messages: list, **kwargs) -> dict:
        """负载均衡的chat调用。"""
        attempts = 0
        max_attempts = len(self.node_health)

        while attempts < max_attempts:
            node = next(self.nodes)
            if not self.node_health.get(node, False):
                attempts += 1
                continue

            try:
                response = requests.post(
                    f"http://{node}/api/chat",
                    json={"model": model, "messages": messages, **kwargs},
                    timeout=60,
                )
                response.raise_for_status()
                return response.json()
            except requests.exceptions.RequestException as e:
                print(f"Node {node} failed: {e}")
                self.node_health[node] = False
                attempts += 1

        raise RuntimeError("All nodes failed")

    def health_check(self):
        """检查所有节点健康状态。"""
        for node in list(self.node_health.keys()):
            try:
                r = requests.get(f"http://{node}/api/tags", timeout=5)
                self.node_health[node] = r.status_code == 200
            except:
                self.node_health[node] = False
        return self.node_health

# 使用
lb = OllamaLoadBalancer([
    "gpu-node-1:11434",
    "gpu-node-2:11434",
    "gpu-node-3:11434",
])

response = lb.chat(
    model="qwen2.5:7b",
    messages=[{"role": "user", "content": "Hello"}],
)

总结

Ollama作为本地大模型运行工具,凭借极简的使用体验(ollama pull/run)、广泛的模型支持、OpenAI兼容API和Modelfile自定义能力,成为本地LLM部署的事实标准。本文系统性地覆盖了安装配置、模型管理、API服务、自定义模型、多模型编排、RAG集成和性能优化等核心内容。关键要点包括:根据GPU显存选择合适大小的模型;使用Modelfile创建领域专用模型;通过模型路由和流水线编排实现多模型协作;结合ChromaDB等向量数据库构建完全本地的RAG系统;生产部署需要配置并发参数和负载均衡。对于数据敏感场景、开发测试环境或成本控制需求,Ollama提供了最简单的本地LLM运行方案。随着开源模型能力的持续提升,Ollama在企业AI基础设施中的角色将愈发重要。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。