随着deepseek的爆火,越来越多的朋友开始使用AI大模型,今天博主就教大家如何快速在centos7.6上通过部署ollama实现AI问答!!!

ollama是一个开源项目,专注于简化大型语言模型(LLM)在本地环境中的部署与运行。它支持多种主流模型(如Llama 2、Mistral等),提供命令行工具和API,使用户能够快速下载、运行和管理模型,无需复杂配置。

一、安装配置docker

我们使用docker容器运行ollama更加方便,没有在服务器上部署docker的朋友可以先看部署docker的文章

不清楚是否安装的朋友,可以通过这个命令行查看docker是否安装成功

docker --version
docker准备完成就可以开始我们的下一步啦!

二、检查内存分配虚拟内存

不会的朋友可以先看服务器虚拟内存如何开辟

三、ollama的安装

上述准备工作完成就可以开始部署我们的ollama啦

从docker中下载ollama
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
查看防火墙状态,记得开通对应防火墙端口并在云服务器平台添加规则11434

启动容器
docker start ollama
停止容器
docker stop ollama
创建一个,这里使用最小deepseek模型做测试
docker exec -it ollama ollama run deepseek-r1:1.5b

产看所有已下载模型

docker exec -it ollama ollama list

运行模型命令

docker exec -it ollama ollama run deepseek-r1:1.5b

这里可以看到我们已经成功实现第一个AI问答啦!!!

四.部署到服务端

后续我们也可以通过编写后端接口实现前端的调用。因为python的简洁,博主这里使用的是python编写的后端接口。

1.下载会使用的包

pip install 包名

2.后端接口的示例代码

python示例
from fastapi import FastAPI, HTTPException, Query
from pydantic import BaseModel, Field
from typing import List, Dict, Optional
import requests
import json
import uvicorn
import re

app = FastAPI()

# 模型列表(可扩展为动态获取)
SUPPORTED_MODELS = ["deepseek-r1:1.5b", "llama2:7b", "llama2:13b"]

# API配置
OLLAMA_BASE_URL = "http://localhost:11434"
API_BASE_URL = "http://localhost:8000"

# 数据模型
class Message(BaseModel):
    role: str
    content: str

class ChatRequest(BaseModel):
    model: str = Field(..., description="模型名称")
    messages: List[Message] = Field(..., description="对话消息列表")

class ChatResponse(BaseModel):
    message: Message

class Model(BaseModel):
    name: str
    description: Optional[str] = None

# 工具函数
def _build_prompt(messages: List[Message]) -> str:
    """构建适合模型的提示词格式"""
    prompt = ""
    for msg in messages:
        prompt += f"{msg.role}: {msg.content}\n"
    prompt += "assistant:"
    return prompt

def _clean_response(content: str) -> str:
    """清洗模型响应,去除无效标记和格式"""
    # 移除特殊标记(如<|FunctionCallBegin|>、<|FunctionCallEnd|>等)
    content = re.sub(r'<[^>]+>', '', content)
    
    # 合并多余的空行
    content = re.sub(r'\n\s*\n', '\n\n', content).strip()
    
    # 移除其他可能的无效字符
    content = re.sub(r'^\s+|\s+$', '', content)
    
    return content

# API端点
@app.get("/")
async def root():
    return {"message": "Welcome to Ollama Chat API"}

@app.get("/models", response_model=List[Model])
async def get_models():
    """获取支持的模型列表"""
    try:
        response = requests.get(f"{OLLAMA_BASE_URL}/api/tags")
        response.raise_for_status()
        models = response.json().get("models", [])
        return [Model(name=model["name"]) for model in models if model["name"] in SUPPORTED_MODELS]
    except Exception as e:
        # 若无法连接Ollama,返回硬编码的模型列表
        return [Model(name=name) for name in SUPPORTED_MODELS]

@app.post("/pull-model")
async def pull_model(model_name: str = Query(..., description="模型名称")):
    """拉取模型到本地"""
    try:
        payload = {"name": model_name}
        response = requests.post(f"{OLLAMA_BASE_URL}/api/pull", json=payload, stream=True)
        response.raise_for_status()
        
        # 处理拉取进度(这里简化为直接返回成功)
        return {"status": "success", "message": f"模型 {model_name} 拉取成功"}
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"拉取模型失败: {str(e)}")

@app.post("/chat", response_model=ChatResponse)
async def chat(request: ChatRequest):
    """与模型对话(非流式)"""
    # 验证模型是否支持
    if request.model not in SUPPORTED_MODELS:
        raise HTTPException(status_code=400, detail=f"不支持的模型: {request.model}")
    
    try:
        # 构建Ollama请求
        ollama_payload = {
            "model": request.model,
            "stream": False,  # 强制使用非流式
            "prompt": _build_prompt(request.messages),
            "stop": ["<|FunctionCallBegin|>", "<|FunctionCallEnd|>", "\n\n\n"]  # 防止生成无效标记
        }
        
        # 调用Ollama API
        response = requests.post(f"{OLLAMA_BASE_URL}/api/generate", json=ollama_payload)
        response.raise_for_status()
        
        # 解析完整响应
        data = response.json()
        cleaned_content = _clean_response(data.get("response", ""))
        
        return ChatResponse(message=Message(role="assistant", content=cleaned_content))
    
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"处理请求失败: {str(e)}")

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

3.配置自启动服务

sudo nano /etc/systemd/system/ollama-api.service

ollama-api.service配置文件内容
[Unit]
Description=Ollama API Service (Debug)
After=network.target

[Service]
User=ollama
Group=ollama
WorkingDirectory=/data/python/backend  //你自己服务端代码部署项目位置
ExecStart=/envs/test/bin/python3 -m uvicorn main:app --host 0.0.0.0 --port 8000 --workers 1  
//   /envs/test/bin/python3为你自己虚拟环境下的python解释器路径  which python3可以查看你python解释器位置
Restart=on-failure
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target
 

为方便管理我们新建ollama用户

创建服务运行用户
sudo useradd -r -s /sbin/nologin -d /nonexistent ollama
设置文件权限
sudo chown -R ollama:ollama /data/python/backend
sudo chmod -R 755 /data/python/backend

服务文件运行命令
sudo systemctl enable ollama-api  # 开机自启
sudo systemctl start ollama-api   # 启动服务
sudo systemctl restart ollama-api   # 重新启动服务
sudo systemctl status ollama-api # 查看运行状态

4.终端测试命令行

curl -X POST "http://localhost:8000/chat"   -H "Content-Type: application/json"   -d '{
    "model": "deepseek-r1:1.5b",
    "messages": [{"role": "user", "content": "介绍你"}],
    "stream": false
  }'

看到如下信息我们就已经测试了本地没有问题啦


5.python测试脚本代码

这里编写一个测试脚本,试试能不能远程访问

​
import json
import requests
from typing import List, Dict, Any

# API 配置
API_BASE_URL = "http://xxxxxxxxxx:8000"  # 这里更改成自己服务地址
DEFAULT_MODEL = "deepseek-r1:1.5b"  # 默认模型


def get_models() -> List[Dict[str, Any]]:
    """获取可用模型列表"""
    response = requests.get(f"{API_BASE_URL}/models")
    response.raise_for_status()
    return response.json().get("models", [])


def pull_model(model_name: str) -> None:
    """拉取指定模型"""
    print(f"正在拉取模型: {model_name}")
    response = requests.post(f"{API_BASE_URL}/pull-model?model_name={model_name}")
    response.raise_for_status()
    print(f"模型 {model_name} 拉取成功")


def chat_with_model(model: str, messages: List[Dict[str, str]]) -> str:
    """与模型进行对话(非流式)"""
    payload = {
        "model": model,
        "messages": messages
    }

    try:
        # 发送请求
        response = requests.post(f"{API_BASE_URL}/chat", json=payload)
        response.raise_for_status()

        # 解析完整响应
        data = response.json()
        return data["message"]["content"]

    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
        return ""
    except (KeyError, json.JSONDecodeError) as e:
        print(f"解析响应出错: {e}")
        return ""


def main():
    """主函数:启动交互式聊天"""
    print("=== Ollama API 聊天客户端 ===")

    # 获取可用模型
    try:
        models = get_models()
        print("可用模型:")
        for m in models:
            print(f"- {m['name']}")

        # 选择模型
        model_input = input(f"请输入要使用的模型(默认: {DEFAULT_MODEL}): ").strip()
        model = model_input if model_input else DEFAULT_MODEL

        # 检查模型是否存在
        if model not in [m["name"] for m in models]:
            confirm = input(f"模型 {model} 不存在,是否拉取?(y/n): ").lower()
            if confirm == 'y':
                pull_model(model)
            else:
                print("使用默认模型")
                model = DEFAULT_MODEL

    except Exception as e:
        print(f"获取模型列表失败: {e}")
        model = DEFAULT_MODEL
        print(f"使用默认模型: {model}")

    # 聊天历史
    messages = []

    print("\n=== 开始聊天 ===")
    print("输入 'exit' 结束对话")

    while True:
        user_input = input("你: ").strip()
        if user_input.lower() == "exit":
            break

        # 添加用户消息到历史
        messages.append({"role": "user", "content": user_input})

        # 调用 API
        ai_response = chat_with_model(model, messages)
        if ai_response:
            print(f"AI 回复: {ai_response}")
            # 将实际的AI回复添加到历史
            messages.append({"role": "assistant", "content": ai_response})


if __name__ == "__main__":
    main()

​

这里可以看到我们的测试脚本返回了问答结果,这说明我们也可以远程访问啦!!!

前端的访问可能会出现跨域的问题,大家也可以改进上面服务端代码解决,博主这里比较懒就不改了。

五.接口使用

接口url:

http://XXXXXXXXX:8000/chat

请求格式
{
  "model": "deepseek-r1:1.5b",  // 模型名称
  "messages": [  // 对话消息列表
    {
      "role": "user",
      "content": "你好,介绍成都"
    }
  ]
}
返回格式
{
  "message": {
    "role": "assistant",
    "content": "成都是中国四川省的省会...(模型生成的完整回答)"
  }
}

到这里你就成功部署了自己的大模型啦,大家快去试试吧!!!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐