NLP——Ollama-DeepSeek-R1本地部署

本文主要介绍基于 Ollama 的 DeepSeek-R1 本地部署


安装 Ollama

  • ollama官网 下载安装即可
  • ollama 是一个类 Docker 的大模型管理工具

安装 DeepSeek-R1 模型

  • 安装命令(以下命令会自动安装7B版本,即DeepSeek-R1-Distill-Qwen-7B)

    1
    ollama run deepseek-r1
  • 更多镜像可参考:ollama.com/library


基于 ChatBox 的可视化交互

  • 下载并安装:chatboxai.app
  • 点击设置选择指定本地模型即可启动

ollama API 调用

  • 参考链接:

  • API 调用 Demo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    def http_api_demo():
    import requests
    import json

    # Ollama 服务器的地址
    OLLAMA_URL = "http://localhost:11434/api/generate"

    # 要调用的模型名称
    MODEL_NAME = "deepseek-r1:latest"

    # 要发送的提示文本
    prompt = "你好,DeepSeek!请求解方程x^3+x^2+x-3=0"

    # 请求的 payload
    payload = {
    "model": MODEL_NAME,
    "prompt": prompt,
    "stream": False # 设置为 False 以获取完整的响应
    }

    # 发送 POST 请求
    response = requests.post(OLLAMA_URL, json=payload)

    # 检查响应状态码
    if response.status_code == 200:
    # 解析响应内容
    response_data = response.json()
    print("模型响应:", response_data.get("response"))
    else:
    print(f"请求失败,状态码: {response.status_code}")
    print("响应内容:", response.text)

    def ollama_api_stream_demo():
    import requests # 使用 requests 库调用 Ollama 的 API
    import json

    # Ollama 的 API 地址
    url = "http://localhost:11434/api/chat"

    # 请求数据
    data = {
    "model": "deepseek-r1:latest", # 使用的模型
    "messages": [
    {
    "role": "system",
    "content": "你是一个专业人士,每次回答前请先说“解:”"
    },
    {
    "role": "user",
    "content": "9.9和9.11哪个更大?"
    }
    ],
    "stream": True # 启用流式响应
    }

    # 发送 POST 请求
    response = requests.post(
    url,
    json=data,
    stream=True # 启用流式接收
    )

    # 打印结果
    print("模型返回的内容:")
    for line in response.iter_lines():
    if line: # 过滤掉空行
    # 解析 JSON 数据
    chunk = json.loads(line.decode('utf-8'))
    if "message" in chunk and "content" in chunk["message"]:
    print(chunk["message"]["content"], end='', flush=True) # 逐步打印内容

    def ollama_api_demo():
    import requests # 使用 requests 库调用 Ollama 的 API
    import json

    # Ollama 的 API 地址
    url = "http://localhost:11434/api/chat"

    # 请求数据
    data = {
    "model": "deepseek-r1:latest", # 使用的模型
    "messages": [
    {
    "role": "system",
    "content": "你是一个专业人士,每次回答前请先说“解:”"
    },
    {
    "role": "user",
    "content": "9.9和9.11哪个更大?"
    }
    ],
    "stream": False # 禁用流式响应
    }

    # 发送 POST 请求
    response = requests.post(
    url,
    json=data
    )

    # 检查响应状态
    if response.status_code == 200:
    # 解析 JSON 数据
    result = response.json()
    if "message" in result and "content" in result["message"]:
    print("模型返回的内容:")
    print(result["message"]["content"]) # 打印完整内容
    else:
    print(f"请求失败,状态码:{response.status_code}")
    print(response.text) # 打印错误信息

    def openai_api_demo():
    from openai import OpenAI
    client = OpenAI(
    base_url='http://localhost:11434/v1/',
    # required but ignored
    api_key='ollama',
    )
    chat_completion = client.chat.completions.create(
    messages=[
    {
    'role': 'user',
    'content': '9.9和9.11哪个更大?',
    },
    {
    'role': 'system',
    'content': '你是一个专业人士,每次回答前请先说“解:”',
    }
    ],
    model='deepseek-r1:latest',
    temperature=0.0, # 可以根据需要调整温度值,决定生成的随机性程度
    )
    # 打印结果
    print("模型返回的内容:")
    print(chat_completion.choices[0].message.content)


    def openai_api_stream_demo():
    from openai import OpenAI
    client = OpenAI(
    base_url='http://localhost:11434/v1/',
    # required but ignored
    api_key='ollama',
    )

    # 启用流式响应
    stream = client.chat.completions.create(
    messages=[
    {
    'role': 'user',
    'content': '9.9和9.11哪个更大?',
    },
    {
    'role': 'system',
    'content': '你是一个专业人士,每次回答前请先说“解:”',
    }
    ],
    model='deepseek-r1:latest',
    temperature=0.0, # 可以根据需要调整温度值,决定生成的随机性程度
    stream=True, # 启用流式响应
    )

    # 打印结果
    print("模型返回的内容:")
    for chunk in stream:
    if chunk.choices[0].delta.content: # 检查是否有内容
    print(chunk.choices[0].delta.content, end='', flush=True) # 逐步打印内容


    # openai_api_demo()
    # openai_api_stream_demo()
    ollama_api_stream_demo()
    # ollama_api_demo()
  • 多线程调用 Demo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    import requests
    import json
    from concurrent.futures import ThreadPoolExecutor, as_completed

    def ollama_api_demo(message):
    # Ollama 的 API 地址
    url = "http://localhost:11434/api/chat"

    # 请求数据
    data = {
    "model": "deepseek-r1:latest", # 使用的模型
    # "model": "llama3.2:latest",
    "messages": [
    {
    "role": "system",
    "content": "你是一个专业人士,每次回答前请先说“解:”"
    },
    {
    "role": "user",
    "content": message
    }
    ],
    "stream": False # 禁用流式响应
    }

    # 发送 POST 请求
    response = requests.post(
    url,
    json=data
    )

    # 检查响应状态
    if response.status_code == 200:
    # 解析 JSON 数据
    result = response.json()
    if "message" in result and "content" in result["message"]:
    return result["message"]["content"] # 返回完整内容
    else:
    return f"请求失败,状态码:{response.status_code}\n{response.text}" # 返回错误信息

    def parallel_ollama_api_demo(messages):
    with ThreadPoolExecutor() as executor:
    # 提交任务到线程池
    futures = [executor.submit(ollama_api_demo, message) for message in messages]

    # 等待所有任务完成并获取结果
    results = []
    for future in as_completed(futures):
    try:
    result = future.result()
    results.append(result)
    except Exception as e:
    results.append(f"任务执行出错: {e}")

    return results

    if __name__ == "__main__":
    # 示例消息列表
    messages = [
    "9.9和9.11哪个更大?",
    # "Python 和 Java 哪个更适合初学者?",
    # "解释一下量子计算的基本概念。"
    ]

    import time
    x = time.time()
    # 并行调用 API
    results = parallel_ollama_api_demo(messages)

    # 打印结果
    for i, result in enumerate(results):
    print(f"结果 {i+1}:")
    print(result)
    print("-" * 40)
    y = time.time()
    print("time(s):", y-x)
  • 如果想要设定 temperature 等参数,可以在结构体中增加 option 参数,按照字典传入即可,比如,可以如下实现仅返回长度为 20 的 token

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    def ollama_api_demo():
    import requests # 使用 requests 库调用 Ollama 的 API
    import json

    # Ollama 的 API 地址
    url = "http://localhost:11434/api/chat"

    # 请求数据
    data = {
    "model": "deepseek-r1:latest", # 使用的模型
    "messages": [
    {
    "role": "system",
    "content": "你是一个专业人士,每次回答前请先说“解:”"
    },
    {
    "role": "user",
    "content": "9.9和9.11哪个更大?"
    }
    ],
    "options": {
    "temperature": 0.7,
    "top_p": 0.8,
    "num_predict": 20 # 仅返回20个 token 长度
    },
    "stream": False # 禁用流式响应
    }

    # 发送 POST 请求
    response = requests.post(
    url,
    json=data
    )

    # 检查响应状态
    if response.status_code == 200:
    # 解析 JSON 数据
    result = response.json()
    if "message" in result and "content" in result["message"]:
    print("模型返回的内容:")
    print(result["message"]["content"]) # 打印完整内容
    else:
    print(f"请求失败,状态码:{response.status_code}")
    print(response.text) # 打印错误信息