金融量化学习---Python, MySQL, Pandas

这里用来记录一些在金融领域,尤其是银行相关的资金、债券、票据中应用到的数据管理与分析, 编程等心得或笔记,以及个人的一点小小兴趣(易经八卦、藏密禅修)等

导航

WSL2安装DOCKER加载Nvidia驱动再运行Ollama+Deepseek R1+One API


参考:https://zhuanlan.zhihu.com/p/28098780023

WSL2安装DOCKER

安装Docker Desktop即可,然后设置它与WSL相关的选项

下载Nvidia在linux下的驱动

注意在Nvidia官网找到自己对应的驱动,我的是:NVIDIA-Linux-x86_64-570.133.07.run
在wsl下进入windows下载的目录,然后运行安装命令: sudo ./NVIDIA-Linux-x86_64-570.133.07.run
如果不能运行,就先运行:chmod +x NVIDIA-Linux-x86_64-570.133.07.run

然后运行命令:sudo apt install nvidia-cuda-toolkit

正常安装完后可以运行nvidia-smi命令,查看已经安装的驱动版本

如果不行,我只能按它提示运行:apt install nvidia-utils-570-server (因为这个是最接近我的驱动的那个版本)

正常安装完后,再运行,可以看到驱动版本出来了:

docker安装Ollama

通用命令:docker pull ollama/ollama
加速镜像命令:docker pull docker.1ms.run/ollama/ollama

运行ollama容器及英伟达toolkit

参考:https://ollama.cadn.net.cn/docker.html
运行容器,可以等一会儿再运行
docker run -d --name ollama -v /home/docker/ollama:/root/.ollama -p 11434:11434 docker.1ms.run/ollama/ollama

使用 Apt 安装,配置存储库

    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
        | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
    curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
        | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
        | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
    sudo apt-get update

安装 NVIDIA Container Toolkit 软件包

sudo apt-get install -y nvidia-container-toolkit

配置 Docker 以使用 Nvidia 驱动程序

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

启动ollama容器并下载模型

Ollama 下载:https://ollama.com/download
Ollama 官方主页:https://ollama.com
Ollama 官方 GitHub 源代码仓库:https://github.com/ollama/ollama/

官网提供了一条命令行快速安装的方法(普通安装)。
curl -fsSL https://ollama.com/install.sh | sh

带有GPU的ollama安装
docker run -d --name ollama --gpus=all -v /home/docker/ollama:/root/.ollama -p 11434:11434 docker.1ms.run/ollama/ollama

Ollama安装完毕后,还需要继续下载大模型,支持的大模型可以在Ollama官网找到:https://ollama.com/library

在Ollama中安装运行qwen3:14b

https://ollama.com/library/qwen3:14b

在ollama容器中执行命令:
docker exec -it ollama ollama run qwen3:14b

在Ollama中安装运行Deepseek R1

https://ollama.com/library/deepseek-r1
安装命令:
docker exec -it ollama ollama run deepseek-r1:7b

更新模型的方法

#进入ollama容器
root@DESKTOP-D1CRSQO:~# docker exec -it ollama bash
root@988d17197d71:/# ollama list
NAME              ID              SIZE      MODIFIED
deepseek-r1:7b    0a8c26691023    4.7 GB    2 weeks ago
qwen3:14b         7d7da67570e2    9.3 GB    2 weeks ago

#删除ollama容器中的AI模型
root@988d17197d71:/# ollama rm deepseek-r1:7b
deleted 'deepseek-r1:7b'

root@988d17197d71:/# ollama list
NAME         ID              SIZE      MODIFIED
qwen3:14b    7d7da67570e2    9.3 GB    2 weeks ago

使用/bye退出容器,使用下面的命令来更新latest模型:
docker exec -it ollama ollama run deepseek-r1:8b

更新ollama

在 WSL或Linux 系统上,请重新运行安装脚本
curl -fsSL https://ollama.com/install.sh | sh

Ollama 支持的 API 端点

端点 说明
http://localhost:11434/api/generate 生成文本(DeepSeek LLM)
http://localhost:11434/api/tags 列出可用模型
http://localhost:11434/api/show?name=deepseek-coder 查看模型信息
http://localhost:11434/api/pull 下载新模型

你可以在终端输入以下命令来查看 DeepSeek 模型是否正确加载:


curl http://localhost:11434/api/show?name=deepseek-coder

返回示例:

{
    "name": "deepseek-coder",
    "size": "33b",
    "parameters": {...}
}

总结

  • Ollama 运行的 DeepSeek 端口是 11434,不是 8000。
    
  • 使用 http://localhost:11434/api/generate 进行推理,而不是 OpenAI 的 /v1/chat/completions。
    
  • Ollama API 采用 "prompt" 代替 "messages",请求格式不同。
    
  • 可以使用 stream=True 实现流式输出,提高交互体验。
    

给ollama设置可视化界面

Ollama默认没有提供WEB界面,输入命令进入容器,然后通过命令行来使用:
docker exec -it ollama /bin/bash

Cherry Studio

我觉得它比open-webui好用,所以优先介绍它
https://www.cherry-ai.com/
安装教程:https://docs.cherry-ai.com/pre-basic/installation

CherryStudio 支持多种添加数据的方式:

  • 文件夹目录:可以添加整个文件夹目录,该目录下支持格式的文件会被自动向量化;
  • 网址链接:支持网址 url,如https://docs.siliconflow.cn/introduction;
  • 站点地图:支持 xml 格式的站点地图,如https://docs.siliconflow.cn/sitemap.xml;
  • 纯文本笔记:支持输入纯文本的自定义内容。

提示:

导入知识库的文档中的插图暂不支持转换为向量,需要手动转换为文本;
使用网址作为知识库来源时不一定会成功,有些网站有比较严格的反扒机制(或需要登录、授权等),因此该方式不一定能获取到准确内容。创建完成后建议先搜索测试一下。
一般网站都会提供sitemap,如CherryStudio的sitemap,一般情况下在网站的根地址(即网址)后加/sitemap.xml可以获取到相关信息。如aaa.com/sitemap.xml 。
如果网站没提供sitemap或者网址比较杂可自行组合一个sitemap的xml文件使用,文件暂时需要使用公网可直接访问的直链的方式填入,本地文件链接不会被识别。
可以让AI生成sitemap文件或让AI写一个sitemap的HTML生成器工具;
直链可以使用oss直链或者网盘直链等方式来生成。如果没有现成工具也可到ocoolAI官网,登录后使用网站顶栏的免费文件上传工具来生成直链。

安装open-webui

如果你希望通过更加友好的 Web 界面来与 Ollama 进行交互,推荐使用 Open-webui。你可以使用以下命令来部署 Open-webui 容器:
参考:https://docs.openwebui.com/getting-started/quick-start
命令:docker pull ghcr.io/open-webui/open-webui:main
如果上面这个拉不下来,就试试1毫秒加速:https://1ms.run/r/dyrnq/open-webui
命令:docker pull docker.1ms.run/dyrnq/open-webui

方法一:

与 Ollama 在同一台服务器上部署:
docker run -d -p 8080:8080 --add-host=host.docker.internal:host-gateway -v /home/docker/open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

与 Ollama 不在同一台服务器上部署:
docker run -d -p 8080:8080 -e OLLAMA_BASE_URL=http://你服务器的ip地址:11434 -v /home/docker/open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

说明:

    docker run:这是 Docker 的基本命令,用于启动一个新的容器。
    -d:表示在后台运行容器,即启动后容器不会立即退出。
    -p 8080:8080:将容器内部的 8080 端口映射到宿主机的 8080 端口。这样,你就可以通过 http://localhost:8080 来访问 Open-webui。
    -e OLLAMA_BASE_URL=http://你服务器的ip地址:11434:设置环境变量 OLLAMA_BASE_URL,告诉 Open-webui Ollama 服务的地址。这里的 http://你服务器的ip地址:11434 需要替换成你实际的 Ollama 服务地址。
    -v /home/docker/open-webui:/app/backend/data:将本地目录 /home/docker/open-webui 挂载到容器内的 /app/backend/data 目录。这个目录通常用于存放 Open-webui 的数据和配置文件。
    --name open-webui:给容器起一个名字,方便管理。
    --restart always:设置容器在退出后自动重启。
    ghcr.io/open-webui/open-webui:main:指定要运行的镜像。ghcr.io/open-webui/open-webui 是镜像仓库地址,main 是镜像标签。

方法二:

原文链接:https://blog.csdn.net/qq_36693723/article/details/145597221

如果你电脑安装了ollama,不使用gpu,使用如下命令:
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
为了应用支持Nvidia GPU的open webui,使用如下命令:
docker run -d -p 3000:8080 --gpus all --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:cuda

我自己用的命令:
docker run -d -p 3000:8080 --gpus all --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always docker.1ms.run/dyrnq/open-webui:cuda
至于到底用哪个命令,取决于你的DOCKER里的image的名字,用以下两个名字(2选1)查看即可:

#哪个能用就用哪个吧
docker exec -it ollama ollama ps
docker exec -it ollama ollama list

优化命令(可选)

启用支持GPU的open webui,并增加健康检查:
docker run -d -p 3000:8080 --gpus all --add-host=host.docker.internal:host-gateway --health-cmd "curl -fsSL http://localhost:8080 || exit 1" --health-interval 60s --health-retries 5 --health-timeout 20s --health-start-period 60s --restart=always -v open-webui:/app/backend/data --name open-webui ghcr.io/open-webui/open-webui:cuda

我自己用的命令:
docker run -d -p 3000:8080 --gpus all --add-host=host.docker.internal:host-gateway --health-cmd "curl -fsSL http://localhost:8080 || exit 1" --health-interval 60s --health-retries 5 --health-timeout 20s --health-start-period 60s --restart=always -v open-webui:/app/backend/data --name open-webui docker.1ms.run/dyrnq/open-webui:cuda

  1. 增加了健康检查机制(--health-cmd)
    (基础版):
    仅依靠 --restart=always,Docker 只有在容器完全崩溃时才会重启它。
    如果 Web 服务挂掉了(但容器仍然运行),Docker 无法检测到,导致 WebUI 看似“正常运行”,但实际上用户无法访问。

    优化(改进版):
    通过 --health-cmd "curl -fsSL http://localhost:8080 || exit 1",每 60 秒检查一次 API 是否存活,确保 WebUI 真正可用。
    如果 API 失去响应,Docker 会自动将容器标记为 unhealthy,并可能触发重启。

完成后,打开浏览器访问 http://localhost:8080,你将可以通过 Open-webui 界面与 Ollama 进行交互,体验更加直观的操作。
我实际访问的:http://localhost:3000/auth?redirect=%2F

哈哈哈哈:

openwebui更新:

官方方法:
https://docs.openwebui.com/getting-started/updating
用到的工具:
https://containrrr.dev/watchtower/

将Ollama接入one-api

one-api是一个开源AI中间件服务,可以聚合各家大模型API,比如OpenAI、ChatGLM、文心一言等,聚合后提供统一的OpenAI调用方法。举个例子:ChatGLM和文心一言的API调用方法并不相同,one-api可以对其进行整合,然后提供一个统一的OpenAI调用方法,调用时只需要改变模型名称即可,从而消除接口差异和降低开发难度。
one-api具体安装方法请参考官方项目地址:https://github.com/songquanpeng/one-api
我分了两步,第一步是布署mysql(one-qpi要求),下面是docker-compose.yml的文件内容,我是在WSL里布署的:

services:
  mysql:
    image: mysql:latest  # 当前是 9.4.0 版本
    container_name: mysql-wsl
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password  # root 密码, 自己定义
      MYSQL_DATABASE: apione        # 自动创建的数据库
      TZ: Asia/Shanghai
    ports:
      - "3307:3306"  # 主机端口:容器端口
    volumes:
      - /opt/MySQL/data:/var/lib/mysql       # 数据持久化
      - /opt/MySQL/conf:/etc/mysql/conf.d    # 配置挂载(若有自定义配置)
      - /opt/MySQL/logs:/var/log/mysql       # 日志目录
    networks:
      - mysql-network
networks:
  mysql-network:
    driver: bridge

第二步是生成one-api容器

services:
  one-api:
    image: justsong/one-api:latest
    container_name: one-api
    restart: always
    ports:
      - "3000:3000"
    environment:
      - TZ=Asia/Shanghai
      # 补充字符集、时间解析参数,避免初始化失败
      - SQL_DSN=root:password@tcp(mysql-wsl:3306)/apione?charset=utf8mb4&parseTime=True&loc=Local
    volumes:
      - /opt/one-api:/data
    # 加入 MySQL 所在的外部网络,确保容器名解析互通
    networks:
      - mysql_mysql-network #我没写错,是多个mysql_

# 声明外部网络(由 MySQL Compose 提前创建,无需重复创建)
networks:
  mysql_mysql-network:
    external: true

布署成功后,可访问:http://localhost:3000
image

通过one-api后台 >> 渠道 >> 添加一个新的渠道。具体设置如下:
image
这里,我把ollama里安装的两个模型都写了进去,分别是:qwen3:8b, deepseek-r1:8b

docker网络的问题会有些麻烦
有多种思路,一种是让OneApi的容器跑在 host 网络模式下,
可使用 host.docker.internal 这个地址,当然前提都是 ollama 的 host 设置为 0.0.0.0, 在添加渠道的时候,类型选择 Ollama,
自定义模型部分填入我们部署的 deepseek-r1:8b 和 qwen3:8b , 然后代理填写 http://host.docker.internal:11434
注意:在 Linux 环境中,host.docker.internal 可能无法工作,但你可以直接使用宿主机的 IP 地址。例如,如果宿主机的 IP 地址是 192.168.1.100,可以在OneApi中使用 http://192.168.1.100:11434 来访问 Ollama 服务。

OK,然后你可以创建一个令牌 :
image

服务测试

确认 Ollama 是否正确运行

如果你使用 Ollama 部署了 DeepSeek,默认 API 运行在 11434 端口。

#首先,检查 Ollama 是否正常运行:
curl http://localhost:11434/api/tags
#如果返回:
{"models":["deepseek-coder:latest", "deepseek-chat:latest"]}
#说明 Ollama 运行正常,并且已安装 DeepSeek 模型。

#先查询服务支持的所有模型,获取正确的模型名称:
curl http://localhost:3000/v1/models \
  -H "Authorization: Bearer sk-XXX" 
#返回了如下结果
{"data":[{"id":"deepseek-r1:8b","object":"model","created":1626777600,"owned_by":"custom","permission":null,"root":"deepseek-r1:8b","parent":null},{"id":"qwen3:8b","object":"model","created":1626777600,"owned_by":"custom","permission":null,"root":"qwen3:8b","parent":null}],"object":"list"}

调用测试(测试成功)

使用以下命令测试调用:
注意:JSON 格式不支持这种注释# 注释符号,会导致解析失败。请彻底删除以下测试代码中所有注释内容,确保 JSON 结构纯净。

#测试一,测试deepseek-r1:8b
curl http://localhost:3000/v1/chat/completions \completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-xxx" \
  -d '{
    "model": "deepseek-r1:8b",
    "messages": [{"role": "user", "content": "你好,测试一下"}]
  }'

#测试二,测试qwen3:8b
curl http://localhost:3000/v1/chat/completions \
 -H "Content-Type: application/json" \
 -H "Authorization: Bearer sk-xxx" \
 -d '{
    "model": "qwen3:8b",
    "messages": [{"role": "user", "content": "你好,我是 qwen3"}]
  }'

#测试三,测试多个role
curl http://localhost:3000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-xxx" \
  -d '{
    "model": "qwen3:8b",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "Hello!"
      }
    ]
  }'

注:
将 localhost:3000 替换为 one-api 的域名。
将 sk-xxx 替换为 one-api 创建的令牌。

Python 调用 Ollama 运行的 DeepSeek

参考:https://www.cnblogs.com/lidy5436/p/18711009
发送对话请求,Ollama 的 API 端点与 OpenAI 兼容 API 不同,需要使用 /api/generate:


import requests
import json

API_URL = "http://localhost:11434/api/generate"  # Ollama API 端点

headers = {
    "Content-Type": "application/json"
}

data = {
    "model": "deepseek-coder",  # 你的 DeepSeek 模型名称
    "prompt": "请介绍一下 DeepSeek。",
    "stream": False  # 关闭流式输出
}

response = requests.post(API_URL, headers=headers, json=data)

if response.status_code == 200:
    result = response.json()
    print("AI 回复:", result["response"])
else:
    print("请求失败:", response.status_code, response.text)

📌 注意

  • "model" 需要匹配你的 Ollama 里安装的 DeepSeek 模型,比如 "deepseek-coder"。
    
  • Ollama API 采用 "prompt" 而不是 "messages"。
    
  • 端口是 11434,不是 8000。
    

开启流式输出

如果希望让 Ollama 流式返回 DeepSeek 的回复,可以这样处理:

import requests
import json

API_URL = "http://localhost:11434/api/generate"

headers = {
    "Content-Type": "application/json"
}

data = {
    "model": "deepseek-coder",
    "prompt": "请介绍一下 DeepSeek。",
    "stream": True  # 开启流式输出
}

response = requests.post(API_URL, headers=headers, json=data, stream=True)

for line in response.iter_lines():
    if line:
        json_data = json.loads(line.decode("utf-8"))
        print(json_data.get("response", ""), end="", flush=True)

这样可以实时打印 DeepSeek 的 AI 回复。

One API 使用方法

在渠道页面中添加你的 API Key,之后在令牌页面中新增访问令牌。
之后就可以使用你的令牌访问 One API 了,使用方式与 OpenAI API 一致。

你需要在各种用到 OpenAI API 的地方设置 API Base 为你的 One API 的部署地址,例如:https://openai.justsong.cn,API Key 则为你在 One API 中生成的令牌。
注意,具体的 API Base 的格式取决于你所使用的客户端。

OPENAI_API_KEY="sk-xxxxxx"
OPENAI_API_BASE="https://:/v1"

python 调用 one api 服务测试(我还没试)

我们用获取到的令牌来测试一下。其调用方式与 OpenAI API 一致,只需将:
model_dict的key,就是在one api“创建新渠道”里定义的“名称”
OpenAI 的网址 'base_url',改成你部署的 OneAPI 的网址,例:'http://localhost:3000/v1';
OpenAI 的令牌 'api_key',改成你的令牌,测试的示例代码如下:

from openai import OpenAI

model_dict = {
    'ollama': {
        'api_key': 'sk-xxx',
        'base_url': 'http://localhost:3000/v1',
        'model_name': 'qwen3:8b'
    }
}

class LLM_API:
    def __init__(self, api_key, base_url, model):
        self.client =  OpenAI(
            api_key=api_key,
            base_url=base_url,
        )
        self.model = model
    
    def __call__(self, messages, temperature=0.7):
        completion = self.client.chat.completions.create(
            model=self.model,
            messages=messages,
            temperature=temperature,
        )
        return completion.choices[-1].message.content

if __name__ == '__main__':
    model = 'ollama'
    llm = LLM_API(model_dict[model]['api_key'], model_dict[model]['base_url'], model_dict[model]['model_name'])
    user_question = "你是谁"
    messages = [{"role": "user", "content": user_question},]
    print(llm(messages))

其他问题和用法

Ollama面临的安全风险

Ollama 作为一款开源工具,为用户提供了便捷的本地大模型部署和调用方式。通过 Docker 安装与部署,用户可以快速上手并灵活使用各类大型模型。
然而,由于 Ollama 缺乏内置鉴权机制,用户在生产环境中需采取适当的安全措施。未来若能完善鉴权机制,Ollama 将成为 AI 开发者的得力助手。
由于 Ollama 默认无鉴权机制,部署到服务器上存在安全隐患。以下是两种提高安全性的方法:

Linux 内置防火墙
将 Docker 部署 Ollama 的网络模式改为 host。
通过防火墙限制仅允许指定 IP 访问 11434 端口。

Nginx 反向代理
将 Ollama 的端口映射为 127.0.0.1:11434。
使用 Nginx 反向代理,并设置 IP 白名单和黑名单。

Docker Desktop 硬盘映像文件 (.vhdx) 从C盘迁移到D盘的方法

原数据目录:通常位于 C:\Users\你的用户名\AppData\Local\Docker\wsl\data\docker_data.vhdx
进入Docker Desktop设置页面,Setting -- Resources -- Disk image location, 在这里设置新的文件夹地址,比如: D:/Docker, 然后点右下角Apply & Restart

它会自动在D:/Docker下再依次建立:DockerDesktopWSL\disk目录,新的docker_data.vhdx就在这里放着,你看一下文件属性,发现这个文件只有2G左右。
此时,停止所有的Docker Desktop文件运行并退出,再更新,否则容易出错。
我原来那个docker_data.vhdx文件有30G左右,我直接把我的docker_data.vhdx文件复制到D:/Docker/DockerDesktopWSL/disk/docker_data.vhdx,覆盖它原来的文件。
覆盖完成后,再打开Docker Desktop,就会发现,之前安装的容器全在里面啦!哈哈哈

Ollama 使用常见的指令:

ollama serve         #启动ollama
ollama create        #从模型文件创建模型
ollama show          #显示模型信息
ollama run           #运行模型
ollama pull          #从注册表中拉取模型
ollama push          #将模型推送到注册表
ollama list          #列出模型
ollama cp            #复制模型
ollama rm            #删除模型
ollama help          #获取有关任何命令的帮助信息

问题修复

参考:https://www.cnblogs.com/treasury-manager/p/19074227

免费API申请

去AnyRouter申请免费API

参考:https://cloud.tencent.com/developer/article/2539872
Any Router是一个Claude Code免费共享平台,提供API中转服务。
图片
国内用户可以通过 AnyRouter 提供的 API 中转服务,轻松绕过网络和注册限制,实现免费使用。以下是具体步骤:
去这里:https://anyrouter.top/
进入到Any Router首页,我使用LinuxDO登录,这是个很有意思的BBS:https://linux.do/
登录后,你会自动进入数据看板,并免费获得 100 美元的初始额度。

deepseek

https://platform.deepseek.com/sign_in
API:https://api.deepseek.com

腾讯云知识引擎原子能力界面

https://console.cloud.tencent.com/lkeap
API:https://api.lkeap.cloud.tencent.com/v1

硅基流动

https://cloud.siliconflow.cn/models
API:https://api.siliconflow.cn/v1

聚合AI(购买的API)

https://juheai.qyiwl.cn/
API:https://api.juheai.top/v1

posted on 2025-04-07 14:50  chengjon  阅读(469)  评论(0)    收藏  举报