不想再被 API 账单吓一跳?教你用 Python 搭一个本地大模型推理 API
不想再被 API 账单吓一跳?教你用 Python 搭一个本地大模型推理 API
作者:Echo_Wish
这两年做 AI 的朋友,大概都有一个共同的体验:
刚开始用大模型的时候,觉得 云 API 太香了。
写两行代码:
client.chat.completions(...)
模型就能帮你写代码、写文案、写报告。
可等项目稍微跑起来,账单也跟着飞起来了。
很多团队到第二阶段就开始思考一个问题:
能不能把大模型放到本地跑?
原因很现实:
- 数据安全(不想把内部数据发到云)
- 成本控制(API 调用太贵)
- 延迟更低(本地推理更快)
- 离线可用(无网络环境)
所以今天咱就聊一个很实用的话题:
如何用 Python 搭一个本地大模型推理 API(完全不依赖云)
目标很简单:
最终你可以像这样调用模型:
curl http://localhost:8000/chat
返回:
{
"reply": "你好,我可以帮你解决问题。"
}
整个过程 完全在本地运行。
一、本地大模型架构长什么样?
核心结构其实很简单:
用户请求
↓
FastAPI API服务
↓
本地推理引擎
↓
大模型权重
↓
返回结果
关键组件就三个:
1️⃣ 模型运行框架
2️⃣ Python API 服务
3️⃣ 模型权重
二、选一个本地推理框架
现在主流本地推理方案有几个:
| 方案 | 特点 |
|---|---|
| Ollama | 最简单 |
| vLLM | 高性能 |
| llama.cpp | 轻量 |
| Transformers | 最灵活 |
如果你是第一次玩本地模型,我个人最推荐:
Ollama
原因很简单:
安装快、运行稳定、配置简单。
安装命令:
curl -fsSL https://ollama.com/install.sh | sh
安装完成后可以直接运行模型。
比如:
ollama run llama3
第一次会自动下载模型。
下载完成后就能对话:
>>> 写一段Python代码
三、用 Python 调用本地模型
Ollama 本身已经提供了 HTTP API。
默认端口:
http://localhost:11434
我们可以直接用 Python 调用。
import requests
url = "http://localhost:11434/api/generate"
data = {
"model": "llama3",
"prompt": "用Python写一个快速排序",
"stream": False
}
response = requests.post(url, json=data)
print(response.json()["response"])
返回示例:
def quick_sort(arr):
if len(arr) <= 1:
return arr
看到这里你会发现:
其实模型已经能用了。
但问题是:
这个接口太底层,不适合业务系统调用。
所以我们通常会再封一层 API 服务。
四、用 FastAPI 构建本地推理 API
这里推荐用 FastAPI。
优点:
- 性能高
- 代码简洁
- 自动生成接口文档
先安装:
pip install fastapi uvicorn requests
然后写一个 API 服务。
# llm_api.py
from fastapi import FastAPI
import requests
app = FastAPI()
OLLAMA_URL = "http://localhost:11434/api/generate"
@app.post("/chat")
def chat(prompt: str):
payload = {
"model": "llama3",
"prompt": prompt,
"stream": False
}
r = requests.post(OLLAMA_URL, json=payload)
result = r.json()
return {
"reply": result["response"]
}
启动服务:
uvicorn llm_api:app --reload --port 8000
现在访问:
http://localhost:8000/docs
就能看到接口文档。
测试:
curl -X POST \
"http://localhost:8000/chat?prompt=你好"
返回:
{
"reply": "你好!有什么我可以帮你的吗?"
}
恭喜你。
本地大模型 API 已经跑起来了。
五、加入上下文对话能力
上面只是单轮对话。
如果想支持 连续聊天,需要保存历史。
简单示例:
# memory_chat.py
history = []
def chat_with_memory(prompt):
history.append({"role": "user", "content": prompt})
context = ""
for msg in history:
context += f"{msg['role']}:{msg['content']}\n"
payload = {
"model": "llama3",
"prompt": context
}
r = requests.post(
"http://localhost:11434/api/generate",
json=payload
)
reply = r.json()["response"]
history.append({"role": "assistant", "content": reply})
return reply
这样模型就能记住上下文。
比如:
用户:我叫Echo
AI:你好 Echo
用户:我叫什么?
AI:你叫 Echo
六、性能优化:并发处理
如果你要在公司内部提供服务,还要考虑并发。
FastAPI 本身支持 async。
示例:
from fastapi import FastAPI
import httpx
app = FastAPI()
OLLAMA_URL = "http://localhost:11434/api/generate"
@app.post("/chat")
async def chat(prompt: str):
payload = {
"model": "llama3",
"prompt": prompt
}
async with httpx.AsyncClient() as client:
r = await client.post(OLLAMA_URL, json=payload)
return r.json()
这样吞吐量会明显提升。
七、本地推理的硬件建议
很多人最关心的是:
电脑能不能跑?
给一个经验值。
| 模型 | 显存 |
|---|---|
| 7B | 8GB |
| 13B | 16GB |
| 70B | 48GB |
如果没有 GPU:
也可以跑 量化模型。
例如:
llama3:8b-q4
占用只有 4GB 内存。
八、一个真实的使用场景
我之前给一个团队做过一个内部工具:
日志分析助手。
流程是这样的:
日志系统
↓
Python API
↓
本地 LLM
↓
生成故障分析
开发者只需要输入:
分析这段日志
模型会返回:
可能是数据库连接池耗尽
建议检查连接配置
因为模型在本地运行:
- 数据不会泄露
- 成本为 0
- 延迟 200ms
效果其实比云 API 更稳定。
九、我对本地大模型的一点真实看法
很多人现在对 AI 有一个误解:
觉得必须用云大模型。
其实未来会越来越多出现一种模式:
本地小模型 + 云大模型
简单理解:
简单任务 → 本地模型
复杂任务 → 云模型
比如:
- 文档总结
- 日志分析
- 代码补全
这些其实 7B 模型就够用。
本地跑不仅便宜,还更可控。
我个人甚至觉得:
未来很多公司都会有一个东西:
内部 AI API 平台
就像现在的:
- 内部 Kubernetes
- 内部 CI/CD
- 内部组件市场
AI 也会变成 基础设施。
而本地推理 API,就是第一步。
- 点赞
- 收藏
- 关注作者
评论(0)