LlamaAI本地部署实战专栏第5篇
从命令行聊天工具到AI服务接口,让你的本地大模型拥有和OpenAI API一样的调用方式。
一、为什么需要本地AI API服务?
在前面的文章中,我们已经完成:
✅ 编译 llama.cpp
✅ 下载 GGUF 模型
✅ GPU 加速推理
✅ 命令行运行本地大模型
但是现在的使用方式:
./llama-cli \
-m qwen.gguf
存在一个问题:
它只能自己在终端输入,无法被其他程序调用。
真正的软件系统需要:
用户
↓
Web前端
↓
后端服务
↓
AI接口
↓
大模型
↓
返回结果
例如:
- 网站聊天机器人
- 桌面AI助手
- VSCode插件
- 企业知识库
- Agent系统
因此,我们需要把:
本地模型 → API服务
二、什么是LLM API?
API(Application Programming Interface):
简单理解:
让程序之间可以互相调用的接口。
例如:
以前:
Python程序
↓
OpenAI服务器
↓
GPT模型
现在:
Python程序
↓
localhost:8080
↓
你的电脑
↓
Llama模型
三、llama.cpp Server架构
llama.cpp提供:
llama-server
它负责:
- 加载模型
- 接收HTTP请求
- 管理上下文
- 返回生成结果
整体结构:
用户
|
Web/App
|
HTTP请求
|
llama-server
|
llama.cpp Engine
|
GGUF模型
|
GPU/CPU
四、启动llama-server
进入:
llama.cpp/build/bin
启动:
Linux:
./llama-server \
-m ../../models/qwen.gguf \
--port 8080
Windows:
llama-server.exe `
-m ../../models/qwen.gguf `
--port 8080
启动成功:
看到:
Server listening on port 8080
说明:
本地AI服务启动完成。
五、测试API接口
打开浏览器:
访问:
http://localhost:8080
可以看到:
llama.cpp服务页面。
查看接口:
/v1/chat/completions
这个接口:
和OpenAI保持兼容。
六、使用curl调用本地模型
发送请求:
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '
{
"messages":[
{
"role":"user",
"content":"介绍一下Transformer"
}
]
}
'
返回:
{
"choices":[
{
"message":{
"content":"Transformer是一种..."
}
}
]
}
说明:
你的本地模型已经提供AI服务。
七、使用OpenAI SDK调用本地模型
重点来了:
因为llama.cpp兼容OpenAI接口。
所以:
以前调用:
OpenAI云端
现在改:
本地模型
代码几乎不用改变。
安装:
pip install openai
Python:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8080/v1",
api_key="none"
)
response = client.chat.completions.create(
model="local-model",
messages=[
{
"role":"user",
"content":"你好,介绍一下自己"
}
]
)
print(
response.choices[0].message.content
)
输出:
你好,我是运行在本地的大语言模型...
八、为什么OpenAI兼容非常重要?
假设你的项目之前:
client = OpenAI(
api_key="xxx"
)
现在:
client = OpenAI(
base_url="http://localhost:8080/v1"
)
业务代码不用大改。
这意味着:
你的AI应用可以自由切换:
同一个应用
|
------------------
| |
OpenAI API 本地Llama
| |
云端GPU 本地GPU
这也是企业私有化部署的重要方式。
九、流式输出(Streaming)
普通请求:
等待全部生成:
用户输入
↓
等待10秒
↓
显示答案
体验不好。
ChatGPT采用:
流式输出:
用户输入
↓
Token1
↓
Token2
↓
Token3
↓
不断显示
代码:
response = client.chat.completions.create(
model="local-model",
messages=[
{
"role":"user",
"content":"写一个Python程序"
}
],
stream=True
)
for chunk in response:
print(
chunk.choices[0]
.delta.content,
end=""
)
效果:
实时输出。
十、本地AI聊天网页实现
现在架构:
浏览器
|
Vue/React
|
FastAPI
|
llama-server
|
Qwen模型
例如:
前端:
Vue3
fetch(
"http://localhost:8000/chat"
)
后端:
FastAPI:
@app.post("/chat")
def chat(msg):
result = client.chat.completions.create(
model="local",
messages=[
{
"role":"user",
"content":msg
}
]
)
return result
最终:
拥有自己的:
本地ChatGPT网页。
十一、启动参数优化
实际部署:
推荐:
./llama-server \
-m qwen.gguf \
--port 8080 \
-ngl 999 \
-c 4096 \
-b 512
参数:
| 参数 | 作用 |
|---|---|
| -m | 模型路径 |
| --port | 服务端口 |
| -ngl | GPU层数 |
| -c | 上下文长度 |
| -b | batch大小 |
十二、多用户并发
如果多人访问:
需要调整:
并发槽位
参数:
--parallel
例如:
--parallel 4
表示:
同时处理4个请求。
架构:
用户1
|
用户2
|
用户3
|
用户4
↓
llama-server
↓
GPU
十三、后台运行服务
Linux:
使用:
nohup
例如:
nohup ./llama-server \
-m qwen.gguf \
--port 8080 &
查看:
ps aux | grep llama
停止:
kill PID
十四、常见问题
1. 端口被占用
错误:
Address already in use
解决:
换端口:
--port 8081
2. API返回空结果
检查:
- 模型是否加载成功
- 请求格式是否正确
- message格式是否正确
3. 速度慢
检查:
nvidia-smi
确认:
GPU是否工作。
增加:
-ngl 999
十五、本篇总结
今天完成:
✅ 理解LLM服务架构
✅ 启动llama-server
✅ 将本地模型API化
✅ 使用OpenAI SDK调用
✅ 实现流式输出
✅ 构建本地ChatGPT基础架构
现在你的系统:
从:
命令行AI
升级为:
AI服务平台
完整架构:
Web应用
|
OpenAI SDK
|
llama-server
|
llama.cpp
|
GGUF模型
|
GPU加速
下一篇预告
《让本地Llama拥有企业知识:RAG离线知识库完整实现》
下一篇将进入真正的AI应用开发:
- 为什么大模型不知道你的资料
- RAG技术原理
- PDF文档解析
- Embedding模型
- FAISS向量数据库
- 本地知识库问答系统
最终实现:
一个完全离线运行的私人知识库AI助手。