妇产科里的“秘密花园”:7月,守护生命与女性健康的温柔絮语

核心内容摘要

奇幻邂逅:当“大狼狗”与“子宫”的传说悄然上演
9.1雷电的震撼:当狙击枪遇上风暴

YW193:ä¸

好的这是根据您的要求生成的一篇关于Ollama本地模型API的技术深度文章。

文章围绕如何使用其API构建高效、可扩展的本地AI应用展开包含了高级用法和性能考量。

超越Chat界面深入Ollama本地模型API构建生产级AI微服务在人工智能浪潮中大型语言模型LLMs的部署方式正经历一场深刻的“本地化”变革。

Ollama 的出现以其极简的命令行体验让开发者在个人电脑上运行 Llama、Mistral、Qwen 等顶尖开源模型变得触手可及。

然而许多开发者对 Ollama 的认知仍停留在ollama run llama3的交互式聊天界面。

事实上其真正强大的潜力隐藏在RESTful API和OpenAI 兼容 API之后。

本文将深入探讨如何将 Ollama 从一个本地玩具转变为构建私有化、高性能、可集成 AI 微服务的基础设施并分享一些进阶实践与优化策略。

Ollama API 架构概览不止于一个简单的HTTP服务当你在本地运行ollama serve时Ollama 在后台启动了两个核心组件模型服务器负责加载、运行模型执行推理计算。

API 服务层一个监听在11434端口默认的 HTTP 服务器提供了标准化的接口与模型服务器通信。

Ollama 同时提供了两套 API这是其设计的精妙之处原生 API (/api) 一组轻量级的 RESTful 端点专为 Ollama 自身设计功能直接响应高效。

OpenAI 兼容 API (/v

一个仿照 OpenAI API 格式的端点。

这是将 Ollama “工业化”的关键。

任何为 OpenAI GPT 系列模型编写的客户端库、应用框架或监控工具几乎可以无缝切换到本地的 Ollama 服务上迁移成本极低。

这种双 API 设计让开发者既能进行精细控制又能享受生态系统兼容性的红利。

深入核心原生 API 的高级用法与性能调优让我们先深入原生 API了解其核心能力。

基础的/api/generate用于生成文本但仅仅发送一个prompt是远远不够的。

1 流式响应与实时交互对于长文本生成或需要实时反馈的应用如聊天、代码补全流式响应至关重要。

它不仅能降低用户感知延迟TTFB还能在生成过程中实时处理文本。

# 使用curl体验流式响应 curl -N http://localhost:11434/api/generate \ -H Content-Type: application/json \ -d { model: llama3, prompt: 用Python写一个快速排序算法并详细解释每一步。

, stream: true }服务端会返回一系列application/x-ndjson格式的数据块每个块包含一个response片段。

在程序中我们可以优雅地处理这个流import requests import json def generate_stream(prompt, modelllama

: url http://localhost:11434/api/generate payload { model: model, prompt: prompt, stream: True, options: { num_predict: 512, # 控制最大生成token数 temperature:

7, # 控制创造性 top_p:

9, # 核采样影响输出的多样性 } } with requests.post(url, jsonpayload, streamTrue) as response: # 确保响应是流式 if response.headers.get(Content-Type) application/x-ndjson: for line in response.iter_lines(): if line: try: chunk json.loads(line.decode(utf-

) # 输出当前片段并保留在最后获取完整响应 if response in chunk: yield chunk[response] # 如果生成完成可以获取上下文等信息 if chunk.get(done, False): print(f\n生成完成。

总耗时: {chunk.get(total_duration,

/1e9:.2f}s) print(f加载模型耗时: {chunk.get(load_duration,

/1e9:.2f}s) except json.JSONDecodeError: print(f解析失败的行: {line}) else: # 非流式响应处理 data response.json() yield data[response] # 使用生成器逐句打印 full_response [] for token in generate_stream(量子计算的主要优势是什么): print(token, end, flushTrue) # flush确保实时显示 full_response.append(token) final_output .join(full_response)

2 系统提示词与对话上下文管理高质量的对话应用需要维护上下文。

Ollama 原生 API 通过context参数和消息角色 (system,user,assistant) 来支持。

import requests def chat_with_context(messages, modelllama

: 支持多轮对话并携带历史上下文 url http://localhost:11434/api/chat # messages 格式应类似: [{role: user, content: 你好}, {role: assistant, content: 你好}, ...] payload { model: model, messages: messages, stream: False, options: { num_ctx: 4096, # 关键设置上下文窗口大小必须与模型能力匹配 } } response requests.post(url, jsonpayload) if response.status_code 200: result response.json() # 返回本次回复以及可选的上下文ID如果未来API支持 return result[message][content] else: raise Exception(f请求失败: {response.status_code}, {response.text}) # 示例对话 conversation_history [ {role: system, content: 你是一个乐于助人且幽默的Python专家。

}, {role: user, content: 怎么用列表推导式过滤出偶数} ] assistant_reply chat_with_context(conversation_history, codellama:7b) print(助手回复:, assistant_reply) # 将助手的回复加入历史进行下一轮 conversation_history.append({role: assistant, content: assistant_reply}) conversation_history.append({role: user, content: 那如果还要同时计算它们的平方呢}) next_reply chat_with_context(conversation_history, codellama:7b) print(助手后续回复:, next_reply)关键点num_ctx选项必须小于或等于模型训练时的上下文长度。

对于长文档摘要或多轮复杂对话合理管理messages数组的长度例如仅保留最近N轮或通过

总结压缩历史是避免超出上下文窗口的必要手段。

拥抱生态OpenAI 兼容 API 的无缝集成OpenAI 兼容 API (/v

是 Ollama 的“杀手级”功能。

它意味着你可以使用成熟的 OpenAI SDK而无需更改代码。

1 使用官方openaiPython 包只需更改base_url和api_key可任意填写。

from openai import OpenAI # 将客户端指向本地Ollama服务 client OpenAI( base_urlhttp://localhost:11434/v1, api_keyollama, # 此处api_key可任意填写ollama服务端不验证但为兼容性必须提供 ) #

聊天补全 (Chat Completions) - 这是推荐方式 response client.chat.completions.create( modelllama3, # 使用你通过 ollama pull 下载的模型名 messages[ {role: system, content: 你是一个代码审查助手。

请指出代码中的问题并提供改进建议。

}, {role: user, content: def process_data(items): result [] for i in range(len(items)): if items[i] % 2 0: result.append(items[i] *

return result } ], temperature

2, # 代码生成需要低随机性 max_tokens300, ) print(response.choices[0].message.content) #

流式聊天 stream client.chat.completions.create( modelmistral, messages[{role: user, content: 给我讲一个关于AI的短故事。

}], streamTrue ) for chunk in stream: if chunk.choices[0].delta.content is not None: print(chunk.choices[0].delta.content, end, flushTrue)

2 集成到现有项目以 LangChain 为例LangChain 等框架广泛支持 OpenAI 接口。

切换至 Ollama 轻而易举。

from langchain.chat_models import ChatOpenAI from langchain.schema import HumanMessage, SystemMessage # 创建指向Ollama的ChatOpenAI实例 llm ChatOpenAI( modelllama3, openai_api_basehttp://localhost:11434/v1, openai_api_keyollama, temperature

7, max_tokens1024, # LangChain 内部会使用 /v1/chat/completions 端点 ) # 构建消息链 messages [ SystemMessage(content你是一个历史学家用生动有趣的方式讲解历史事件。

), HumanMessage(content请简述一下工业革命的影响。

) ] # 获取响应 response llm(messages) print(response.content) # LangChain的链、代理等高级功能也可基于此LLM实例构建

构建生产级服务性能、安全与监控将本地 Ollama API 用于生产环境需要考虑以下方面

1 性能优化模型选择与量化使用量化版本模型如llama3:8b-instruct-q4_K_M。

q4_K_M、q5_K_M等在精度和速度间有良好平衡。

使用ollama pull model:tag获取特定版本。

批处理预测虽然原生API不直接支持批处理但可以通过并发请求模拟。

注意监控显存使用。

GPU 内存管理使用num_gpu参数控制模型层数加载到GPU。

对于大模型可结合ollama run的--num-gpu标志或在API调用选项中设置num_gpu: 20例如将20层放于GPU。

payload { model: mixtral:8x7b, prompt: prompt, options: { num_gpu: 40, # 将40层放到GPU其余在CPU main_gpu: 0, # 指定主GPU } }服务化与负载均衡使用systemd或supervisor管理ollama serve进程。

在多个GPU服务器上部署多个Ollama实例前端通过Nginx进行负载均衡。

2 安全加固更改默认端口与绑定地址启动时使用OLLAMA_HOST

0.

0.

0:8080 ollama serve来修改端口和绑定IP谨慎将服务暴露给所有网络接口。

基础认证与反向代理在生产环境中绝对不要将裸露的Ollama服务暴露在公网。

应使用Nginx/Apache作为反向代理并配置HTTP基本认证、IP白名单或更高级的OAuth/JWT验证。

# Nginx 配置示例片段 location /api/ { proxy_pass http://localhost:11434; proxy_set_header Host $host; # 添加认证头验证需配合auth_basic模块 auth_basic Restricted Access; auth_basic_user_file /etc/nginx/.htpasswd; # 或传递来自上游认证服务的Token # proxy_set_header Authorization Bearer $http_authorization; }输入验证与过滤在调用Ollama API的应用层你的FastAPI/Flask服务对用户的prompt进行内容审核、长度限制和恶意指令过滤防止提示词注入攻击。

3 简易监控Ollama 提供了/api/tags端点查看已加载模型但更深入的监控如GPU使用率、请求延迟、Token速率需要外部工具。

使用nvtop或gpustat监控GPU状态。

在应用层添加日志和指标记录每个API请求的模型、输入token数、输出token数、耗时。

使用Prometheus Grafana编写一个简单的导出器定期调用/api/ps实验性端点可能变动获取正在运行的模型进程信息并暴露给Prometheus。

一个综合示例构建本地知识库问答微服务让我们用一个新颖的例子收尾结合Ollama、Sentence Transformers和FAISS构建一个完全本地化的知识库问答RAG微服务使用FastAPI框架。

# app.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List import requests import numpy as np import faiss from sentence_transformers import SentenceTransformer import pickle import os app FastAPI(title本地知识库问答API) # 初始化组件 EMBEDDING_MODEL SentenceTransformer(all-MiniLM-L6-v

# 本地嵌入模型 OLLAMA_API_URL http://localhost:11434/v1/chat/completions OLLAMA_MODEL mistral:instruct # 假设我们已经有了知识库和索引 # 这里模拟一个加载过程 KNOWLEDGE_CHUNKS [ 公司规定年假需提前两周在HR系统中申请。

, 项目报销流程先填写报销单经项目经理审批后提交财务部。

, 技术部的季度会议在每季度第一个周的周一下午3点举行。

, ] if os.path.exists(knowledge_index.faiss): index faiss.read_index(knowledge_index.faiss) with open(knowledge_texts.pkl, rb) as f: stored_chunks pickle.load(f) else: # 首次运行时创建索引 embeddings EMBEDDING_MODEL.encode(KNOWLEDGE_CHUNKS) dimension embeddings.shape[1] index faiss.IndexFlatL2(dimension) index.add(embeddings.astype(float

) faiss.write_index(index, knowledge_index.faiss) with open(knowledge_texts.pkl, wb) as f: pickle.dump(KNOWLEDGE_CHUNKS, f) stored_chunks KNOWLEDGE_CHUNKS class QueryRequest(BaseModel): question: str top_k: int 3 app.post(/ask) async def answer_question(req: QueryRequest): #

将问题转换为向量 query_embedding EMBEDDING_MODEL.encode([req.question]) #

在FAISS中搜索最相关的知识片段 distances, indices index.search(query_embedding.astype(float

, req.top_k) #

构建上下文 context \n\n.join([stored_chunks[i] for i in indices[0] if i len(stored_chunks)]) #

使用Ollama的OpenAI兼容API进行答案生成 prompt f基于以下已知信息简洁、专业地回答问题。

如果已知信息不足以回答问题请回答“根据已知信息无法回答该问题”。

已知信息 {context} 问题 {req.question} payload { model: OLLAMA_MODEL, messages: [{role: user, content: prompt}], stream: False, temperature:

1, } try: response requests.post(OLLAMA_API_URL, jsonpayload, timeout

response.raise_for_status() result response.json() answer result[choices][0][message][content] except requests.exceptions.RequestException as e: raise HTTPException(status_code500, detailf调用Ollama服务失败: {e

17·c1起草免登录网页版-17·c1起草免登录网页版应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123