Ollama 模型交互

发布于:2025-09-13 ⋅ 阅读:(23) ⋅ 点赞:(0)

Ollama 模型交互接口全解析

Ollama 提供了简洁易用的模型交互接口,核心通过 REST API 实现与本地部署模型的对话、文本生成等功能。

一、功能介绍

Ollama 的模型交互接口主要有两个:/chat(对话接口)和 /generate(文本生成接口),两者均通过 POST 方法调用,支持 JSON 格式交互。

接口地址 核心功能 适用场景 特点
/api/chat 多轮对话,支持上下文关联 聊天机器人、智能助手、多轮问答 保留对话历史,支持 system 提示词
/api/generate 单次文本生成,无上下文(独立请求) 内容续写、代码生成、摘要生成 直接基于 prompt 生成,无历史依赖

1. /chat 接口:多轮对话场景

  • 核心能力:维护对话上下文,支持 user(用户)、assistant(模型)、system(系统提示)三种角色的消息交互。
  • 典型流程:用户输入 → 模型基于历史对话生成响应 → 新增响应到对话历史 → 下一轮交互。

2. /generate 接口:单次生成场景

  • 核心能力:基于单次输入的 prompt 生成文本,不保留历史记录,每次请求相互独立。
  • 典型流程:输入提示词 → 模型生成结果 → 直接返回(无状态存储)。

二、参数说明(请求与响应)

1. 通用请求参数(两类接口共通)

参数名 类型 必选 说明
model string 模型名称(需提前下载,如 phi3mistral:7bqwen:1.8b
stream boolean 是否启用流式响应:
- true:逐段返回结果(适合实时显示)
- false:一次性返回完整结果
options object 生成参数(覆盖模型默认配置):
- temperature:随机性(0~1,默认 0.7,值越低越确定)
- max_tokens:最大生成 token 数(默认 2048)
- stop:停止符数组(如 ["\n"],遇到则停止生成)
- top_p:核采样参数(0~1,控制输出多样性)

2. 接口专属参数

/chat 接口特有参数
参数名 类型 必选 说明
messages array 对话历史数组,每个元素为包含 rolecontent 的对象:
- role:角色(user/assistant/system
- content:消息内容(文本)
/generate 接口特有参数
参数名 类型 必选 说明
prompt string 生成提示词(输入文本)

3. 响应参数说明

非流式响应(stream: false
{
  "model": "phi3",                  // 模型名称
  "created_at": "2024-09-12T15:30:00Z",  // 生成时间
  "message": { "role": "assistant", "content": "响应内容..." },  // /chat 接口返回
  "response": "响应内容...",        // /generate 接口返回(替代 message)
  "done": true,                     // 是否完成
  "total_duration": 1500000000,     // 总耗时(纳秒)
  "eval_count": 180,                // 生成的 token 数
  "eval_duration": 1200000000       // 生成耗时(纳秒)
}
流式响应(stream: true

逐段返回结果,最后一段包含完整统计信息:

// 中间段
{
  "model": "phi3",
  "created_at": "2024-09-12T15:30:00Z",
  "message": { "role": "assistant", "content": "部分内容..." },  // 或 response 字段
  "done": false
}

// 最后段
{
  "model": "phi3",
  "created_at": "2024-09-12T15:30:01Z",
  "message": { "role": "assistant", "content": "完整内容" },
  "done": true,
  "total_duration": 1500000000,
  "eval_count": 180
}

三、注意事项

  1. 模型上下文窗口限制
    每个模型有最大上下文 token 数(可通过 /show 接口查询 num_ctx),例如 phi3 默认为 8192。若 messages 总长度超过限制,会返回 context too large 错误,需截断历史对话。

  2. 流式响应的处理逻辑
    流式响应需逐段拼接内容(适合 UI 实时显示),非流式适合后台处理(一次性获取结果)。

  3. 资源占用控制

    • 7B 模型(INT4 量化)约占用 4GB 内存,边缘设备建议优先选择 3.8B 以下模型(如 phi3qwen:1.8b)。
    • 避免短时间内高频调用,防止 CPU/内存占用过高。
  4. 错误处理

    • 常见错误:model not found(模型未下载,需先 pull)、invalid request(参数格式错误)、context too large(上下文过长)。
    • 建议在代码中捕获 HTTP 400/500 状态码,解析 error 字段提示用户。
  5. 参数调优建议

    • 事实性问答:temperature=0.2(降低随机性)、top_p=0.9
    • 创意生成:temperature=0.8max_tokens=2048(增加长度)。
    • 代码生成:stop=["\n\n"](避免无意义续写)。

四、代码示例

示例 1:Python 调用 /chat 接口(多轮对话,非流式)

import requests
import json

def chat_with_model(user_input, history=None):
    """
    与模型进行多轮对话
    :param user_input: 当前用户输入
    :param history: 历史对话列表(默认空)
    :return: 模型响应 + 更新后的历史
    """
    # 初始化历史对话
    if history is None:
        history = []
    
    # 接口地址
    url = "http://localhost:11434/api/chat"
    
    # 新增用户输入到历史
    history.append({"role": "user", "content": user_input})
    
    # 请求参数
    payload = {
        "model": "phi3",  # 使用轻量模型phi3
        "messages": history,
        "stream": False,
        "options": {
            "temperature": 0.5,  # 降低随机性,适合问答
            "max_tokens": 1000
        }
    }
    
    try:
        # 发送请求
        response = requests.post(url, json=payload)
        response.raise_for_status()  # 检查HTTP错误
        result = response.json()
        
        # 提取模型响应
        assistant_reply = result["message"]["content"]
        # 更新历史对话
        history.append({"role": "assistant", "content": assistant_reply})
        
        return assistant_reply, history
    
    except Exception as e:
        return f"调用失败:{str(e)}", history

# 测试多轮对话
if __name__ == "__main__":
    history = None
    # 第一轮
    reply, history = chat_with_model("什么是边缘计算?", history)
    print(f"模型:{reply}")
    # 第二轮(基于历史)
    reply, history = chat_with_model("它和云计算有什么区别?", history)
    print(f"模型:{reply}")

示例 2:Python 调用 /generate 接口(流式生成代码)

import requests
import json

def generate_code_stream(prompt):
    """
    流式生成代码(适合实时显示)
    :param prompt: 代码生成提示词
    """
    url = "http://localhost:11434/api/generate"
    
    payload = {
        "model": "codellama:7b",  # 代码专用模型
        "prompt": prompt,
        "stream": True,
        "options": {
            "temperature": 0.3,  # 代码生成需低随机性
            "stop": ["\n\n"]     # 遇到空行停止
        }
    }
    
    try:
        # 流式请求(stream=True 需用iter_lines)
        with requests.post(url, json=payload, stream=True) as r:
            r.raise_for_status()
            full_response = ""
            # 逐行处理流式响应
            for line in r.iter_lines():
                if line:
                    # 解析单行JSON
                    data = json.loads(line)
                    # 拼接内容
                    if "response" in data:
                        full_response += data["response"]
                        # 实时打印(模拟UI实时更新)
                        print(data["response"], end="", flush=True)
                    # 生成完成
                    if data.get("done", False):
                        print("\n\n生成完成!")
                        return full_response
        return full_response
    
    except Exception as e:
        return f"生成失败:{str(e)}"

# 测试代码生成
if __name__ == "__main__":
    prompt = "用Python写一个简单的HTTP服务器,支持返回当前时间"
    generate_code_stream(prompt)

总结

Ollama 的 \chat\generate 接口为本地化模型交互提供了灵活支持,通过合理配置参数(如 streamtemperature)和管理对话历史,可满足从简单文本生成到复杂多轮对话的各类需求。实际开发中需注意上下文长度、资源占用和错误处理,结合具体场景选择合适的模型和接口。上述代码示例可直接作为集成模板,快速实现本地化 AI 功能。