主要是想要提供一个api,供自己玩。
一般配置需求如下图,但是可以用cpu跑。实际上,我在锐龙8845HS上跑14B模型绰绰有余,虽然效率不高但基本可用。而且这是考虑到几乎纯CPU在跑(and gpu暂无好的适配)
步骤分成两个部分,一是部署,二是api服务。草履虫都会做
本地部署
去下载,找自己的系统https://ollama.com
下载完成后https://ollama.com/search去找模型。目前开源综合性能最好是deepseek
复制哪一行,ok可以跑了
ollama run deepseek-r1:14b
对话即可。
Web服务
ollama贴心的提供了web接口,RESTful
这个肯定不暴露的,返回值是流式的,结束后会提示done。
稍微写个(gpt)py前端,防火墙关一下外部就可以访问了。实现了外部接口和整体返回。
from flask import Flask, request, jsonify, Response
import requests
import json # 使用 JSON 解析而非 eval()
app = Flask(__name__)
# 假设 Ollama 模型运行在本地,端口为 11434
OLLAMA_API_URL = "http://localhost:11434/api/generate"
@app.route('/api/query', methods=['POST'])
def query_model():
try:
# 从请求中获取输入
data = request.json
model = data.get("model", "deepseek-r1:14b") # 默认使用 deepseek-r1:14b 模型
prompt = data.get("prompt", "")
if not prompt:
return jsonify({"error": "No prompt provided"}), 400
# 向 Ollama 的 /api/generate 发送请求
ollama_response = requests.post(
OLLAMA_API_URL,
json={"model": model, "prompt": prompt},
stream=True # 开启流式处理
)
# 检查请求是否成功
if ollama_response.status_code != 200:
return jsonify({"error": f"Ollama API error: {ollama_response.status_code}"}), ollama_response.status_code
# 流式读取 Ollama 的响应并拼接完整的结果
def generate_response():
full_response = ""
try:
for chunk in ollama_response.iter_lines(decode_unicode=True):
if chunk: # 确保 chunk 不为空
# 使用 json.loads() 安全解析 JSON 数据
try:
data = json.loads(chunk)
except json.JSONDecodeError:
yield "[Error: Invalid JSON received from Ollama]\n"
break
# 从解析的数据中提取响应片段
response_segment = data.get("response", "")
full_response += response_segment
yield response_segment # 实时返回生成的片段
# 检查是否完成
if data.get("done", False):
break
except Exception as e:
yield f"[Error: {str(e)}]\n"
# 返回流式响应给客户端
return Response(generate_response(), content_type='text/plain')
except Exception as e:
# 捕获所有其他异常并返回错误信息
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
apifox测一测,非常好👍