作者: AI最严厉的父亲

  • 解锁Steam乐趣:Watt Toolkit游戏工具包全面指南

    在这个数字化时代,游戏已经成为人们生活中不可或缺的一部分。而Steam作为最大的数字游戏发行平台之一,提供了数千款游戏供玩家畅玩。但是,你是否曾经遇到过一些Steam上的烦人问题,例如管理多个账户、整理游戏库存或者强制使用无边框窗口模式?如果是的话,那么你绝对不能错过今天要介绍的神奇工具——Watt Toolkit ?!

    开篇故事

    在一个漫长而炎热的夏天,你终于决定将电脑上的游戏库整理一下。但是,当你尝试一一打开Steam账户时,发现这是一个相当费时费力的任务。每次都要输入用户名和密码,然后等待登录完成,实在是太烦人了。

    正当你准备放弃时,一个朋友告诉了你一个关于Watt Toolkit的秘密武器。你决定尝试一下,结果发现这个工具非常神奇!你不仅能够轻松切换已登录的Steam账户,还能够方便地管理你的游戏库存和成就。此外,你还可以使用它来强制游戏窗口使用无边框窗口模式,让你的游戏体验更加顺畅。

    这就是我们今天要讨论的Watt Toolkit,一个能够让你的Steam游戏体验更加便捷和愉快的开源工具。

    功能一览

    账户切换

    Watt Toolkit让切换Steam账户变得轻而易举。如果你已经在当前电脑上登录了多个Steam账户,只需点击一下,即可迅速切换到其他账户。此外,你还可以方便地管理你的共享游戏库,进行排序等操作。

    游戏库存管理

    不仅可以通过Watt Toolkit下载老旧的Steam游戏,还可以直接管理你的Steam游戏库存。它支持解锁的成就和未解锁的成就,让你更好地了解自己在游戏中的成就。

    本地身份验证

    Watt Toolkit还支持本地身份验证。你可以将手机令牌保存在电脑上,目前仅支持Steam令牌,但未来将开发更多令牌类型,并支持云同步令牌。

    ArchiSteamFarm集成

    Watt Toolkit与ArchiSteamFarm集成,提供了在应用内挂卡和掉卡的功能。这对于Steam卡片收藏者来说是一个非常有用的功能。

    游戏工具

    如果你希望游戏窗口使用无边框窗口模式,Watt Toolkit也可以满足你的需求。这将提高游戏的流畅性和用户体验。

    支持的操作系统

    Watt Toolkit跨平台支持,适用于多种操作系统,包括:

    • Windows 11
    • Windows 10 版本1809(内部版本17763)或更高版本
    • macOS 10.15或更高版本
    • Ubuntu 20.04或更高版本
    • Debian 11或更高版本
    • Fedora 37或更高版本
    • Deepin(UOS)20或更高版本
    • iOS 11或更高版本(正在开发中…)
    • Android 5.0(API 21)或更高版本

    无论你使用哪种操作系统,你都可以轻松地在Watt Toolkit中享受到所有这些强大的功能。

    下载途径

    如果你对Watt Toolkit产生了兴趣,你可以从以下途径下载它:

    无论你是Windows用户、macOS用户还是Linux用户,都可以根据自己的需要选择适合的下载途径。

    下载指南

    如果你需要下载和安装Watt Toolkit,可以参考以下步骤:

    1. 打开你选择的下载途径,例如Microsoft Store、官方网站或GitHub Releases。
    2. 在下载页面上,选择适用于你操作系统的版本,然后点击下载按钮。
    3. 下载完成后,运行安装程序,并按照提示完成安装过程。
    4. 安装完成后,启动Watt Toolkit。

    现在,你已经成功安装了Watt Toolkit,可以开始享受其强大的功能了!

    开发环境

    如果你是开发人员,可能会对Watt Toolkit的开发环境感兴趣。以下是Watt Toolkit的开发环境:

    • Visual

      Studio 2022

    • Visual Studio 2022 for Mac
    • JetBrains Rider
    • Visual Studio Code
    • OpenJDK 17
    • Android Studio Electric Eel或更高版本
    • Xcode 14或更高版本

    无论你是C#开发者、Java开发者还是移动应用开发者,你都可以使用适合自己的开发环境来贡献和定制Watt Toolkit。

    项目结构

    如果你想深入了解Watt Toolkit的项目结构,可以查看项目根目录下的src/README.md文件。这里提供了详细的项目结构信息,可以帮助你更好地理解项目的组织和架构。

    开源库

    Watt Toolkit是一个开源项目,它依赖于许多开源库来实现其功能。如果你想了解这些开源库的详细信息,可以查看项目根目录下的doc/open-source-library.md文件。这里列出了所有使用的开源库以及它们的作用。

    未来路线图

    Watt Toolkit的未来路线图充满了激动人心的计划。你可以在项目中查看详细的路线图,了解即将推出的功能和改进。如果你有任何问题或建议,都可以随时与开发团队交流。

    结语

    Watt Toolkit是一个强大的开源工具,旨在让Steam游戏体验更加便捷和愉快。它提供了许多有用的功能,包括账户切换、游戏库存管理、本地身份验证和游戏工具。无论你是普通玩家还是开发人员,都会发现Watt Toolkit是一个不可多得的工具。

    现在,你已经了解了Watt Toolkit的各种功能和特点,可以尝试下载并开始使用它,提升你的Steam游戏体验吧!

  • 探索Linux容器技术:从电子工具库到Barco项目

    你是否曾想过,计算机世界中的应用隔离是如何实现的?如何确保不同的应用程序在同一台计算机上能够安全运行而不相互干扰?Linux容器技术正是这一问题的答案。在这篇文章中,我们将深入探讨Linux容器,并介绍一个名为Barco的开源项目,它是作者用来学习Linux容器和Linux内核的一个实践项目。

    引言

    Linux容器是一种轻量级的虚拟化技术,允许你在同一台物理服务器上运行多个隔离的应用程序,每个应用程序都有自己的文件系统、网络、进程和资源隔离。容器技术的崛起已经改变了软件开发和部署的方式,使得应用程序更易于管理、部署和扩展。

    Barco是一个实验性项目,旨在帮助开发人员更好地理解Linux容器技术的内部工作原理。在本文中,我们将深入研究Linux容器的关键概念,以及如何使用Barco项目来创建和管理容器。

    Linux容器的关键概念

    要理解Linux容器,首先需要了解一些关键概念,这些概念构成了容器技术的基础。

    命名空间(Namespaces)

    命名空间是Linux内核的一个功能,它允许将系统资源分组到不同的命名空间中,以便不同的进程树可以访问不同的资源集。例如,PID命名空间用于隔离进程树,而网络命名空间用于隔离网络栈。

    seccomp

    seccomp是一种用于限制进程可以执行的系统调用(syscalls)的机制。通过限制允许的系统调用,可以增加容器的安全性。

    capabilities

    capabilities用于设置对root用户(uid 0)的操作权限限制。它允许你明确指定root用户可以执行哪些操作,从而提高了容器的安全性。

    cgroups

    cgroups(控制组)用于限制进程可以使用的资源,例如内存、磁盘I/O和CPU时间。它通过cgroupfs(控制组文件系统)来实现资源管理。

    使用Barco项目

    Barco项目是一个用于学习Linux容器技术的实验性工具,它可以帮助你创建和运行容器。以下是如何使用Barco来运行一个容器的简单示例:

    $ sudo ./bin/barco -u 0 -m / -c /bin/sh -a . [-v]

    上述命令会以root权限在根目录(/)下运行一个Shell容器。你可以使用-v选项来获得更详细的输出。

    Barco项目将会初始化容器的各种设置,包括命名空间、seccomp、capabilities和cgroups。一旦容器初始化完成,你就可以在容器内执行命令,就像在一个独立的操作系统环境中一样。

    开发与构建Barco项目

    要开始开发和构建Barco项目,你需要一些工具和依赖项。以下是设置和构建Barco项目的步骤:

    安装所需工具和依赖项

    首先,安装所有必要的工具和依赖项,包括make工具:

    $ sudo apt install -y make
    $ make setup

    构建项目

    使用提供的Makefile可以构建Barco项目。你可以选择使用debug=1来构建带有调试符号和无优化的项目,这对于调试和使用Valgrind检查内存泄漏非常有用:

    # 构建Barco项目
    
    $ make
    
    # 构建带有调试标志的Barco项目
    $ make debug=1

    开发工具

    Barco项目的开发可以使用Visual Studio Code和GitHub Codespaces进行。该仓库包含了所有必要的配置文件,以便你有效地使用这些工具。

    结构

    Barco项目的结构如下:

    ├── .devcontainer       GitHub Codespaces配置
    ├── .github             GitHub Actions和其他GitHub功能的配置
    ├── .vscode             Visual Studio Code配置
    ├── bin                 可执行文件(通过make创建)
    ├── build               中间构建文件,如*.o(通过make创建)
    ├── docs                文档
    ├── include             头文件
    ├── lib                 第三方库
    ├── scripts             设置和其他任务的脚本
    ├── src                 C源文件
    │   ├── barco.c         主CLI入口点
    │   └── *.c
    ├── tests               包含测试
    ├── .clang-format       格式化程序的配置
    ├── .clang-tidy         代码检查工具的配置
    ├── .gitignore
    ├── LICENSE
    ├── Makefile
    └── README.md

    测试与文档

    目前,该项目不包含自动化测试或文档工具。将来,可能会添加适合自动化测试和文档的工具。

    局限性

    Barco项目在运行Debian 12上的Linux内核版本6.1.0时进行了测试,启用了用户命名空间和cgroupsv2。

    Barco不处理网络命名空间,因此容器无法访问网络。网络可以通过以下方式粗略设置:

    1. 创建一个新的网络命名空间。
    2. 创建虚拟以太网对(veth pair)。
    3. 将其中一端移动到新的网络命名空间。
    4. 为新网络命名空间中的接口分配IP地址。
    5. 设置路由和NAT。

    结论

    通过Barco项目,你可以深入了解Linux容器技术的内部工作原理。这种轻量级虚拟化技术已经改变了软件开发和部署的方式,使得应用程序更容易管理和隔离。无论你是一名开发人员还是一个对容器技术感兴趣的爱好者,Barco项目都可以帮助你更好地理解这一领域的核心概念。

    希望本文对你理解Linux容器技术和Barco项目有所帮助。如果你对容器技术有更多的疑问或想要深入了解,请随时提出你的问题或探讨。

    通过这篇文章,你已经深入了解了Linux容器技术以及如何使用Barco项目来创建和管理容器。这一技术领域正在不断发展,为软件开发和部署提供了更多的灵活性和效率。如果你对这一主题有更多的兴趣,可以继续学习并探索更多相关的内容。祝你在容器技术的世界中取得成功!

  • 快速入门:ZeroNSD DNS服务器指南

    你是否曾经遇到DNS问题,而最后的答案总是"这一定是DNS问题"?ZeroNSD是专为ZeroTier用户设计的DNS服务器,它可以帮助你解决与ZeroTier网络相关的DNS查询问题。本文将引导你快速入门使用ZeroNSD,以便在ZeroTier网络上提供高效的DNS服务。

    简介

    ZeroNSD是一个专为ZeroTier用户设计的DNS服务器,它允许你为ZeroTier网络提供定制的DNS解析服务。通过ZeroNSD,你可以实现以下目标:

    • 为ZeroTier网络提供高性能的DNS解析服务。
    • 自定义DNS记录以满足你的需求。
    • 通过ZeroTier网络轻松访问DNS服务器。

    请注意,ZeroNSD目前仍处于Beta测试阶段,但它已经可以在你的ZeroTier网络上提供可靠的DNS解析服务。

    先决条件

    在开始使用ZeroNSD之前,请确保你已经满足以下先决条件:

    概念上的先决条件

    • 当ZeroTier加入一个网络时,它会创建一个虚拟网络接口。
    • 当ZeroTier加入多个网络时,将会存在多个网络接口。
    • 当ZeroNSD启动时,它会绑定到一个ZeroTier网络接口。
    • 当ZeroTier加入多个网络时,需要多个ZeroNSD实例,每个网络接口对应一个实例。

    这意味着:

    • ZeroNSD将从运行它的节点访问。
    • ZeroNSD将从ZeroTier网络上的其他节点访问。
    • ZeroNSD将与节点可能连接的其他网络隔离开来。

    技术上的先决条件

    本快速入门使用了两台机器 – 一个是在Digital Ocean上的Ubuntu虚拟机,另一个是在住宅ISP上的OSX笔记本电脑。为了一步一步跟随本文,你需要提供类似的基础设施。如果你使用不同的平台,你应该能够以最少的努力弄清楚应该怎么做。

    步骤

    创建一个ZeroTier网络

    首先,你需要手动通过ZeroTier Central WebUI创建一个ZeroTier网络。

    1. 登录ZeroTier Central WebUI。
    2. 创建一个新的网络。

    安装ZeroTier

    接下来,你需要安装ZeroTier并将其加入你打算提供DNS服务的网络中。以下是在大多数平台的CLI上执行的命令。Windows用户可以从ZeroTier下载页面下载MSI安装程序。在本文的其余部分,请将示例网络ID“af78bf94364e2035”替换为你自己的网络ID。

    在Ubuntu上执行以下命令:

    $ curl -s https://install.zerotier.com | sudo bash
    $ sudo zerotier-cli join af78bf94364e2035
    $ sudo zerotier-cli set af78bf94364e2035 allowDNS=1

    授权节点

    在ZeroTier Central WebUI的成员部分,通过点击“Auth”按钮,将节点授权加入网络。

    获取ZeroTier Central的API令牌

    在开始之前,我们需要登录到my.zerotier.com并在“帐户”部分创建一个API令牌。ZeroNSD将使用此令牌读取网络成员以生成记录,并更新DNS设置。

    执行以下命令将API令牌存储到文件中,以便ZeroNSD读取:

    $ sudo bash -c "echo YOUR_ZEROTIER_CENTRAL_TOKEN > /var/lib/zerotier-one/token"
    $ sudo chown zerotier-one:zerotier-one /var/lib/zerotier-one/token
    $ sudo chmod 600 /var/lib/zerotier-one/token

    安装ZeroTier Systemd Manager

    ZeroTier Systemd Manager发布了rpm和deb软件包,可以在这里下载。

    下载并安装ZeroTier Systemd Manager:

    $ wget https://github.com/zerotier/zerotier-systemd-manager/releases/download/v0.1.9/zerotier-systemd-manager_0.1.9_linux_amd64.deb
    $ sudo dpkg -i zerotier-systemd-manager_0.1.9_linux_amd64.deb

    最后,重新启动所有的ZeroTier服务:

    $ sudo systemctl daemon-reload
    $ sudo systemctl restart zerotier-one
    $ sudo systemctl enable zerotier-systemd-manager.timer
    $ sudo systemctl start zerotier-systemd-manager.timer

    安装ZeroNSD

    ZeroNSD应该只在网络中的一个节点上运行。由于DNS的延迟非常重要,请尽量将其放置在距离客户端最近的位置。

    使用软件包安装

    ZeroNSD发布了rpm、deb和msi软件包,可以在这里找到最新版本。以下是示例命令,注意要替换为最新版本:

    $ wget https://github.com/zerotier/zeronsd/releases/download/v0.1.7/zeronsd_0.1.7_amd64.deb
    $ sudo dpkg -i zeronsd_0.1.7_amd64.deb

    使用Cargo安装

    如果对于你的平台没有提供软件包,你仍然可以使用Cargo进行安装:

    $ sudo /usr/bin/apt-get -y install net-tools librust-openssl-dev pkg-config cargo
    $ sudo /usr/bin/cargo install zeronsd --root /usr/local

    提供DNS服务

    对于你希望提供DNS服务的每个网络,请执行以下操作(将“af78bf94364e2035”替换为你的网络ID):

    $ sudo zeronsd supervise -t /var/lib/zerotier-one/token -w -d YOUR_DOMAIN af78bf943
    
    64e2035
    $ sudo systemctl start zeronsd-af78bf94364e2035
    $ sudo systemctl enable zeronsd-af78bf94364e2035

    验证功能

    你应该能够通过DNS名称ping到笔记本电脑(或任何前置子域名,因为我们设置了通配符标志):

    $ ping laptop.YOUR_DOMAIN
    PING laptop.YOUR_DOMAIN (172.22.192.177) 56(84) bytes of data.
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=1 ttl=64 time=50.1 ms
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=2 ttl=64 time=49.5 ms
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=3 ttl=64 time=48.6 ms

    或者:

    $ ping travel.laptop.YOUR_DOMAIN
    PING travel.laptop.YOUR_DOMAIN (172.22.192.177) 56(84) bytes of data.
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=1 ttl=64 time=50.1 ms
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=2 ttl=64 time=49.5 ms
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=3 ttl=64 time=48.6 ms

    更新标志设置

    如果要更改设置(例如TLD),请执行以下操作(将“af78bf94364e2035”替换为你的网络ID):

    $ sudo zeronsd supervise -t /var/lib/zerotier-one/token -w -d YOUR_DOMAIN af78bf94364e2035
    $ sudo systemctl daemon-reload
    $ sudo systemctl enable zeronsd-af78bf94364e2035

    测试DNS查询

    要在没有zerotier-systemd-manager的情况下测试与ZeroNSD的DNS查询,请找到ZeroNSD绑定的IP地址,并使用dig命令明确对其进行查询。执行以下命令:

    $ sudo lsof -i -n | grep ^zeronsd | grep UDP | awk '{ print $9 }' | cut -f1 -d:
    172.22.245.70

    然后使用dig命令直接查询DNS服务器:

    对Ubuntu机器执行:

    $ dig +short @172.22.245.70 zt-3513e8b98d.YOUR_DOMAIN
    172.22.245.70
    $ dig +short @172.22.245.70 server.YOUR_DOMAIN
    172.22.245.70

    对OSX笔记本电脑执行:

    $ dig +short @172.22.245.70 zt-eff05def90.YOUR_DOMAIN
    172.22.245.70
    $ dig +short @172.22.245.70 laptop.YOUR_DOMAIN
    172.22.192.177

    添加到/etc/hosts并再次查询

    如果要添加自定义DNS记录,请执行以下操作:

    $ sudo bash -c 'echo "1.2.3.4 test" >> /etc/hosts'
    $ dig +short @172.22.245.70 test.YOUR_DOMAIN
    1.2.3.4

    验证通向公共DNS的查询

    为了验证失败的情况下,查询会落到公共DNS服务器,执行以下命令:

    $ dig +short @172.22.245.70 example.com
    93.184.216.34

    附加信息

    OSX上的DNS解析

    在OSX上,DNS解析使用dns-sd。遗憾的是,nslookup、host和dig在OSX上可能无法正常工作,但ping可以。

    $ ping server.YOUR_DOMAIN
    PING server.YOUR_DOMAIN (172.22.245.70): 56 data bytes
    64 bytes from 172.22.245.70: icmp_seq=0 ttl=64 time=37.361 ms
    64 bytes from 172.22.245.70: icmp_seq=1 ttl=64 time=38.129 ms
    64 bytes from 172.22.245.70: icmp_seq=2 ttl=64 time=37.569 ms

    要检查系统解析器设置,使用以下命令:scutil --dns

    对于Ubuntu机器,可以执行以下查询:

    $ dns-sd -G v4 server.YOUR_DOMAIN
    $ dns-sd -G v4 zt-3513e8b98d.YOUR_DOMAIN

    对于OSX机器,可以执行以下查询:

    $ dns-sd -G v4 laptop.YOUR_DOMAIN
    $ dns-sd -G v4 zt-eff05def90.YOUR_DOMAIN

    Windows

    如果你是Windows用户,请尝试使用默认设置。如果有任何问题,请提供反馈或提交拉取请求以帮助改进ZeroNSD在Windows上的兼容性。

    提供非ZeroTier记录

    注意: 以下部分主要面向希望充分利用zeronsd的服务的高级用户。

    zeronsd还将在两种情况下提供非ZeroTier记录:

    1. 在TLD不匹配时,它将转发/etc/resolv.conf中的名称服务器。此行为类似于Linux上常用的DNS服务器dnsmasq。

    2. 为了提供自定义记录,你可以使用-f标志和一个hosts格式的文件,它将在提供的TLD下提供来自该文件的记录,与ZeroTier节点合并。以下是示例。

    注意: 如果按照上述步骤进行了操作,请在继续之前执行以下命令以停止ZeroNSD的服务和监督:

    $ systemctl stop zeronsd-<network id>
    $ zeronsd unsupervise <network id>

    创建一个名为hosts的文件,将以下内容放入其中:

    1.1.1.1 cloudflare-dns

    然后,我们将只使用zeronsd的start子命令启动一个临时服务器。这将在前台运行,因此请在新终端中运行或使用&运行。

    $ zeronsd start -t
    
     /var/lib/zerotier-one/token -f ./hosts -d YOUR_DOMAIN <network id>

    最后,我们可以查询cloudflare-dns.YOUR_DOMAIN以查找CloudFlare的DNS服务器,速度非常快!

    $ host cloudflare-dns.YOUR_DOMAIN 1.2.3.4
    cloudflare-dns.YOUR_DOMAIN has address 1.1.1.1

    结论

    使用ZeroNSD,你可以为你的ZeroTier网络提供高性能的DNS解析服务,并根据需要自定义DNS记录。这可以帮助你更好地管理你的网络,提高性能,减少DNS查询的延迟,并提供更好的用户体验。

    如果你是ZeroTier用户,ZeroNSD绝对值得一试。通过按照本指南的步骤进行操作,你可以轻松地将ZeroNSD集成到你的网络中,并提供可靠的DNS解析服务。

  • 黑盒交易:用Python进行数据分析和人工智能交易的秘诀

    走进黑盒交易的世界

    每天,全球金融市场都在进行着数以亿计的交易。这些交易由各种各样的参与者执行,包括机构投资者、个人交易员以及高频交易公司。但在这个快节奏、高度竞争的环境中,有一群特殊的交易者采用了一种独特的方式来执行交易,他们被称为“黑盒交易者”。

    黑盒交易,也被称为算法交易或自动化交易,是一种交易方式,其中交易决策是由计算机程序而不是人类交易员进行的。这些程序使用数据分析、大数据和人工智能技术来识别交易机会、制定买卖策略,并执行交易。与传统的人工交易相比,黑盒交易具有更高的速度和效率,可以在瞬间做出多个交易决策,从而获得更好的交易结果。

    黑盒交易的优势

    为什么越来越多的交易者转向黑盒交易呢?这是因为黑盒交易具有一些明显的优势,包括:

    1. 无情执行

    黑盒交易程序执行交易决策时没有情感干扰。它们只会根据预定的规则和算法执行操作,不受恐惧、贪婪或情绪的影响。这有助于消除了许多人为错误,提高了交易的一致性。

    2. 高速度

    黑盒交易系统可以在毫秒级别内执行交易,远远快于人类交易员。这使得高频交易成为可能,可以在极短的时间内进行大量交易。

    3. 数据分析

    黑盒交易程序可以分析大量的市场数据,并根据这些数据制定决策。这使得它们能够识别出微小的价格差异和趋势,从而找到交易机会。

    4. 自动化

    一旦设置好,黑盒交易系统可以自动执行交易,无需人工干预。这使得交易者可以在不间断地监控市场的情况下进行交易。

    如何入门黑盒交易?

    如果你对黑盒交易感兴趣,并希望探索这个领域,下面是一些入门步骤:

    步骤1:学习Python编程

    Python是数据科学和算法交易的首选编程语言。它易于学习,拥有丰富的数据分析库和机器学习工具。你可以从在线教程和课程中学习Python编程,或者阅读相关的书籍。

    步骤2:理解数据分析

    数据分析是黑盒交易的核心。你需要学习如何收集、清洗和分析金融数据。这包括学习如何使用Python库如Pandas和NumPy来处理数据,以及如何使用数据可视化工具如Matplotlib和Seaborn来呈现数据。

    步骤3:熟悉大数据技术

    在黑盒交易中,你可能会处理大量的金融数据。了解大数据技术如Hadoop和Spark可以帮助你更有效地处理和分析数据。

    步骤4:深入学习机器学习

    机器学习是人工智能交易的关键。你需要学习如何使用机器学习算法来构建预测模型,以便识别交易机会。有许多在线课程和教材可以帮助你入门机器学习。

    步骤5:选择合适的交易平台

    选择一个适合你的交易平台,它应该能够执行你的交易策略并提供必要的数据。一些常用的交易平台包括Interactive Brokers、MetaTrader和QuantConnect。

    使用Python进行黑盒交易的示例

    以下是一个简单的示例,展示如何使用Python进行黑盒交易。

    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.metrics import accuracy_score
    import yfinance as yf
    
    # 收集金融数据
    data = yf.download('AAPL', start='2020-01-01', end='2021-01-01')
    
    # 创建特征和目标变量
    data['Price_Up'] = (data['Close'] - data['Close'].shift(1)) > 0
    X = data[['Open', 'High', 'Low', 'Volume']]
    y = data['Price_Up']
    
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
    
    # 构建随机森林模型
    model = RandomForestClassifier()
    model.fit(X_train, y_train)
    
    # 预测价格上涨
    y_pred = model.predict(X_test)
    
    # 计算准确率
    accuracy = accuracy_score(y_test, y_pred)
    print(f'模型准确率:{accuracy}')

    在这个示例中,我们使用了Python库来下载苹果股票(AAPL)的历史数据,并构建了一个随机森林分类模型来预测股价是否上涨。这只是一个简单的示例,黑盒交易的实际应用要复杂得多,

    但它展示了你可以使用Python进行数据分析和人工智能交易的可能性。

    结语

    黑盒交易是一个激动人心的领域,它结合了数据分析、大数据和人工智能技术,可以帮助你在金融市场中取得更好的交易结果。虽然入门可能需要一些学习和练习,但一旦掌握了必要的技能,你将能够利用Python进行数据分析和人工智能交易,为你的投资策略增加一份强大的助力。

    无论你是一名初学者还是已经有一些经验的交易员,学习黑盒交易都值得一试。开始你的黑盒交易之旅吧,探索数据的奥秘,挖掘潜在的交易机会!

  • 评估自动文摘质量的终极指南

    你是否曾经尝试过创建自动文摘系统,但却不知道如何准确评估其质量?本文将为您提供关于如何评估抽象文摘质量的详细指南。我们将介绍传统的评估方法,如ROUGE和BERTScore,以及一种创新的方法,利用大型语言模型(LLM)作为评估器。

    1. 开篇故事

    在探讨自动文摘质量评估之前,让我们来看一个生动有趣的故事。假设你是一名AI研究员,正在开发一款自动文摘系统,这个系统可以将长篇文章精炼成简短的摘要。你花费了数月时间不断改进算法,优化性能,但你开始面临一个棘手的问题:如何准确地评估你的文摘质量?这个问题在自然语言处理领域一直备受关注,因为它涉及到了如何衡量文本的准确性、连贯性和相关性。

    在这个教程中,我们将为你揭示评估自动文摘质量的关键方法,让你的工作更具实际应用性和可衡量性。

    2. 引言

    自动文摘质量评估是一个耗时的过程,因为它涉及到不同的质量指标,如连贯性、简洁性、可读性和内容。传统的自动评估指标,如ROUGE和BERTScore等,虽然具体可靠,但可能与实际文摘质量的相关性不高。特别是对于开放性生成任务,它们与人类评价的相关性相对较低。因此,在评估文摘质量时,越来越需要依赖人类评估、用户反馈或基于模型的指标,同时需要警惕潜在的偏见。虽然人类判断提供了宝贵的见解,但通常不具备可扩展性,并且成本较高。

    除了传统的评估指标,我们还展示了一种使用大型语言模型(LLM)的方法(G-Eval),用作评估抽象性摘要的新型、无参考度量。在这种情况下,我们使用gpt-4来评分候选输出。gpt-4已经有效地学习了语言质量的内部模型,使其能够区分流畅、连贯的文本和低质量的文本。利用这种内部评分机制,可以自动评估LLM生成的新候选输出。

    3. 安装必要的软件包

    在进行评估之前,我们需要安装一些必要的软件包,以便进行评估。这些包包括ROUGE、BERTScore和OpenAI的API。

    !pip install rouge --quiet
    !pip install bert_score --quiet
    !pip install openai --quiet
    import openai
    import os
    import re
    import pandas as pd
    
    # 这里放置Python实现ROUGE指标的代码
    from rouge import Rouge
    
    # BERTScore利用BERT的上下文嵌入并通过余弦相似度匹配候选和参考句子中的单词。
    from bert_score import BERTScorer
    
    openai.api_key = os.environ.get("OPENAI_API_KEY")

    4. 示例任务

    为了本教程的目的,我们将使用以下示例文摘任务。请注意,我们提供了两个生成的摘要供比较,以及一个参考的人工撰写摘要,这是ROUGE和BERTScore等评估指标所需的。

    摘录 (excerpt)

    OpenAI的使命是确保人工通用智能(AGI)造福全人类。OpenAI将直接构建安全和有益的AGI,但如果其工作有助于其他人实现这一目标,它也将认为使命已达成。OpenAI遵循几个关键原则。首先,广泛分布的利益 – 对AGI部署的任何影响都将用于全人类的利益,以避免有害的使用或权力过度集中。其次,长期安全 – OpenAI致力于进行研究,使AGI安全,并促进这些研究在AI社区中的采纳。第三,技术领导 – OpenAI旨在处于AI能力的前沿。第四,合作导向 – OpenAI积极与其他研究和政策机构合作,并寻求创建一个共同工作的全球社区,共同解决AGI的全球挑战。

    摘要 (Summaries):

    • 参考摘要 /ref_summary(人工生成)
      OpenAI的目标是确保人工通用智能(AGI)造福所有人,避免有害用途或权力过度集中。它致力于研究AGI的安全性,并在AI社区中促进这些研究。OpenAI旨在领导AI能力的发展,与全球研究和政策机构合作,解决AGI的挑战。

    • 评估摘要1 / eval_summary_1(系统生成)
      OpenAI旨在使AGI造福全人类,避免有

    害用途和权力集中。它引领安全和有益的AGI研究,并在全球促进采用。OpenAI在AI领域保持技术领导地位,与全球机构合作,解决AGI的挑战。它力求领导一个协作的全球努力,为集体利益开发AGI。

    • 评估摘要2 / eval_summary_2(系统生成)
      OpenAI旨在确保AGI供所有人使用,完全避免有害内容或权力过度集中。致力于研究AGI的安全性,并在AI社区中促进这些研究。OpenAI希望在AI领域处于领先地位,并与全球研究和政策团体合作,探讨AGI的相关问题。

    5. 使用ROUGE进行评估

    ROUGE是Recall-Oriented Understudy for Gisting Evaluation的缩写,主要用于衡量生成的输出与参考文本之间的词语重叠。这是评估自动文摘任务的一种流行指标。在其各种变体中,ROUGE-L提供了系统生成和参考摘要之间最长连续匹配的信息,衡量系统保留原始摘要要点的程度。

    # 计算ROUGE分数的函数
    def get_rouge_scores(text1, text2):
        rouge = Rouge()
        return rouge.get_scores(text1, text2)
    
    # 计算两个摘要与参考摘要之间的ROUGE分数
    eval_1_rouge = get_rouge_scores(eval_summary_1, ref_summary)
    eval_2_rouge = get_rouge_scores(eval_summary_2, ref_summary)
    
    rouge_scores_out = []
    
    for metric in ["rouge-1", "rouge-2", "rouge-l"]:
        for label in ["F-Score"]:
            eval_1_score = eval_1_rouge[0][metric][label[0].lower()]
            eval_2_score = eval_2_rouge[0][metric][label[0].lower()]
    
            row = {
                "Metric": f"{metric} ({label})",
                "Summary 1": eval_1_score,
                "Summary 2": eval_2_score,
            }
            rouge_scores_out.append(row)
    
    # 展示ROUGE分数
    rouge_scores_out_df = (
        pd.DataFrame(rouge_scores_out)
        .set_index("Metric")
    )
    
    rouge_scores_out_df

    上述代码计算了两个不同摘要与参考文本之间的ROUGE分数。在rouge-1方面,摘要2优于摘要1,表示单词重叠较多。而在rouge-l方面,摘要2得分较高,意味着最长公共子序列匹配较好,因此可能更好地捕捉了原始文本的主要内容和顺序。由于摘要2直接提取了摘录中的许多词汇和短语,因此与参考摘要的重叠可能较高,从而导致较高的ROUGE分数。

    然而,需要注意的是,尽管ROUGE和类似的指标(如BLEU和METEOR)提供了定量的度量,但它们通常无法捕捉良好生成摘要的真正本质。它们与人类评分的相关性也较差。鉴于LLM的进展,它们擅长生成流畅和连贯的摘要,传统的指标如ROUGE可能会误判这些模型,特别是如果摘要的表达方式不同但仍然准确地包括核心信息。

    6. 使用BERTScore进行评估

    ROUGE依赖于候选文本和参考文本中单词的精确匹配,无法解释底层语义。这就是BERTScore的作用,它利用BERT模型的上下文嵌入,旨在评估在机器生成的文本背景下,预测文本和参考句子之间的相似性。通过比较两者的嵌入,BERTScore捕获了传统n-gram指标可能忽略的语义相似性。

    # 实例化英语语言的BERTScorer对象
    scorer = BERTScorer(lang="en")
    
    # 计算摘要1与摘录的BERTScore
    P1, R1, F1_1 = scorer.score([eval_summary_1], [ref_summary])
    
    # 计算摘要2与摘录的BERTScore
    P2, R2, F2_2 = scorer.score([eval_summary_2], [ref_summary])
    
    print("摘要1 F1分数:", F1_1.tolist()[0])
    print("摘要2 F1分数:", F2_2.tolist()[0])

    上述代码计算了两个摘要与摘录之间的BERTScore分数。F1分数接近表明它们在捕获关键信息方面表现相似。然而,这种小差异应谨慎解释。由于BERTScore可能无法完全理解人类评估员可能理解的微妙和高级概念,仅依赖于这一指标可能会导致对摘要的实际质量和细微差别进行错误解读。将BERTScore与人工评估和其他指标结合使用可以提供更可靠的评估。

    7. 使用GPT-4进行评估

    在这里,我们实现了一个使用gpt-4的示例无参考文本评估器,受到G-Eval框架的启发,该框架使用大型语言模型评估生成文本的质量。与ROUGE或BERTScore等依赖于与

    参考摘要的比较的指标不同,基于gpt-4的评估器仅基于输入提示和文本评估生成内容的质量,而无需任何基准参考。这使其适用于新数据集和任务,其中人类参考文献稀缺或不可用。

    以下是此方法的概述:

    • 我们定义了四个不同的标准:

      • 相关性:评估摘要是否仅包含重要信息并排除多余信息。
      • 连贯性:评估摘要的逻辑流程和组织结构。
      • 一致性:检查摘要是否与源文档中的事实一致。
      • 流畅性:评估摘要的语法、拼写、标点、词汇选择和句子结构。
    • 我们为每个标准创建提示,以原始文档和摘要作为输入,并利用思维链生成和引导模型以输出每个标准的1-5之间的数值评分。

    • 我们使用定义的提示从gpt-4生成分数,然后比较它们在不同摘要之间。

    # 评估提示模板基于G-Eval
    EVALUATION_PROMPT_TEMPLATE = """
    您将获得一份为一篇文章写的摘要。您的任务是根据一个度量标准对摘要进行评分。
    请确保您非常仔细地阅读和理解这些说明。
    请在审阅时保持这个文档打开,并根据需要参考它。
    
    评估标准:
    
    {criteria}
    
    评估步骤:
    
    {steps}
    
    示例:
    
    源文本:
    
    {document}
    
    摘要:
    
    {summary}
    
    评估表单(仅分数):
    
    - {metric_name}
    """
    
    # 标准1:相关性
    RELEVANCY_SCORE_CRITERIA = """
    相关性(1-5) - 从源文本中选择重要内容。 \
    摘要应仅包含源文档中的重要信息。 \
    评估员被要求惩罚包含冗余和多余信息的摘要。
    """
    
    RELEVANCY_SCORE_STEPS = """
    1. 仔细阅读摘要和源文档。
    2. 比较摘要与源文档,并确定文章的主要要点。
    3. 评估摘要多好地涵盖了文章的主要要点,以及它包含了多少无关或多余的信息。
    4. 指定一个从1到5的相关性评分。
    """
    
    # 标准2:连贯性
    COHERENCE_SCORE_CRITERIA = """
    连贯性(1-5) - 所有句子的综合质量。 \
    我们将此维度与DUC质量问题中的结构和连贯性一致,即“摘要应该具有良好的结构和组织。 \
    摘要不应仅仅是一堆相关信息,而应该从句子到一\
    个关于一个主题的连贯信息体中逐渐构建起来。”
    """
    
    COHERENCE_SCORE_STEPS = """
    1. 仔细阅读文章,确定主要主题和要点。
    2. 仔细阅读摘要,并将其与文章进行比较。检查摘要是否涵盖了文章的主要主题和要点,
       并且是否以清晰且逻辑的顺序呈现它们。
    3. 根据评估标准,为连贯性评分,评分范围从1到5,其中1是最低的,5是最高的。
    """
    
    # 标准3:一致性
    CONSISTENCY_SCORE_CRITERIA = """
    一致性(1-5) - 摘要与被总结源文之间的事实一致性。 \
    一个事实一致的摘要仅包含源文档支持的陈述。 \
    评估员还被要求惩罚包含虚构事实的摘要。
    """
    
    CONSISTENCY_SCORE_STEPS = """
    1. 仔细阅读文章,确定它呈现的主要事实和细节。
    2. 仔细阅读摘要,并将其与文章进行比较。检查摘要是否包含文章不支持的任何事实错误。
    3. 根据评估标准,为一致性评分。
    """
    
    # 标准4:流畅性
    FLUENCY_SCORE_CRITERIA = """
    流畅性(1-3): 摘要的质量,涉及语法、拼写、标点、词汇选择和句子结构。
    1: 差。摘要有许多错误,使其难以理解或听起来不自然。
    2: 一般。摘要有一些错误,影响了文本的清晰度或流畅性,但主要要点仍然可以理解。
    3: 良好。摘要几乎没有错误,阅读和理解起来很容易。
    """
    
    FLUENCY_SCORE_STEPS = """
    阅读摘要并根据给定的标准评估其流畅性。指定一个从1到3的流畅性评分。
    """
    
    # 为不同标准准备数据
    evaluation_metrics = {
        "相关性": (RELEVANCY_SCORE_CRITERIA, RELEVANCY_SCORE_STEPS),
        "连贯性": (COHERENCE_SCORE_CRITERIA, COHERENCE_SCORE_STEPS),
        "一致性": (CONSISTENCY_SCORE_CRITERIA, CONSISTENCY_SCORE_STEPS),
        "流畅性": (FLUENCY_SCORE_CRITERIA, FLUENCY_SCORE_STEPS),
    }
    
    summaries = {"摘要1": eval_summary_1, "摘要2": eval_summary_2}
    
    data = {"评估
    
    标准": [], "摘要": [], "评分": []}
    
    for metric, (criteria, steps) in evaluation_metrics.items():
        for summary_name, summary_text in summaries.items():
            prompt = EVALUATION_PROMPT_TEMPLATE.format(
                criteria=criteria, steps=steps, document=excerpt, summary=summary_text, metric_name=metric
            )
            response = openai.Completion.create(
                engine="text-davinci-003", prompt=prompt, max_tokens=100
            )
            rating = int(re.search(r"\d", response.choices[0].text).group())
            data["评估标准"].append(metric)
            data["摘要"].append(summary_name)
            data["评分"].append(rating)
    
    # 将数据转换为DataFrame以进行比较
    evaluation_df = pd.DataFrame(data)
    
    # 输出评估结果
    evaluation_df

    上述代码使用gpt-4基于定义的四个标准为两个摘要生成了1-5之间的分数。这些标准包括相关性、连贯性、一致性和流畅性。根据每个标准的提示,gpt-4生成了评分,然后将这些评分与不同摘要进行比较。根据评估结果,您可以看到每个摘要在不同标准下的表现如何。

    8. 总结

    自动文摘质量评估是一个复杂的任务,涉及多个方面,包括文本的相关性、连贯性、一致性和流畅性。传统的评估指标如ROUGE和BERTScore提供了一种方式来量化自动生成的文本与参考文本之间的相似性,但它们不能全面捕捉文本质量的各个方面。因此,将它们与基于大型语言模型的评估器结合使用可能会更全面地评估文本质量。

    在这个教程中,我们展示了如何使用ROUGE、BERTScore和基于gpt-4的评估器来评估自动生成的文本的质量。请记住,这些指标和方法只是评估文本质量的一部分,最终的评估可能需要人工评估和用户反馈来全面评估文本生成系统的性能。希望这个指南能帮助您更好地了解如何评估自动文摘质量,从而改进和优化您的自动生成文本的系统。

  • 提高Spring Boot应用的并发处理能力:解决A服务中的瓶颈问题

    当处理 Spring Boot 应用程序的并发问题时,您通常需要考虑如何提高应用程序的性能,以处理多个并发请求。在某些情况下,您的应用程序可能需要与外部服务通信,这可能会成为性能瓶颈。本教程将介绍一些方法,以帮助您提高 Spring Boot 应用程序的并发处理能力。

    开篇故事

    假设您的公司有一个小程序,最初是直接调用服务 B 的接口。然而,现在的情况是小程序通过调用服务 A 的接口,而服务 A 又需要调用服务 B 来获取某些数据(例如,用于构造调用 B 服务所需的令牌)。您的任务是重构服务 A,以提高其并发处理能力,以便更好地应对小程序的需求。

    提高 Spring Boot 应用程序的并发处理能力

    以下是一些方法,可以帮助您提高 Spring Boot 应用程序的并发处理能力:

    1. 引入缓存

    您可以使用缓存来存储来自服务 B 的令牌,避免每次请求都需要调用 B 服务接口来获取令牌。您可以选择使用内存缓存或分布式缓存,具体选择取决于您的需求。

    // 示例:使用 Spring Cache 注解配置缓存
    @Cacheable("tokenCache")
    public String getToken() {
        // 获取令牌的逻辑
    }

    2. 异步处理

    将服务 A 中调用服务 B 的逻辑改为异步处理。可以使用消息队列或异步任务来实现。这样,当小程序调用 A 服务的接口时,A 服务将请求放入消息队列或异步任务中,然后立即返回响应给小程序,无需等待 B 服务的返回结果。

    // 示例:使用 Spring 的 @Async 注解实现异步方法
    @Async
    public void callServiceBAsync() {
        // 调用服务 B 的逻辑
    }

    3. 并发请求

    可以使用多线程、线程池或异步框架来实现并发请求,以提高处理能力。这样,您可以同时调用 B 服务的接口,加快处理速度。

    // 示例:使用 Java 线程池实现并发请求
    ExecutorService executorService = Executors.newFixedThreadPool(10);
    
    List<Future<?>> futures = new ArrayList<>();
    
    for (int i = 0; i < 10; i++) {
        futures.add(executorService.submit(() -> {
            // 并发调用服务 B 的逻辑
        }));
    }
    
    // 等待所有任务完成
    for (Future<?> future : futures) {
        future.get();
    }
    
    executorService.shutdown();

    4. 服务拆分

    如果服务 A 的并发处理能力仍然不足,可以考虑将 A 服务拆分成多个微服务,每个微服务负责不同的功能模块。这样可以将负载分散到多个服务上,提高整体的并发处理能力。

    5. 优化代码

    对服务 A 的代码进行优化,提高代码的执行效率。可以通过优化算法、减少不必要的计算、减少数据库查询等方式来提高代码的性能。

    // 示例:代码优化,减少数据库查询次数
    public String getData() {
        if (cachedData != null) {
            return cachedData;
        } else {
            // 查询数据库并缓存结果
            cachedData = databaseService.getDataFromDatabase();
            return cachedData;
        }
    }

    以上是一些提高 Spring Boot 应用程序并发处理能力的建议。根据您的具体情况和需求,选择合适的方法来重构您的应用程序,以更好地应对并发请求。

  • 如何使用Chat模型进行微调:一个食谱命名实体识别教程

    在数字时代,人工智能技术正不断演进,为我们的生活和工作带来了革命性的变化。开放AI(OpenAI)的GPT-3.5-turbo模型是一项重要的技术,它可以用于各种自然语言处理任务,包括聊天和命名实体识别(NER)。本教程将向您展示如何使用GPT-3.5-turbo进行微调,以执行食谱命名实体识别任务。

    1. 引子:解锁人工智能的潜力

    在当今的数字世界中,人工智能技术正日益成熟和普及。无论是自动化客户支持,还是从大规模数据中提取有用信息,AI都发挥着关键作用。而GPT-3.5-turbo模型是一种强大的AI工具,可以用于许多自然语言处理任务,使您能够创建智能聊天机器人,或者像本教程一样执行命名实体识别任务。

    2. 准备工作:设置环境

    在开始微调之前,确保您已经安装了最新版本的OpenAI Python包,并已获取了OpenAI API密钥。这个密钥将用于与GPT-3.5-turbo模型进行通信。

    # 安装最新版本的OpenAI Python包
    !pip install --upgrade openai
    
    import json
    import openai
    import os
    import pandas as pd
    from pprint import pprint
    
    # 添加您的OpenAI API密钥
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")

    3. 数据准备:准备数据进行微调

    在进行微调之前,您需要准备训练数据。在本教程中,我们将使用食谱数据集,并从中提取通用的食材名称作为命名实体。以下是数据准备的步骤:

    3.1 数据集加载和筛选

    为了进行微调,我们需要一个特定领域的数据集。数据集应该足够专注,以便模型可以学习,但也要足够通用,以便不会错过未见过的示例。在本教程中,我们从RecipesNLG数据集中提取了一个子集,该子集只包含来自www.cookbooks.com的文档。

    # 读取我们将在此任务中使用的数据集
    recipe_df = pd.read_csv("data/cookbook_recipes_nlg_10k.csv")
    
    # 显示数据集的前几行
    recipe_df.head()

    3.2 数据格式转换

    在微调时,我们需要将数据转换为适用于ChatCompletion格式的训练示例。每个训练示例都是一个包含多个消息的对话列表。以下是数据转换的示例代码:

    training_data = []
    
    system_message = "You are a helpful recipe assistant. You are to extract the generic ingredients from each of the recipes provided."
    
    def create_user_message(row):
        return f"""Title: {row['title']}\n\nIngredients: {row['ingredients']}\n\nGeneric ingredients: """
    
    def prepare_example_conversation(row):
        messages = []
        messages.append({"role": "system", "content": system_message})
    
        user_message = create_user_message(row)
        messages.append({"role": "user", "content": user_message})
    
        messages.append({"role": "assistant", "content": row["NER"]})
    
        return {"messages": messages}
    
    # 对数据集的每一行应用数据转换函数
    training_data = recipe_df.apply(prepare_example_conversation, axis=1).tolist()

    3.3 上传文件

    将转换后的数据保存为.jsonl文件,然后上传到OpenAI的Files端点,以供微调使用。

    def write_jsonl(data_list: list, filename: str) -> None:
        with open(filename, "w") as out:
            for ddict in data_list:
                jout = json.dumps(ddict) + "\n"
                out.write(jout)
    
    # 保存训练数据和验证数据为.jsonl文件
    training_file_name = "tmp_recipe_finetune_training.jsonl"
    write_jsonl(training_data, training_file_name)
    
    validation_file_name = "tmp_recipe_finetune_validation.jsonl"
    write_jsonl(validation_data, validation_file_name)
    
    # 使用OpenAI的Files端点上传文件
    training_response = openai.File.create(
        file=open(training_file_name, "rb"), purpose="fine-tune"
    )
    training_file_id = training_response["id"]
    
    validation_response = openai.File.create(
        file=open(validation_file_name, "rb"), purpose="fine-tune"
    )
    validation_file_id = validation_response["id"]

    4. 微调模型

    现在,我们可以使用准备好的文件创建微调任务。在创建任务时,我们需要指定训练文件、验证文件、模型名称和可选的后缀来标识模型。以下是微调模型的示例代码:

    response = openai.FineTuningJob.create(
        training_file=training_file_id,
        validation_file=validation_file_id,
        model="gpt-3.5-turbo",
        suffix="recipe-ner",
    )
    
    job_id = response["id"]

    您可以使用以下代码检查微调任务的状态:

    response = openai.FineTuningJob.retrieve(job_id)
    
    print("Job ID:", response["id"])
    print("Status:", response["status"])

    5. 跟踪微调进度

    微调任务可能需要一些时间来完成。您可以使用以下代码跟踪微调进度:

    response = openai.FineTuningJob.list_events(id=job_id, limit=50)
    
    events = response["data"]
    events.reverse()
    
    for event in events:
        print(event["message"])

    6. 微调成功!

    一旦微调任务完成,您将获得一个微调模型的ID。以下是

    如何获取微调模型的示例代码:

    response = openai.FineTuningJob.retrieve(job_id)
    fine_tuned_model_id = response["fine_tuned_model"]
    
    print("Fine-tuned model ID:", fine_tuned_model_id)

    7. 使用微调模型进行推理

    最后,您可以使用微调的模型来执行推理。只需调用ChatCompletions并指定微调模型的名称和消息列表。以下是如何使用微调模型进行推理的示例代码:

    test_df = recipe_df.loc[201:300]
    test_row = test_df.iloc[0]
    test_messages = []
    test_messages.append({"role": "system", "content": system_message})
    user_message = create_user_message(test_row)
    test_messages.append({"role": "user", "content": create_user_message(test_row)})
    
    response = openai.ChatCompletion.create(
        model=fine_tuned_model_id, messages=test_messages, temperature=0, max_tokens=500
    )
    print(response["choices"][0]["message"]["content"])

    8. 结论

    通过本教程,您已经学会了如何使用GPT-3.5-turbo模型进行微调,以执行食谱命名实体识别任务。这个过程涵盖了数据准备、模型微调和推理的所有关键步骤。希望这个教程对您在自然语言处理领域的工作和项目中有所帮助。

  • Linux Kernel 6.5发布:初步支持Wi-Fi 7和USB4

    是时候迎来新的Linux内核发布了!

    Linux 6.5内核已经发布,它在之前的Linux 6.4内核基础上进行了改进,并引入了一些显著的变化和新增功能。

    Linus Torvalds提到这次发布非常顺利:

    过去的一周没有发生特别奇怪或可怕的事情,因此没有理由推迟6.5版本的发布。

    我仍然有一种烦人的感觉,认为很多人都在度假,事情之所以安静,部分原因是因为这个。但这次发布进展顺利,所以这可能只是我多疑。上周最大的补丁只是针对我们自己的自测。

    ? Linux Kernel 6.5:有什么新特性?
    用户应该注意,这是一个非LTS版本。如果你想要尝试最新功能,那么这个版本适合你。否则,升级是不必要的,除非它修复了特定问题或提高了性能。

    以下是新内核版本的主要亮点:

    1. 支持AMD FreeSync视频的开箱即用:在此版本中,重新引入了对AMD FreeSync视频模式的支持,并默认启用。它早在Linux内核5.8中引入过,但由于存在错误而被撤销。启用AMD FreeSync模式后,可以通过将显示器的刷新率与显卡的帧率匹配来大大减少游戏和视频中的画面撕裂和卡顿。

    2. 默认的P-State "Active"模式适用于AMD CPU:现代AMD CPU,特别是那些使用Zen 2及以上架构的CPU,现在将使用amd-pstate作为默认的CPU性能调节驱动程序。此前,默认情况下由CPUFreq管理CPU缩放机制。现在,amd-pstate提供了三种模式:active、passive和guided autonomous。在这个版本中,默认启用了"active"模式,取代了先前Linux内核6.4中使用的guided autonomous模式。据Phoronix的一些基准测试显示,amd-pstate的性能优于CPUFreq。

    3. ASUS ROG Ally声音优化:ASUS ROG Ally是AMD Z1和Z1 Extreme SoCs驱动的Windows掌上游戏电脑的直接竞争对手。它于今年7月发布。拥有ASUS ROG Ally的Linux玩家可以期待看到该系统音频设备的补丁发布,多亏了这个提交。

    4. USB4 v2和WiFi 7的初步支持:下一代无线标准WiFi 7的工作已经进行了相当长的时间。作为一个快速的事实,WiFi 7支持6GHz频段,最大数据传输速率为23Gbps!此外,下一代USB4标准的开发工作也已经开始。USB4支持80Gbps的数据传输速率!通过WiFi的合并和WiFi 7的请求,早期支持已经集成到Linux 6.5内核中。

    ?️ 其他变更和改进
    除了主要亮点之外,还有一些需要提及的事项:

    • 修复了Intel P-State的CPU缩放问题
    • 对Btrfs的性能改进和其他存储优化
    • 对最新的Xbox控制器提供了震动支持
    • 为AMD Radeon RX 7000系列显卡提供了超频支持
    • 为AMD和英特尔图形驱动程序提供了各种改进和优化
    • 增加了更多的Rust代码转换

    官方发布公告会提供自上一次发布候选版以来的简短日志。如果你对技术细节感兴趣,可以参考更新日志。

    安装Linux Kernel 6.5
    你可以使用像Arch或Fedora这样的滚动发布的发行版轻松升级到Linux Kernel 6.5。这些发行版在发布后不久就会提供最新的内核。

    另一方面,使用Ubuntu及其衍生发行版的用户应该期待在Ubuntu 23.10中看到这个Linux内核版本的使用。通过使用Pop OS和Linux Lite等发行版,你可以更早地期待这个内核版本。

    你可以从官方网站下载最新Linux Kernel的tarball(发布后需要一些时间才能获得)。

    ? 在评论中分享你对最新内核发布的看法。

  • 如何在Ubuntu Linux上释放/boot分区的空间

    最近,我收到了一个警告,提示/boot分区几乎已满或没有剩余空间了。是的,我使用的是一个单独的/boot分区,不过现在不太多的人这样做了。

    这是我第一次看到这样的错误,让我感到困惑。现在,有几种方法可以在Ubuntu(或基于Ubuntu的发行版)上释放空间,但并不是所有方法都适用于这种情况。

    因此,我决定写一篇文章,介绍我采取的步骤,以释放/boot分区的一些空间。

    在Ubuntu上释放/boot分区的空间(如果你的/boot分区快满了)

    我建议你仔细阅读这些解决方案,并选择最适合你情况的方法。这些方法都很简单,但在生产系统上执行其中一些操作时,你需要格外谨慎。

    方法1:使用apt autoremove

    你不需要成为终端专家来执行这个操作,只需一个命令,你就可以删除未使用的内核,从而释放/boot分区的空间。

    你只需要输入以下命令:

    sudo apt autoremove

    这不仅会删除未使用的内核,还会删除你不需要的依赖项,或者不被任何已安装工具所需要的依赖项。

    输入命令后,系统将列出将要被删除的内容,你只需确认操作。如果你好奇的话,你可以仔细查看它到底删除了什么。

    你需要按下Y键以继续。

    值得注意的是,如果/boot分区剩余的空间很少并且你收到了警告,这种方法只会起作用。但是,如果/boot分区已满,APT可能根本无法工作。

    在下一种方法中,我将介绍两种不同的方式,通过这两种方式你可以使用GUI和终端来删除旧的内核,以释放空间。

    方法2:手动删除未使用的内核(如果apt autoremove无效)

    在尝试删除旧的内核以释放空间之前,你需要确定当前活动的内核,并确保你不删除它。

    要检查你的内核版本,请在终端中输入以下命令:

    uname -r

    uname命令通常用于获取Linux系统信息。这个命令显示了当前正在使用的Linux内核。

    现在,你知道了你当前的Linux内核是什么,你只需要删除与此版本不匹配的内核。你应该将它记录在某个地方,以确保你不会意外删除它。

    接下来,你可以使用终端或GUI来删除它。

    警告!

    在删除内核时要特别小心。只删除旧内核,不要删除你当前正在使用的内核,否则你的系统将会损坏。

    使用GUI工具删除旧的Linux内核

    你可以使用Synaptic软件包管理器或类似Stacer的工具来开始操作。在我遇到/boot分区已满且apt不可用的情况下,我使用Stacer来删除旧的内核。让我来演示一下它是如何工作的。

    首先,你需要启动“Stacer”,然后按照下面的截图所示导航到软件包卸载器。

    在这里,搜索“image”,你将找到你拥有的Linux内核的图像。你只需要删除旧的内核版本,而不是你当前的内核镜像。

    在上面的截图中,我标出了我的当前内核和旧的内核,所以你必须小心你系统上的内核版本。

    你不需要删除其他任何东西,只需删除旧的内核版本。

    类似地,在软件包列表中搜索“headers”,并删除如下所示的旧内核。

    只是提醒一下,你不想删除“linux-headers-generic”。只关注带有版本号的那些。

    就是这样,你完成了,apt将再次正常工作,你已成功从/boot分区中释放了一些空间。同样,你可以使用任何其他你熟悉的软件包管理器来执行此操作。

    使用命令行删除旧的内核

    这与使用终端是一样的。因此,如果你没有使用GUI的选项(如果是远程机器/服务器),或者如果你只是习惯使用终端,那么你可以按照下面的步骤操作。

    首先,使用以下命令列出所有已安装的内核:

    ls -l /boot

    那些被标记为“old”的或与你当前的内核版本不匹配的内核,就是你可以删除的未使用内核。

    现在,你可以使用rm命令来从/boot分区删除特定的内核,使用以下命令(每个内核一个命令):

    sudo rm /boot/vmlinuz-5.4.0-7634
    
    -generic

    请确保检查你系统的版本 – 对于你的系统可能会有所不同。

    如果你有很多未使用的内核,这将需要时间。因此,你也可以使用以下命令来删除多个内核:

    sudo rm /boot/*-5.4.0-{7634}-*

    澄清一下,你需要用逗号分隔的方式写出内核版本的最后部分/代码,以便一次删除所有内核。

    假设我有两个旧内核5.4.0-7634-generic和5.4.0-7624,那么命令将是:

    sudo rm /boot/*-5.4.0-{7634,7624}-*

    如果你不想在grub引导菜单中看到旧的内核版本,你可以使用以下命令来更新grub:

    sudo update-grub

    就是这样。你完成了。你已经释放了空间,如果/boot分区已满并且引起了APT的问题,你也可能已经解决了这个问题。

    在某些情况下,你可能需要输入以下命令来修复损坏的apt(我在论坛上看到一些人这样做):

    sudo dpkg --configure -a
    sudo apt install -f

    请注意,除非你发现APT损坏,否则不需要输入上述命令。就我个人而言,我不需要这些命令,但我发现它们对一些人来说在论坛上非常有用。

    故障排除
    如果你在执行这些操作时遇到问题,请在评论中告诉我,我将尽力提供帮助。

    这就是如何在Ubuntu Linux上释放/boot分区的空间。如果你的系统提示/boot分区没有剩余空间,这些方法应该可以帮助你解决问题。

  • 让你的Windows系统准备好运行虚拟机

    你是否曾经遇到过在使用VirtualBox时出现“无法打开虚拟机会话”的错误?这可能是因为你的系统没有启用虚拟化技术。

    为了在Windows系统上创建虚拟机,你需要确保系统已经做好了一些准备工作。在本篇文章中,我将为你介绍如何准备你的Windows系统以运行虚拟机。

    开篇故事

    想象一下这个场景:你正准备在Windows系统上运行一个重要的虚拟机,但突然出现了一个让你束手无策的错误信息。这是每个使用虚拟机的人都可能遇到的问题。但是不要担心,我将向你展示如何准备你的Windows系统,以避免这些问题的发生,并顺利运行虚拟机。

    第一步:启用虚拟化技术

    如果你使用的是预装了Windows 10/11的系统,那么很可能已经启用了虚拟化技术,你无需进行任何设置。但如果你手动安装了Windows操作系统,那么你需要检查BIOS设置,看看是否支持虚拟化技术。

    虚拟化技术的启用对于虚拟机程序的正常运行至关重要。如果未启用虚拟化技术,虚拟机程序将无法工作并显示错误信息。

    以下是检查虚拟化技术是否启用的基本步骤:

    1. 进入UEFI固件设置(或BIOS菜单)。通常,你可以通过按下“Del”键或F1、F2、F10或F12键来访问它。

      根据主板制造商的不同,用户界面可能会有所不同。但在大多数情况下,你需要导航到其中的“高级”选项,并访问“CPU配置”设置。

    2. 在CPU配置中,你需要启用“Intel (VMX)虚拟化技术”或“SVM模式”(适用于AMD处理器)。

    启用虚拟化技术后,你就可以顺利使用虚拟机程序了。

    第二步:选择虚拟机程序

    要创建和管理虚拟机,你需要选择一个虚拟机程序。在Windows系统中,有两个主要选择:Hyper-V和第三方虚拟机程序。

    Hyper-V

    Hyper-V是Microsoft内置的虚拟机程序,如果你使用的是Windows Pro/Education/Enterprise版本,那么可以很容易地启用它。以下是启用Hyper-V的步骤:

    1. 在控制面板中搜索“Windows功能”或通过“控制面板” -> “程序” -> “打开或关闭Windows功能”来找到它。

    2. 点击“Hyper-V”并点击“确定”。

    3. 系统将自动应用更改并获取所需的文件。你只需要等待一段时间。

    4. 完成后,系统会要求你重新启动以生效新功能。

    请注意,Hyper-V不适用于Windows 10/11家庭版。

    第三方虚拟机程序

    虽然使用Hyper-V可以获得更好的虚拟机性能,但它不太容易使用。因此,我们建议普通用户使用第三方虚拟机程序。

    其中,VirtualBox是一个不错的选择。它是一个开源程序,具有丰富的功能和用户友好的界面。你可以在Windows、Linux和macOS上使用它。

    你还可以选择像VMware Workstation这样的专有选项,它也非常流行。

    第三步:检查系统资源和要求

    创建和使用虚拟机并不是非常消耗资源的过程。然而,有一些变量可能需要你关注:

    • 确保你的系统至少有4 GB的RAM(越多越好)。
    • 64位处理器,具有双核或更多核心。

    如果你不知道,虚拟机会使用你系统的资源,即使它们是独立的虚拟机。大多数最低规格建议包括4 GB的RAM,但我建议使用8 GB以上。

    如果你想运行两个虚拟机,那么在Windows上可能需要更多的RAM。

    除了内存外,你应该拥有一个拥有多个核心的处理器。这样,一些核心可以用于虚拟机,另一些可以用于主机上的其他任务。

    最后,要注意磁盘空间。对于虚拟机,磁盘通常是动态分配的,这意味着随着操作系统和文件的增加,物理存储驱动器上的空间会被占用。

    在某些类型的虚拟磁盘中,它会保留你指定的整个空间。因此,在执行此操作之前,请检查启动之前的可用磁盘空间。通常情况下,选择一个不安装Windows系统的分区作为虚拟机磁盘是一个不错的选择。

    结论

    通过按照以上步骤来准备你的Windows系统,你可以轻松地运行和管理虚拟机。现在,你可以在Windows上轻松安装Linux虚拟机,开始你的虚拟化之旅。

    如果你还有其他关于虚拟机的问题或想要了解更多信息,欢迎在下面的评论中与我们分享你的想法。