2023年12月

兴趣是最好的老师,
HelloGitHub
让你对编程感兴趣!

简介

HelloGitHub
分享 GitHub 上有趣、入门级的开源项目。

https://github.com/521xueweihan/HelloGitHub

这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C++、Swift...让你在短时间内感受到开源的魅力,对编程产生兴趣!


以下为本期内容|每个月
28
号更新

C 项目

1、
rsync
:Linux 远程同步文件的工具。该项目提供了一种快速、增量的文件传输方式,即仅传输有变动的部分,可用于远程同步和备份文件。

C# 项目

2、
Kavita
:一款功能丰富的在线阅读平台。该项目可以在本地架设一个阅读漫画和电子书的 Web 平台,在手机、平板、台式机等设备上都有着出色的访问体验。

3、
LittleBigMouse
:Windows 多显示器鼠标平滑移动的工具。在 Windows 多显示器、分辨率不一致的情况下,鼠标在屏幕间移动会出现跳跃,比如外接了一台 4k 屏幕的和一台 2k 的屏幕,从 4k 屏幕中间挪到 2k 屏幕,鼠标就出现在底部了。该项目可以完美解决这个鼠标跳跃的问题,实现 Windows 多显示器鼠标平滑移动。来自
@Wu Zheng
的分享

C++ 项目

4、
Modern-CPP-Programming
:现代 C++ 编程课程。该教程面向有一定编程基础的人,内容涵盖 C++ 编程的基础知识、高级 C++ 语义和概念。

5、
WechatExporter
:微信聊天记录迁移和备份工具。这是一个用于导出微信聊天记录的工具,支持以 HTML、PDF 或文本格式保存聊天内容,适用于 Windows 和 macOS 系统。

Go 项目

6、
mailpit
:带 API 的电子邮件测试工具。这是一个小型、快速、多平台的电子邮件测试工具,它可以充当一个 SMTP 服务器,自带 Web 界面,支持模拟电子邮件接收、切换不同设备查看邮件等功能,还提供了可用于自动集成测试的接口。

7、
muffet
:Go 写的网站链接检查工具。该项目通过多线程和递归的方式,检查目标网站中所有页面的链接。它使用简单、速度快,支持 a、img、link、script 等多种标签。

8、
one-api
:OpenAI 接口管理和分发系统。该项目集成了各种大模型,并统一转化成了类似 OpenAI 接口的服务。它开箱即用、单文件,支持负载均衡、令牌管理、兑换码、用户分组、查看额度、邀请奖励等功能,可用于自建 ChatGPT 服务。

9、
zen
:一款适用于 PC 的广告拦截器。该项目是采用 Go 语言 Wails 框架写的能够屏蔽各种广告的桌面工具。它的工作原理是设置一个代理,拦截所有应用的 HTTP 请求,从而阻止广告和跟踪行为的请求,支持 Windows、macOS 和 Linux 操作系统。

Java 项目

10、
sensitive-word
:用于过滤敏感词的 Java 库。该项目是基于 DFA 算法实现的高性能敏感词过滤工具,词库收录了 6w+ 内容,支持自定义敏感词、白名单、替换策略、数字常见形式的互换、忽略重复词等功能。

11、
SMS4J
:Java 的短信服务聚合框架。该项目集成了国内众多第三方短信服务,简化了接入多个短信 SDK 的流程,仅通过修改配置文件,就能轻松实现发送短信的功能。来自
@ヽ米 饭
的分享

@RestController
@RequestMapping("/test/")
public class DemoController {

    // 测试发送固定模板短信
    @RequestMapping("/")
    public void doLogin(String username, String password) {
         //阿里云向此手机号发送短信
        SmsFactory.createSmsBlend(SupplierType.ALIBABA).sendMessage("18888888888","123456");
        //华为短信向此手机号发送短信
        SmsFactory.createSmsBlend(SupplierType.HUAWEI).sendMessage("16666666666","000000");
    }
}

JavaScript 项目

12、
daedalOS
:跑在浏览器里的桌面环境。该项目是用 JavaScript 写的运行在浏览器中的仿 Windows 桌面操作系统,支持开始菜单、动态壁纸、命令行终端、视频播放器、3D 弹球、Markdown 查看器、浏览器等功能。

13、
miniPaint
:免费的在线图片编辑器。该项目无需安装、可直接在浏览器中运行,支持创建/编辑图像、图层、滤镜、马赛克、绘图工具等功能。

14、
multipleWindow3dScene
:炫酷的前端量子纠缠效果。量子纠缠是一种量子力学现象,即两个或多个量子不论相距多远都存在一种关联。该项目通过使用 Three.js 和 localStorage 跨多个浏览器窗口,展示了这一量子力学现象。来自
@YJLTF
的分享

15、
omnivore
:一款免费、多端的稍后阅读工具。该项目采用 TypeScript + Next.js 构建而成,支持保存文章、电子邮件、文档和同步 Obsidian 等个人知识管理系统的内容,以便日后阅读。而且还提供了 iOS、Android 客户端和浏览器插件,方便随时随地阅读。

16、
vue-naive-admin
:一款极简风格的 Vue 管理后台。这是一个开源、免费、可商用的后台管理模板,基于 Vue3、Vite4、Pinia、Unocss 和 Naive UI 等前端最新技术栈。它简洁、轻量、风格清新,上手成本低,适合中小型项目或者个人项目。来自
@Ronnie Zhang
的分享

Kotlin 项目

17、
Calendar
:适用于 Android 的高度可定制的日历库。这是一个用于开发 Android 日历应用的库,内含示例应用。提供了周或月模式显示、边界日期、水平或垂直滚动等功能,可以随心所欲地设计日历。

PHP 项目

18、
BookStack
:一个简单、开箱即用的 wiki 平台。该项目是基于 PHP 和 Laravel 的 wiki 平台,拥有搜索、Markdown 编辑器、绘图、多语言、身份验证等功能。

Python 项目

19、
django-tailwind
:Django 集成 Tailwind CSS 的库。该项目可以让你在 Django 项目中轻松地使用 Tailwind CSS 框架,内含 Tailwind CSS 官方的排版、表单、line-clamp 等插件。

20、
frigate
:一款围绕实时 AI 对象检测构建的开源 NVR。该项目基于 OpenCV 和 Tensorflow 实现在本地为 IP Camera 提供实时目标检测和安全报警等功能,还支持根据设定的规则,保留检测到物体的视频。

21、
sqlglot
:一个非常全面的 SQL 解析器。该项目是用 Python 写的 SQL 解析器、转译器和优化器,它可以格式化 SQL 以及支持在 20 种不同方言和 SQL 之间进行转化,可用来自定义解析器、分析查询,用编程方式构建 SQL。

import sqlglot

# SQL 转 Spark
sql = """WITH baz AS (SELECT a, c FROM foo WHERE a = 1) SELECT f.a, b.b, baz.c, CAST("b"."a" AS REAL) d FROM foo f JOIN bar b ON f.a = b.a LEFT JOIN baz ON f.a = baz.a"""
print(transpile(sql, write="spark", identify=True, pretty=True)[0])

22、
tablib
:轻松处理表格数据集的 Python 库。该项目能够将不同格式的表格数据集,转化成统一的 Dataset 对象。它提供了动态列、标签、过滤等功能,支持 csv、df、json、yaml、xls 等格式的数据。

import tablib

data = tablib.Dataset(headers=['First Name', 'Last Name', 'Age'])

for i in [('Kenneth', 'Reitz', 22), ('Bessie', 'Monke', 21)]:
    data.append(i)

# 将数据输出成 json 格式
print(data.export('json'))
# [{"Last Name": "Reitz", "First Name": "Kenneth", "Age": 22}, {"Last Name": "Monke", "First Name": "Bessie", "Age": 21}]

# df 对象
data.export('df')
#   First Name Last Name  Age
# 0    Kenneth     Reitz   22
# 1     Bessie     Monke   21

23、
talebook
:一款简单好用的在线个人书库。该项目是基于 Calibre 的个人图书管理系统,后端是 Python 的 Tornado Web 框架,前端采用 Vue.js 构建。它不仅拥有美观的界面而且安装简单,支持在线阅读、导入书籍、推送到 Kindle、私人模式等功能。

Rust 项目

24、
sshx
:基于 Web 的安全终端协作工具。该项目只需一条命令,即可与多人共享终端。支持实时多人协作、多窗口、远程光标、在线聊天、自动重连等功能,可用于教学和远程调试。来自
@猎隼丶止戈reNo7
的分享

25、
tailspin
:一款实用的日志高亮命令行工具。该项目是 Rust 写的命令行查看日志的工具,它无需配置开箱即用,通过高亮的形式,突出显示数字、日期、IP、URL 等内容,让重要的信息一目了然。

26、
Weylus
:将平板用作计算机上的输入板/触摸屏。通过该项目可以将平板设备,作为电脑的外接屏幕、触控板、键盘,适用于 Windows、Linux 和 macOS 系统。

Swift 项目

27、
visionOS_30Days
:挑战 30 天上手苹果 visionOS 开发。visionOS 是运行在苹果的混合实境头戴式设备 Apple Vision Pro 上的操作系统,该项目提供了 30 个 visionOS 开发的示例代码。

其它

28、
dbgate
:(no)SQL 数据库桌面管理工具。该项目支持包括 MySQL、PostgreSQL、SQL Server、MongoDB、SQLite、Redis 等多种数据库,适用于 Windows、Linux、macOS 系统。

29、
Detect-It-Easy
:用于查看文件类型的工具。该项目可以快速检测二进制文件的文件类型、体系结构和编译器信息,支持识别多种文件格式,有助于进行逆向工程和安全分析,适用于 Windows、Linux、macOS 系统。

30、
github-chinese
:GitHub 网站汉化插件。该项目可以将 GitHub 网站的菜单栏、标题、按钮等公共组件,自动翻译成中文,适合刚接触 GitHub 的小白使用。来自
@wuyuncheng-26
的分享

31、
HumanSystemOptimization
:人体系统调优不完全指南。这是一份帮助改善人体健康状态的指南,篇幅较长。尽量做到保持睡眠时长与质量、不要吸烟、每天做点运动、减少糖分的摄入,就能拥有不错的健康状态。

32、
wondershaper
:Linux 限制网络带宽的工具。该项目通过使用 iproute 的 tc 命令,实现了对 Linux 网络带宽限速的功能,支持多网卡、限制最大上传/下载速率。

开源书籍

33、
Node.js-Troubleshooting-Guide
:Node.js 应用故障排查手册。该手册主要是帮助 Node.js 开发者,应对开发和线上部署中遇到的问题,比如定位故障、压测和性能调优等。

34、
pml-book
:《概率机器学习》。该项目包含凯文·墨菲的三本书籍,分别为《机器学习:概率视角》、《概率机器学习:简介》、《概率机器学习:高级》,内容涵盖了基础理论和前沿研究,图文并茂并配有示例和练习。来自
@Xuefeng Xu
的分享

机器学习

35、
backgroundremover
:一条命令自动移除图像背景。该项目通过 AI 技术,可自动移除图片和视频中的背景。

36、
machine-learning-roadmap
:机器学习路线图。这份机器学习思维导图,包含了机器学习相关的问题、学习步骤、工具、底层数学知识、教程资源等,为如何学习机器学习指出方向。

37、
PokemonRedExperiments
:通过强化学习训练 AI 玩 Pokemon。该项目使用 Python + RL 从零训练了一个玩「宝可梦红」的 AI,同时作者还提供了配套的讲解视频,以及如何在本地运行和自定义训练的教程,快来上手试试吧!来自
@老荀
的分享

38、
supervision
:计算机视觉 AI 工具库。该项目简化了对象检测、分类、标注、跟踪等计算机视觉的开发流程。开发者仅需加载数据集和模型,就能轻松实现对图像和视频进行检测、统计某区域的被检测数量等操作。

import cv2
import supervision as sv
from ultralytics import YOLO

image = cv2.imread(...)
model = YOLO('yolov8s.pt')
result = model(image)[0]
detections = sv.Detections.from_ultralytics(result)

print(len(detections))
# 5

最后

感谢参与分​享开源项目的小伙伴们,欢迎更多的开源爱好者来 HelloGitHub 自荐/推荐开源项目。如果你发现了 GitHub 上有趣的项目,就
点击这里
分享给大家伙吧!

本期有你感兴趣的开源项目吗?如果有的话就留言告诉我吧~如果还没看过瘾,可以
点击阅读
往期内容。


那么,下个月
28 号
不见不散,完结撒花

昨天发布了一篇
码农的转型之路-这款轮子可以造吗?
帖子,目的是为了介绍一下要做的事情,顺便收集一下潜在客户们的意向,总体情况不容乐观。

一、被
一个评论吓到瑟瑟发抖

1.很久没有刷技术类社区了,赶紧去科普一下,Furion的事件还在持续发酵,评论区真是差评如潮, 戏称是钉在了.Net的耻辱柱上,是耻辱柱的耻辱。

2.Furion的事件,不予评论!因为我也要收费,只是一开始就说好愿打愿挨。非常赞同下面哥们的评论,用爱发电长久不了,没钱就不能更好的投入,饥不裹腹谁能持续发电?

3.关于Tdx的事件,搜百度、头条都没有找到,后来被热群众普及了一下,这个哥们开源到倾家荡产,这代价有点hold不住!

二、关于产品定位再清晰一点,更精准一点

1.以工控系统开发为主,简化非c/s开发人员的工作,快速开发物联网采集控制相关的应用系统。

2.系统支持环境:Win7 SP1、Win8、Win10、Win11

3.第一版核心功能包含RFID读写器控制、电子秤采集重量(轨道秤、地磅秤、台秤),二次扩展开发的能力,其他需求后续再更新。

三、继续收集建议

之前以为社会人的钱不好赚,经过评论区后发现赚程序猿的钱更难啊!还是希望更多朋友们给点建议,可能最终不一定采纳:)

吐个槽也行,主要是同步一下最新行业热点!

LASSO

L
east
A
bsolute
S
hrinkage and
S
election
O
perator)回归模型一般都是用英文缩写表示,
硬要翻译的话,可翻译为
最小绝对收缩和选择算子

它是一种线性回归模型的扩展,其主要目标是解决高维数据中的特征选择和正则化问题。

1. 概述


LASSO
中,通过使用
L1正则化
项,它能够在回归系数中引入稀疏性,
也就是允许某些系数在优化过程中缩减为零,从而实现特征的选择。

与岭回归不同的是,
LASSO
的损失函数一般定义为:
\(L(w) = (y-wX)^2+\lambda\parallel w\parallel_1\)
其中
\(\lambda\parallel w\parallel_1\)
,也就是
L1正则化项
(岭回归中用的是
L2正则化项
)。

模型训练的过程就是寻找让损失函数
\(L(w)\)
最小的参数
\(w\)

也就等价于:
\(\begin{align}
& arg\ min(y-wX)^2 \\
& s.t. \sum |w_{ij}| < s
\end{align}\)

这两个公式表示,在满足约束条件
\(\sum |w_{ij}| < s\)
的情况下,计算
\((y-wX)^2\)
的最小值。

2. 创建样本数据

相比于岭回归模型,
LASSO
回归模型不仅对于共线性数据集友好,
对于高维数据的数据集,也有不错的性能表现。

它通过将不重要的特征的系数压缩为零,帮助我们选择最重要的特征,从而提高模型的预测准确性和可解释性。
下面我们模拟创建一些高维数据,创建一个特征数比样本数还多的样本数据集。

from sklearn.datasets import make_regression

X, y = make_regression(n_samples=80, n_features=100, noise=10)

这个数据集中,只有
80
个样本,每个样本却有
100
个特征,并且噪声也设置的很大(
noise=10
)。

3. 模型训练

第一步,分割
训练集

测试集

from sklearn.model_selection import train_test_split

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)


scikit-learn
中的
LASSO
模型来训练:

from sklearn.linear_model import Lasso

# 初始化LASSO线性模型
reg = Lasso()
# 训练模型
reg.fit(X_train, y_train)

这里使用的
Lasso()
的默认参数来训练模型,它的主要参数包括:

  1. alpha
    :正则化项系数。它控制了
    L1正则化
    项的强度,即对模型复杂度的惩罚。
    alpha
    越大,模型越简单,但过大的
    alpha
    可能会导致模型欠拟合;
    alpha
    越小,模型越复杂,但过小的
    alpha
    可能会导致模型过拟合。
    默认值为1.0
  2. fit_intercept
    :布尔值,指定是否需要计算
    截距b值
    。如果设为
    False
    ,则不计算
    b值

    默认值为True
  3. normalize
    :布尔值。如果设为
    True
    ,则在模型训练之前将数据归一化。
    默认值为False
  4. precompute
    :布尔值,指定是否预先计算X的平方和。如果设为True,则在每次迭代之前计算X的平方和。
    默认值为False
  5. copy_X
    :布尔值,指定是否在训练过程中复制
    X
    。如果设为
    True
    ,则在训练过程中复制
    X

    默认值为True
  6. max_iter
    :最大迭代次数。
    默认值为1000
  7. tol
    :阈值,用于判断是否达到收敛条件。
    默认值为1e-4
  8. warm_start
    :布尔值,如果设为
    True
    ,则使用前一次的解作为本次迭代的起始点。
    默认值为False
  9. positive
    :布尔值,如果设为
    True
    ,则强制系数为正。
    默认值为False
  10. selection
    :用于在每次迭代中选择系数的算法(有“
    cyclic
    ”和“
    random
    ”两种选择)。默认值为“
    cyclic
    ”,即循环选择。

最后验证模型的训练效果:

from sklearn import metrics

y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred)

print("均方误差:{}".format(mse))
print("复相关系数:{}".format(r2))
print("中位数绝对误差:{}".format(m_error))

# 运行结果
均方误差:441.07830708712186
复相关系数:0.9838880665687711
中位数绝对误差:11.643348614829785

误差看上去不小,因为这次实际生成的样本,不仅数量小(
80
件)且噪声大(
noise=10
)。

3.1. 与岭回归模型比较

单独看
LASSO
模型的训练结果,看不出其处理高维数据的优势。
同样用上面分割好的
训练集

测试集
,来看看
岭回归
模型的拟合效果。

from sklearn.linear_model import Ridge
# from sklearn.model_selection import train_test_split

mse, r2, m_error = 0.0, 0.0, 0.0

# 初始化岭回归线性模型
reg = Ridge()
# 训练模型
reg.fit(X_train, y_train)

y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred)

print("均方误差:{}".format(mse))
print("复相关系数:{}".format(r2))
print("中位数绝对误差:{}".format(m_error))

# 运行结果
均方误差:6315.046844910431
复相关系数:0.7693207470296398
中位数绝对误差:60.65140692273637

对于高维数据,可以看出,岭回归模型的误差
远远大于
LASSO模型。

3.2. 与最小二乘法模型比较

同样用上面分割好的
训练集

测试集
,再来看看
线性模型
(最小二乘法)的拟合效果。

from sklearn.linear_model import LinearRegression

mse, r2, m_error = 0.0, 0.0, 0.0

# 初始化最小二乘法线性模型
reg = LinearRegression()
# 训练模型
reg.fit(X_train, y_train)

y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred)

print("均方误差:{}".format(mse))
print("复相关系数:{}".format(r2))
print("中位数绝对误差:{}".format(m_error))

# 运行结果
均方误差:5912.442445894787
复相关系数:0.7840272859181612
中位数绝对误差:62.89225147465376

可以看出,
线性模型
的训练效果和
岭回归
模型差不多,但是都远远不如
LASSO模型

4. 总结

总的来说,
LASSO
回归模型是一种流行的线性回归扩展,具有一些显著的优势和劣势。
比如,在
特征选择
上,
LASSO
通过将某些系数压缩为零,能够有效地进行特征选择,这在高维数据集中特别有用。
此外,
LASSO
可以作为正则化工具,有助于防止过拟合。

不过,
LASSO
会假设特征是线性相关的,对于非线性关系的数据,效果可能不佳。
而且,如果数据存在复杂模式或噪声,
LASSO
可能会过度拟合这些模式。

大家好,我是独孤风,今天的元数据管理平台Datahub的系列教程,我们来聊一下Datahub CLI。也就是Datahub的客户端。

我们在安装和使用Datahub 的过程中遇到了很多问题。

  • 如何安装Datahub ?
  • 为什么总是拉取镜像?
  • 如何启动Datahub ?
  • 这些Datahub 的Docker命令都是做什么的?

有很多同学虽然搜到了答案,但是并不知道是如何解决的,下一次遇到还是一头雾水,所以今天我就带大家学习一下Datahub 的安装维护神器——Datahub CLI。

Datahub 为了用户可以更方便的操作,提供了一个名为datahub的客户端,客户端的软件包由acryldata公司维护。

Datahub CLI与Datahub的大版本保持一致。

Datahub CLI为了让大家方便的使用Datahub,提供了大量的命令。比如调动docker拉取并启动Datahub相关容器,初始化操作,拉取元数据等等。

这也就是我们在最初安装Datahub的时候,为什么需要用Datahub CLI进行一系列操作,后面才使用Datahub的原因,而在使用过程中也经常需要使用CLI对Datahub进行维护。所以学习并熟练掌握Datahub CLI还是非常有必要的。

本文就带大家学习下,Datahub CLI中最重要的Docker命令。学会本文,就再也不用担心用Docker安装Datahub的问题了。

本文档所含资料位置:“大数据流动VIP资料库” 》》“Datahub专栏资料包”,也可以在后台回复“Datahub获取”。

一、Datahub CLI的安装

由于Datahub CLI基于Python开发,所以同样发布在了pypi软件包管理中。

其地址如下:
https://pypi.org/project/acryl-datahub/

2023年12月12日的最新版本是0.12.1.0

我们也可以在这里看到历史版本情况。

并且可以直接下载下来,如果是离线环境,可以下载下来安装。

官网建议是在虚拟环境中安装,这样可以给其一个干净的环境。

python3 -m venv venv             # create the environment
source venv/bin/activate         # activate the environment

也可以直接进行安装,需要Python3.7以上的环境。

升级pip,随后安装acryl-datahub。

python3 -m pip install --upgrade pip wheel setuptools
python3 -m pip install --upgrade acryl-datahub

安装后可以验证一下

datahub version

有的时候会提示 "-bash: datahub: command not found",不要惊慌,换成这个命令就好。

python3 -m datahub version

正常会看到下面的显示。

下面我们逐一介绍下都有什么命令。

二、基本命令

上文中我们已经知道,基本的命令形式是 python -m datahub --配置 命令 参数

其中python或者python3需要能执行python3.7以上的命令。

部分版本也可以直接执行datahub --配置 命令 参数

那么我们就执行第一个命令help

python -m datahub --help

将会展示所有的配置和命令情况。

这里也说明了 --help 会展示帮助信息,并退出。

其他的配置项,有是否打印debug日志,展示版本信息等等。

命令这里只是一个整体的概述。比如我们经常用的docker命令可以操作本地的docker镜像。而想要知道命令更具体的信息,可以使用命令。

python -m datahub docker --help

这样就会显示docker的帮助信息了。下面我们就来逐一的过一遍。

三、Docker命令

docker有check,ingest-sample-data,nuke,quickstart四个命令。

配置项只有--help,也就是说上面四个命令都可以通过--help来查看更具体的信息。

quickstart命令

quickstart可以自动在本地启动datahub需要的相关镜像,首先会去github获取最新的docker-compose文件,随后根据文件拉取最新的docker镜像,启动datahub整个系统。

所以很多同学执行datahub安装时,会报错,其实就是获取compose文件报错了。

因为需要去访问raw.githubusercontent.com这个网址,没有成功。

ERROR    {datahub.entrypoints:201} - Command failed: HTTPSConnectionPool(host='raw.githubusercontent.com', port=443): Max retries exceeded with url: /datahub-project/datahub/master/docker/quickstart/docker-compose-without-neo4j-m1.quickstart.yml (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x107cba570>: Failed to establish a new connection: [Errno 61] Connection refused'))

同时,这里有一些设置,如--quickstart-compose-file,会使用本地的配置文件,这些设置会覆盖掉默认的配置去执行。

下面我们来结合实际应用来看看这些配置项。

其实通过quickstart的运行机制,同样解释了另一个现象,就是如果每次都执行quickstart,都会去拉取最新的镜像,网络不好的话会很坑。

这个问题有很多的解决方式。

建议大家搞一个稳定版本的配置文件,每次用本地文件启动即可,也可以改改版本号。这是我每次启动的命令,用我自己的配置文件。

python -m datahub docker quickstart --quickstart-compose-file ./dugufeng_yml/docker-compose-without-neo4j-dugufeng.quickstart.yml

也可以使用version命令来指定版本,可以通过这个参数来设置datahub的版本,如果没有设置,就会有配置文件的版本,可以使用'stable'来指定为最新的版本。

python -m datahub docker quickstart --version stable

--build-locally配置会尝试在
启动前
,先在本地构建容器。

python -m datahub docker quickstart --build-locally

--pull-images / --no-pull-images配置会尝试在
启动前
,是否去Docker Hub拉取镜像。

python -m datahub docker quickstart --no-pull-images

还有--dump-logs-on-failure用于打印失败日志,--graph-service-impl用于指定graph服务的实现。

下面这几个比较常用。如果本地已经有其他服务占用了端口会报端口占用错误Port 3306 was already in use。这时候我们可以灵活的指定一下其他的端口。

python -m datahub docker quickstart --mysql-port 3306 --zk-port 2181  --kafka-broker-port 9092 --schema-registry-port 8081 --elastic-port 9092

大家可以选择下面的命令来停止datahub。

python -m datahub docker quickstart --stop 

正常停止后的显示。

可以对当前数据进行备份。

python -m datahub docker quickstart --backup

默认会备份镜像到
~/.datahub/quickstart/
,也可以选择自己指定一个位置。

python -m datahub docker quickstart --backup --backup-file <path to backup file>

恢复配置,可以选择只恢复索引数据,还是核心数据。

python -m datahub docker quickstart --restore
python -m datahub docker quickstart --restore-indices
python -m datahub docker quickstart --restore --no-restore-indices

同样也可以指定恢复的sql文件。

python -m datahub docker quickstart --restore --restore-file /home/my_user/datahub_backups/quickstart_backup.sql

还有一个配置 --standalone_consumers用于将 MAE & MCE作为单独的docker容器。

--kafka-setup加载 Kafka setup,--arch TEXT 指定要使用的CPU架构参数,有x86, arm64,m1。

nuke命令

可以使用nuke命令,可以清除所有Datahub的状态。(相当于恢复出厂了,慎用)

 python -m datahub docker nuke

nuke只有两个选项,--help可以查询帮助。

--keep-data用户删除数据。

check命令

check命令用于检查docker容器状态是否健康。

这是正常的显示状态。

check命令处理--help查看帮助,没有其他的配置项。

ingest-sample-data命令

ingest-sample-data命令用于导入示例的元数据文件。

我们刚进入Datahub的时候会报一个错误,No Metadata Found。其实就是没有元数据。

我们这时候可以执行命令,来导入下示例数据看看。

python -m datahub docker ingest-sample-data

导入成功的显示。

再进入,数据已经有了。

除了--help,还有两个。

--parh可以指定一下本地的文件,将文件导入。

具体文件格式可以参考,MCE示例文件。

--token命令,用于datahub启动权限管理的时候METADATA_SERVICE_AUTH_ENABLED=true

需要指定token。

四、Docker基本操作

除了datahub的docker操作,有的时候也需要我们直接使用docker命令去排查一些问题。

下面是常用的命令。

使用以下命令列出当前正在运行的容器:

docker ps

这将显示所有正在运行的容器的列表,包括容器ID、名称、状态等信息。

找到要停止的容器的容器ID或名称。

使用以下命令停止容器,其中是容器的ID或名称:

docker stop

例如,如果要停止容器ID为dugufeng666的容器,可以运行以下命令:

docker stop dugufeng666

这将向容器发送停止信号,并使容器停止运行。

等待一段时间,直到容器完全停止。可以使用以下命令来验证容器的状态:

docker ps -a

这将显示所有容器的列表,包括已停止的容器。确保目标容器的状态显示为"Exited"。

停止所有容器

docker stop $(docker ps -a -q)

其他的命令我们下一期继续聊~

未完待续~

Datahub功能演示请参考大数据流动视频号

Kernel Memory 入门系列:自定义处理流程

在整个文档预处理的流程中,涉及到很多的处理步骤,例如:文本提取,文本分片,向量化和存储。这些步骤是Kernel Memory中的默认提供的处理方法,如果有一些其他的需求,也可以进行过程的自定义。

自定义Handler

在Kernel Memory中,可以通过自定义Handler的方式来实现自定义的处理流程。自定义Handler需要实现
IPipelineStepHandler
接口,该接口定义如下:

public interface IPipelineStepHandler
{
    string StepName { get; }

    Task<(bool success, DataPipeline updatedPipeline)> InvokeAsync(DataPipeline pipeline, CancellationToken cancellationToken = default);
}

其中,
StepName
是自定义Handler的名称,用于在Pipeline中指定该步骤,
InvokeAsync
方法是自定义Handler的执行方法。在
InvokeAsync
方法中,可以对
DataPipeline
中的数据进行修改,从而实现自定义的处理。

主要的实现逻辑在
InvokeAsync
方法中,其中
DataPipeline
是主要的数据结构,它包含了整个文档处理的流程中的所有数据。

如果想要得到当前处理流程中的文件,可以通过
DataPipeline.Files
属性获取。

public async Task<(bool success, DataPipeline updatedPipeline)> InvokeAsync(DataPipeline pipeline, CancellationToken cancellationToken = default)
{
    foreach (DataPipeline.FileDetails file in pipeline.Files)
    {
        Console.WriteLine(file.Name);
    }

    return (true, pipeline);
}

实现的过程中建议为Handler注入
IPipelineOrchestrator
, 通过
IPipelineOrchestrator
可以获取到当前的Memory的大部分基础组件和文件管理的方法。

例如,如果想获取文件的内容,就可以
IPipelineOrchestrator.ReadTextFileAsync
方法:

IPipelineOrchestrator orchestrator;
var fileContent = await orchestrator.ReadTextFileAsync(pipeline, file.Name, cancellationToken);

如果想要存储生成的文件内容,就可以使用
IPipelineOrchestrator.WriteTextFileAsync
方法:

IPipelineOrchestrator orchestrator;
await orchestrator.WriteTextFileAsync(pipeline, file.Name, fileContent, cancellationToken);

除了文本内容,还可以通过
IPipelineOrchestrator.ReadFileAsync

IPipelineOrchestrator.WriteFileAsync
方法来读取和存储二进制文件。

除此之外,还可以通过
IPipelineOrchestrator
获取
TextGenerator

EmbeddingGenerators

MemoryDbs
等基础组件,搭配使用实现更多丰富的流程。

例如使用
TextGenerator
文本生成服务,可以构建自己的提示词方法,为当前的文档生成摘要、提炼关键词等。

生成的文本,首先通过
IPipelineOrchestrator.WriteFileAsync
进行内容的存储, 然后将文件信息存放到
file.GeneratedFiles
中,这样就可以在后续的处理流程中使用了。

var generatedFile = ...;
await orchestrator.WriteFileAsync(pipeline, generatedFile.Name, generatedFile.Content, cancellationToken);
file.GeneratedFiles.Add(new DataPipeline.GeneratedFileDetails
                {
                    Id = Guid.NewGuid().ToString("N"),
                    ParentId = file.Id,
                    Name = generatedFile.Name,
                    Size = generatedFile.Length,
                    MimeType = generatedFile.Type,
                    ArtifactType = DataPipeline.ArtifactTypes.SyntheticData,
                    Tags = pipeline.Tags,
                });

另外,其中的File本身存在一组方法,可以用来判断该文件是否已经被当前流程处理过了,以避免重复处理:

 file.MarkProcessedBy(this); // 标记当前文件已经被当前Handler处理过了
 file.AlreadyProcessedBy(this); // 判断当前文件是否已经被当前Handler处理过了

注册Handler

完成Handler逻辑的编写后,就可以将Handler注册到Memory中进行使用了。
在构建Memory后,通过AddHandler方法即可完成注册:

var memory = new KernelMemoryBuilder()
    // ...
    .Build<MemoryServerless>();

memory.AddHandler(new MyHandler(memory.Orchestrator));

另外也可以在 MemoryBuilder 阶段,针对Orchestrator进行Handler的注册:

var memoryBuilder = new KernelMemoryBuilder();
var orchestrator = memoryBuilder.GetOrchestrator();

var myHandler = new MyHandler(orchestrator);
await orchestrator.AddHandlerAsync(myHandler);

自定义处理流程

注册完成Handler后,就可以在自定义的Pipeline中使用了。

一种方式是在
memory.ImportDocumentAsync
的时候,指定 Steps:

await memory.ImportDocumentAsync("sample-Wikipedia-Moon.txt", steps: new[] { "my_step" });

另一种是围绕着
Orchestrator
进行Pipeline的构建:

var pipeline = orchestrator
    .PrepareNewDocumentUpload(index: "tests", documentId: "inProcessTest", new TagCollection { { "testName", "example3" } })
    .AddUploadFile("file1", "file1-Wikipedia-Carbon.txt", "file1-Wikipedia-Carbon.txt")
    .AddUploadFile("file2", "file2-Wikipedia-Moon.txt", "file2-Wikipedia-Moon.txt")
    .Then("extract")
    .Then("partition")
    .Then("summarize")
    .Then("gen_embeddings")
    .Then("save_records")
    .Build();

await orchestrator.RunPipelineAsync(pipeline, cancellationToken);

以上就完成了自定义流程的实现。

参考