0%


引言

在当今信息爆炸的时代,随着自然语言处理技术的不断发展,大规模语言模型已经成为了各个领域的核心工具。然而,由于计算成本的限制,这些模型在实际应用中仍存在一些挑战。为了解决这一问题,RAG工程应运而生,它将大规模语言模型与外部知识源相结合,为各种应用场景提供了更高效、准确的解决方案。本文将深入探讨RAG工程的原理、应用场景以及发展前景。

RAG工程的应用场景

RAG工程具有广泛的应用场景,其中最常见的是问答系统。通过将用户问题与知识库进行匹配和检索,RAG工程能够快速找到相关答案,并利用语言模型生成自然、流畅的回复。此外,RAG工程还可以应用于知识推理和文本生成等领域,例如在教育、医疗、金融等行业,为用户提供准确、高效的信息服务。

RAG检索的原理

RAG检索是RAG工程中的核心环节,它通过一系列步骤将用户问题与知识库中的内容进行匹配和筛选。具体来说,RAG检索包括理解问题、检索匹配、筛选排序和生成提示等步骤。首先,需要对用户问题进行语义理解和分析,以确定问题的主题和关键信息。然后,在知识库中进行相关内容的匹配和筛选,确保所选择的内容与问题高度相关。接下来,对检索到的内容进行筛选和排序,以排除不相关或低质量的文本。最后,基于筛选排序后的内容,生成提示给大规模语言模型,指导其生成高质量的回答。

  • 使用余弦相似度算法计算文本相似度

RAG中检索和生成的结合

在RAG工程中,检索和生成是相互关联、相互影响的两个过程。检索过程为生成过程提供了相关的信息和提示,而生成过程则将检索结果转化为最终的回答形式。通过将两者相结合,可以充分发挥大规模语言模型的优势,同时降低计算成本和提高问答系统的准确率。在实际应用中,可以根据问题的类型和复杂程度,灵活地调整检索和生成的过程,以获得最佳的效果。

RAG工程的发展前景

随着自然语言处理技术的不断发展和大规模语言模型的广泛应用,RAG工程在未来具有广阔的发展前景。首先,随着技术的不断进步和应用需求的增加,RAG工程将在更多的领域得到应用。例如,在智能客服、教育、医疗等领域,RAG工程可以帮助提高问答系统的准确率和效率。此外,随着深度学习技术的不断发展,RAG工程中的检索和生成算法将不断优化和完善。例如,可以利用预训练语言模型提高生成的流畅性和自然度,同时利用先进的深度学习技术提高检索的准确性和效率。

结语

RAG工程是一种将大规模语言模型与外部知识源相结合的方法,为各种应用场景提供了更高效、准确的解决方案。随着技术的不断进步和应用需求的增加,RAG工程将在未来的发展中发挥越来越重要的作用。

学习资料

  • RAG论文原文
  • RAG架构指南
    learn
    learn2


引言

在过去的几个季度里,大语言模型(LLM)的平民化运动一直在快速发展,从最初的 Meta 发布 Llama 2 到如今,开源社区以不可阻挡之势适配、进化、落地。LLM已经从昂贵的GPU运行转变为可以在大多数消费级计算机上运行推理的应用,通称为本地大模型。

然而,本地大模型的推理需要相当大的显存,对于16位浮点精度(FP16)的模型,显存需求约为模型参数量的两倍。这使得运行大模型成为对普通家用计算机硬件规格的挑战。为了解决这个问题,模型量化技术应运而生,将权重参数的精度压缩为4位整数精度,大幅减小了显存需求。

在这一背景下,llama.cpp项目通过C/C++重写了推理代码,避免了PyTorch引入的复杂依赖,并提供了更广泛的硬件支持,包括纯CPU推理、Apple Silicon等。然而,llama.cpp的使用仍然对用户有一定的门槛,需要获取模型权重、克隆项目代码、执行模型量化、设置环境变量等。

直到Ollama的出现,一个简明易用的本地大模型运行框架,为用户提供了更便捷的方式在个人电脑上运行大模型。

快速上手

Ollama的安装非常简单,macOS用户只需在官网下载安装包并运行,而Windows用户则可以通过WSL 2以Linux方式用命令进行安装。同时,熟悉Docker的用户也可以直接使用其官方镜像。

1
2
% curl https://ollama.ai/install.sh | sh

安装完成后,通过运行 ollama –version 命令检查版本,确认安装成功后即可通过 ollama pull 命令从在线模型库下载模型。例如,下载中文微调过的Llama2-Chinese 7B模型的4-bit量化版本:

1
% ollama pull llama2-chinese

下载完成后,使用 ollama run 命令即可运行模型并进行推理,支持单条输入或对话模式。

1
2
3
# 单条输入
% ollama run llama2-chinese "天空为什么是蓝色的?"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 对话模式
% ollama run llama2-chinese
>>> /?
Available Commands:
/set Set session variables
/show Show model information
/bye Exit
/?, /help Help for a command

Use """ to begin a multi-line message.

>>> 天空为什么是蓝色的?

这个问题是一个常见的争议。有一些科学家认为天空的蓝色可以被解释为雾和云层中的微小碎片反射出来的光色,而其他人则认为这是由于地球自身温度的影响。目前还没这个问题是一个常见的争议。有一些科学家认为天空的蓝色可以被解释为雾和云层中的微小碎片反射出来的光色,而其他人则认为这是由于地球自身温度的影响。目前还没有一个公认的解释。

套壳玩法

尽管Ollama为用户带来了便利,但命令行形式仍然对一些用户来说不够友好。为此,Ollama提供了一系列周边工具,包括Web界面、桌面应用、终端工具等。其中,Ollama GUI的选择多样,包括Web版本、终端TUI版本(oterm)以及Raycast插件等,以满足用户不同的使用偏好。
传送门

进阶玩法

更换模型

Ollama支持用户自定义系统提示词和调整推理温度等参数。用户可以根据自己的需求选择不同版本的模型,如13B版本,只需在命令中添加对应标签:

1
2
3
4
5
6
7
8
9
10
11
% ollama run llama2-chinese:13b "天空为什么是蓝色的?"

天空是由大气层和太阳光的散射而成的蓝色。

在日出之前,我们看到的天空是紫色或彩虹色,这是因为太阳光从海平面反射回来时,会被大气中的二氧化碳和水分子散射成蓝色、紫色或彩虹色。

而在日出之后,天空变成了灰色,这是由于太阳光从大气中被阻挡,并且不再有足够的反射来给天空增加蓝色。

当我们看到天空时,它的颜色是由于太阳光与大气中的物质相互作用而形成的。这些物质包括水、二氧化碳和其他气体,以及微小的冰片和沙塵。

当我们看到天空变成了晚上时,天空会逐渐变得更加深蓝,这是由于太阳光在大气中传播,同时也因为大气层的结构。

图片支持

除了纯语言大模型,Ollama还从0.1.15版本开始提供了对视觉模型的支持。用户只需在提示中添加本地图片路径即可进行图像文本推理。

1
2
3
4
5
% ollama run llava
>>> What does the text in this image say? /Users/mchiang/Downloads/image.png
Added image '/Users/mchiang/Downloads/image.png'

The text in this image says "The Ollamas."

自定义系统提示词

Ollama允许用户自定义系统提示词,提高模型的个性化。用户可以通过前端工具或直接调用API传入系统提示词选项进行配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
curl http://localhost:11434/api/chat -d '{
"model": "llama2-chinese:13b",
"messages": [
{
"role": "system",
"content": "以海盗的口吻简单作答。"
},
{
"role": "user",
"content": "天空为什么是蓝色的?"
}
],
"stream": false
}'

更多选项

Ollama的ModelFile提供了更多自定义的空间,包括系统提示词、对话模板、模型推理温度、上下文窗口长度等参数均可自行设置,适合进阶使用者。

在创建前,通过 show --modelfile 命令可以查看现有模型的 ModelFile 内容,作为参考:

1
2
3
4
5
6
7
8
9
10
11
12
% ollama show --modelfile llama2-chinese:13b
# Modelfile generated by "ollama show"
# To build a new Modelfile based on this one, replace the FROM line with:
# FROM llama2-chinese:13b

FROM ~/.ollama/models/blobs/sha256:8359bebea988186aa6a947d55d67941fede5044d02e0ab2078f5cc0dcf357831
TEMPLATE """{{ .System }}
Name: {{ .Prompt }}
Assistant:
"""
PARAMETER stop "Name:"
PARAMETER stop "Assistant:"

以自定义系统提示词并修改推理温度参数为例,应构建如下格式的 ModelFile:

1
2
3
4
FROM llama2-chinese:13b

SYSTEM "以海盗的口吻作答。"
PARAMETER temperature 0.1

然后使用 create 命令进行创建,新的模型会沿用原有模型的权重文件和未作调整的选项参数:

1
ollama create llama2-chinese-pirate -f ~/path/to/ModelFile

从而得到了属于自己的本地模型。

结语

Ollama的出现使得本地大模型的运行变得更加简单快捷。尽管相较于普通应用软件,Ollama的使用体验可能仍有提升空间,但与数月前相比,其进步巨大。称Ollama为AI技术平民化的贡献并不为过,它为更多人以最简单快速的方式在本地运行大模型提供了可能。


RT。

项目需求中实现的一个css3样式写的语音录入效果。

wave

wave2

1
2
3
4
5
6
7
8
9
10
11
<view class="animation start">
<view
class="item"
v-for="(w, idx) in waveStart"
:class="'waveStart-' + w"
:key="idx"
></view>
<view class="item" v-for="(w, idx) in waveList" :class="'wave-' + w" :key="idx"></view>
<view class="item" v-for="(w, idx) in waveEnd" :class="'waveStart-' + w" :key="idx"></view>
</view>

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
// 时间
$frameTime: 0.5s;
.animation {
flex: 3;
display: flex;
gap: 10rpx;
align-items: center;
&.start {
.item {
animation-iteration-count: infinite;
animation-direction: alternate;
}
}
.item {
width: 8rpx;
background-color: rgba(58, 155, 255, 1);
transform: scale(0.6);
}
.waveStart-1 {
height: 20rpx;
animation: radius-start $frameTime ease;
}
.waveStart-2 {
height: 36rpx;
animation: radius-start $frameTime ease;
}
.waveStart-3 {
height: 52rpx;
animation: radius-start $frameTime ease;
}
.waveStart-4 {
height: 70rpx;
animation: radius-start $frameTime ease;
}

.wave-1 {
height: 8rpx;
animation: radius-animation-1 $frameTime ease;
}
.wave-2 {
height: 20rpx;
animation: radius-animation-2 $frameTime ease;
}
.wave-3 {
height: 36rpx;
animation: radius-animation-3 $frameTime ease;
}
.wave-4 {
height: 52rpx;
animation: radius-animation-4 $frameTime ease;
}
.wave-5 {
height: 70rpx;
animation: radius-animation-5 $frameTime ease;
}
}

@keyframes radius-start {
100% {
height: 8rpx;
}
}

@keyframes radius-animation-1 {
100% {
height: 90rpx;
}
}

@keyframes radius-animation-2 {
80% {
height: 80rpx;
}
100% {
height: 70rpx;
}
}
@keyframes radius-animation-3 {
60% {
height: 80rpx;
}
100% {
height: 52rpx;
}
}
@keyframes radius-animation-4 {
40% {
height: 80rpx;
}
100% {
height: 36rpx;
}
}
@keyframes radius-animation-5 {
20% {
height: 80rpx;
}
100% {
height: 20rpx;
}
}

Vue技术栈&配置

  • eslint + prettier + stylelint + husky
  • 步骤:
    • copy package.json===> devDependencies。完成安装后,陆续补充配置文件👇
    • 文件统一格式: LF

.eslintrc.js

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

const typescriptEslintRecommended = require('@typescript-eslint/eslint-plugin').configs.recommended;

module.exports = {
root: true,
'env': {
'browser': true,
'es2021': true,
'node': true,
'commonjs': true,
},
'extends': [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:prettier/recommended',
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
],
'overrides': [
{
files: ['./**/*.ts'],
parser: '@typescript-eslint/parser',
parserOptions: {
sourceType: 'script',
project: './tsconfig.json',
},
plugins: [ '@typescript-eslint' ],
rules: Object.assign(typescriptEslintRecommended.rules, {
// other customize rules
// @Todo: 暂时设置成warn的rule,后续要设置成error
'@typescript-eslint/no-unused-vars': 'warn',
'@typescript-eslint/no-var-requires': 'warn',
'@typescript-eslint/no-this-alias': ['warn'],
'@typescript-eslint/ban-ts-comment': 'warn',
'@typescript-eslint/no-explicit-any': 'warn'
})
},
{
'env': {
'node': true
},
'files': [
'.eslintrc.{js,cjs}'
],
'parserOptions': {
'sourceType': 'script',
}
}
],
"parser": "vue-eslint-parser",
'parserOptions': {
'ecmaVersion': 'latest',
'sourceType': 'module',
},
'plugins': [
// 'html',
'vue',
"@typescript-eslint"
],
'rules': {
// 'indent': ['error', 'tab'],
// 'linebreak-style': ['error', 'window'],
// 'semi': ['error', 'always'],
'no-underscore-dangle': 'off',
// 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
// 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-unused-vars': 'warn',
'vue/component-name-in-template-casing': ['warn', 'kebab-case'],
'vue/multi-word-component-names': 'off',
'prefer-destructuring': 'off',
'no-plusplus': 'off',
'vue/no-v-text-v-html-on-component': 'warn',
'vue/no-deprecated-slot-attribute': 'warn',
'vue/no-deprecated-v-on-native-modifier': 'warn'
},
globals: {
uni: 'readonly',
plus: 'readonly',
getCurrentPages: 'readonly',
getApp: 'readonly',
this: 'readonly',
wx: 'readonly',
uniCloud: 'readonly'
},
ignorePatterns: ['./pages.json', 'uni_modules', 'unpackage'],
};

.eslintignore

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
uni_modules/
node_modules/
dist/*
unpackage/
uni-*
.*.js
*.log
*.min.js
libs/
vue.config.js

# /node_modules/* in the project root is ignored by default
/node_modules/*

# build artefacts
dist/*
build/*
coverage/*

# data definition files
**/*.d.ts

# 3rd party libs
/src/public/

# custom definition files
/src/types/

apis/

.gitattributes

1
2
3
# Automatically normalize line endings (to LF) for all text-based files.
* text=auto eol=lf

.prettierrc.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

module.exports = {
tabWidth: 4,
useTabs: true,
endOfLine: 'LF',
singleQuote: true,
// 行位是否使用分号,默认为true
semi: false,
trailingComma: 'es5',
// 超过120字符,换行;解决html标签属性换行问题
printWidth: 120,
bracketSpacing: true,
bracketSameLine: false,
eslintIntegration: true,
htmlWhitespaceSensitivity: 'ignore',
}

.prettierignore

1
2
3
4
5
6
7
8
9
10
11
12
# Ignore artifacts:
build
dist
coverage

# Ignore all HTML files:
*.html

.gitignore
.prettierignore
uni_modules

tsconfig.json

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
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"strict": true,
"jsx": "preserve",
"moduleResolution": "node",
"esModuleInterop": true,
"sourceMap": true,
"skipLibCheck": true,
"importHelpers": true,
"allowSyntheticDefaultImports": true,
"useDefineForClassFields": true,
"resolveJsonModule": true,
"lib": [
"esnext",
"dom"
],
"types": [
"@dcloudio/types"
]
},
"exclude": [
"node_modules",
"unpackage",
"src/**/*.nvue"
]
}

husky

安装

1
2
3
npx husky install
npx husky add .husky/pre-commit 'npm run lint';

生成的文件内容如下:

1
2
3
4
5
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run lint

lint-staged.config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module.exports = {
'*.{js,jsx,ts,tsx,vue}': ['eslint --fix', 'prettier --write'],
'{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': [
'prettier --write--parser json',
],
// for vue web proj
'src/**/*.{js,jsx,ts,tsx,vue}': ['eslint --fix', 'prettier --write'],
// '*.vue': ['prettier --write', 'stylelint --fix --allow-empty-input'],
// '*.{scss,less,styl,css,html}': [
// 'stylelint --fix --allow-empty-input',
// 'prettier --write',
// ],
// 'package.json': ['prettier --write'],
// '*.md': ['prettier --write'],
}

devDependencies

1
2
3
4
5
6
7
8
9
10
11
12
13
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^6.5",
"@typescript-eslint/parser": "^6.5",
"eslint": "^8.47.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-prettier": "^5.0.0",
"eslint-plugin-vue": "^9.17.0",
"husky": "^8.0.3",
"lint-staged": "^14.0.1",
"prettier": "^3.0.2",
"typescript": "^5.2"
}

package.json

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

{
"scripts": {
"lint": "lint-staged",
"prettier": "prettier --write ./**/*.{js,json,vue}"
},
"husky": {
"hooks": {
"pre-commit": "echo start lint --fix"
}
},
"dependencies": {
"vue-inset-loader": "^1.2.6"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^6.5",
"@typescript-eslint/parser": "^6.5",
"eslint": "^8.47.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-prettier": "^5.0.0",
"eslint-plugin-vue": "^9.17.0",
"husky": "^8.0.3",
"lint-staged": "^14.0.1",
"prettier": "^3.0.2",
"typescript": "^5.2"
}
}

ignore忽略配置

1
2
3
4
5
6
忽略文件
/* eslint-disable */

忽略某一行 & 某一个规则
/* eslint eqeqeq: "off", curly: "error" */

React技术栈&配置

待续

先引用一句名言:人用制度管,事用流程管

我理解,团队管理分三个维度:

  1. 对上管理
  2. 协作管理
  3. 对下管理

管什么?最主要管的是预期

  1. 老板的预期
  2. 协作方的预期
  3. 组员的预期

以及 我对这三个维度的预期。

先贴个总结
团队管理的几点沉淀
  1. 建立机制,反馈,奖惩,底线(态度),优先级
  2. 团队建设,人才梯度,技术结构,backup
  3. 团队文化,技术氛围、基调
  4. 业务导向,业务结果,规划
  5. 预期管理:对上管理(老板的预期),平行管理(对组员的预期,及组员的预期)
我的预期
  1. 如何教 别人 管理;团队的流程化,职业化?工作流?
  2. 有安全感,归属感,危机感,目标感,非安逸感

关于团队成长

团队的成长离不开组员的成长。一般会基于三个方向来培养组员,帮助成长

  1. backup能力:管理 + 业务
  2. 技术能力:技术栈深度/广度 + 架构设计
  3. 影响力:技术驱动 + 上层思维

从终局思维粗发,如何解读预期管理?

  • 接上面的观点:预期
  • 老板的预期哪里来👉大老板的预期
  • 大老板的预期是什么?当然是公司的营收,业务发展,好早日换车🚗换房🏡换…

所以,包括KPI、OKR什么的,最终目的是帮助老板完成大老板的预期

于是,各业务部门的战术规划,始终都要指向公司的战略目标!

  • 举个例子🌰
  1. 大老板:我们要完成GMV增长50%,利润增长30%
  2. 分析GMV成分:
  • 用户增长
  • 复购、客单
  • 成本控制
  • 新业务拓展
  1. 技术角度要做的事情
  • 技术创新、驱动–>业务效率
  • 组织架构、资源协同
  • 开发效能、稳定性、运维成本
  • 用户体验

那么分到各技术组的目标,就很明确了。

以业务为核心

不管是项目、管理、成长,核心都要基于业务出发,去考虑、规划、组织及架构。

必须要基于业务做的事情,业务导向

  • 组织架构
  • 团队/组员成长
  • 系统设计/架构
  • 基础建设

从业务粗发,如何来做团队管理?

RT。

为什么要总结? 理清思路,整体沉淀。给未来的自己一面镜子,持续地学习、沉淀,构成一个正向成长的飞轮模型✈️。

  1. 在一个电商技术团队中,前端对自己的定位📌
  • 横向支撑
    • 效率
  • 业务导向
    • 沟通
  • 技术驱动
    • 创新

三边关系

  1. 前端团队如何持续成长
  • 搭建团队的成长模型

金字塔成长模型

RT。

大环境不景气,为了生活,必须好好学习了 📚📖

一天一道算法题

1.【链表中倒数第k个节点】两个指针, a=0, b=k,一起向前移动,当k取值=null时,a=n-k。

  • 【 二叉搜索树中第K小的元素】中序遍历,k–
  • 【数组中的第K个最大元素】快速排序,不需要排序,只需要比较。

2.【全排列】递归(DFS), 依次取数组元素,除去当前元素再分别递归取数组元素(两for循环 + 递归)

3.【反转链表】一次循环{prev=null,cur=0, next=temp},当next = null时,结束while循环

4.【二叉树的层序遍历】广度优先BFS:while 同级遍历(队列shift) & 收集下一层节点(push)

5.【螺旋矩阵】巧技:削苹果。削掉最外面一层(shift数组及其余数组pop),翻转整个数组180度([].reverse),再削。

6.【复原IP地址】分割字符串, 递归(dfs), 检查每一段是否合法0~255

7.【岛屿数量】每遇到陆地格子=1, 则DFS搜索,标记已搜索过的格子(标记为2)。

8.【N叉树的层序遍历】BFS广度优先遍历root–>nextRoot[]–>nextRoot[]

9.【翻转二叉树】前、后序DFS深度遍历 or BFS广度优先遍历,不能用中序(会翻转两次)

10.【最长回文子串】https://writings.sh/post/algorithm-longest-palindromic-substring

11.【最长不含重复字符的子字符串】动态规划+ hashMap

12.【二叉树的最近公共祖先】思路1:DFS(二叉遍历)算出路径,然后对比两个路径的分叉点;

  • 思路2:两个值都在左边,则最近root在左边;一左一右,则当前root就是最近公共祖先。

13.【旋转图像】两个for,置换 matrix[j][n - 1- i] = matrix[i][j]

14.【无重复字符的最长子串】滑块->map标识字符位置,max标识当前最大位置

15.【合并两个有序数组】双指针,依次比较放入到一个新数组

16.【求根到叶子节点数字之和】dfs算法,标记已访问过的子节点(左or右)

17.【路径总和】dfs算法,标记已访问过的子节点(左or右)

18.【最大子序和】 单循环下,curSum < 0则舍弃&重新累加,curSum>maxSum && maxSum = curSum

19.【两数之和】建一个map,放入index和value,顺便比对下已放入的是否可以配对

  • 【三数之和】2.双指针法:排序数组 & 选定[a,b,c] = [i,i+1,len-1],target=-num[i]

20.【数组中的第K个最大元素】快排法(选择一个基准p,小于p移到左边,大于p移到右边),从i=0指针移动,如果当前指针 i=k,则return

21.【长度最小的子数组】 滑块->map标识字符位置

22.【字符串相加】转数组&反序reverse,满10进1

23.【二叉树的最大深度】前序遍历
24.【LRU算法】new Map(),map是一个散列队列,set总是到队列最后一个


一些资料

  • 字节算法面试题:github.com/afatcoder/LeetcodeTop/blob/master/bytedance/frontend.md
  • leetcode Top: github.com/afatcoder/LeetcodeTop
  • 看完这篇,你会理解图和树的遍历: https://zhuanlan.zhihu.com/p/98406357
  • 二叉树遍历: github.com/liusaint/ls-blog/issues/25

待续

2023-10-11

  • 记录一些必须要关注的选股指标

    • 量能,交易量,换手率
    • 市场主线,热度,参与度
    • MACD线
    • 近七日成交量趋势
    • 均线走势
    • 【重要】资金流向:结合均线、MACD线及量能、交易量,评估对当前大资金vs散户的占比,判断未来股价走势
      • 大单、中单资金,也有可能是割肉🥩单
      • 小单大部分都是散户单,中单也可能是散户单
    • 筹码分布
  • 重点强调纪律 + 心态


炒股的经验教训沉淀,主要是为了警醒自己Σ(⊙▽⊙”a

  • 设定预期及固定时间点

    • 单支股票的预期上限价格,及计划卖出时间点
    • 单支股票的预期下限价格,及计划卖出时间点
    • 保持个股的资产总额,及持仓占比
  • 重点!!!每只股票,都需要设置自己的预期上限和下限

!切记!

  • 机会每天都有,不必博反弹,不必抄底。
  • 预期 不是 欲望,务必井然有序,执行力要强。

失败案例📚(单支亏损>10w)

  • 同花顺
  • 贝特瑞
  • 易华录(22年新增😔)

基金挑选标准⭐️

  • 基金经理从业6年以上、从业年化收益20%以上、在管规模300亿以下(兴全破例);产品3年夏普比率1.5以上。
    🐔基金推进

待续

为什么要读这本书?

从业十余载,其中从事技术管理工作已有4+年,佛系股龄5+年 👉👉 新韭菜变老韭菜。

期间不乏遇到一些问题,且知识面&认知无法解决。

诸如团队主动性如何调动?奖惩、激励等

又如大盘风向、趋势,及未来规划等

想得越多,盲区越大。

于是,需要慢慢沉淀下来,用时间来消化。

恰巧,看群里推了这本神作,买来看看。

第一章对组织事权的讲解,很多点消化掉,便能用来实践🤔

对事权的理解

  • 事权划分三原则:
    • 规模经济(公共服务的覆盖范围 效益)
    • 信息复杂性(下级的信息优势),
    • 激励相容(有效机制来激励下级完成上级的目标)

  • 关于 房住不炒 的理解
    • RT。 首先要清楚,房价为什么会这么高?它是地区经济发展某一阶段的必然产物.
      1. 土地在城市化快速推进的过程中起到的杠杆作用
      • 地方政府将土地作为资本注入融资平台(城投、产业引导基金等LP),撬动为城市建设服务的资金杠杆
      • “注入土地-土地抵押-城市建设-土地升值-土地出让-还债”的模式成为地方政府通过融资平台举债融资、基建投资的最基本运营模式。导致政府显性、隐形 债务巨大。
      1. 产业基建快速发展,大量人口涌入;但忽略民生建设,居民收入水平提升有限
      2. 不动产持续增值,吸引大量投资客入场;不动产货币化、以土地为信用锚的现象
    • 所以,为什么我国前些年GDP一直在高速增长。驱动GDP增长的主要因素(三家马车)
      • 消费->内销、居民可支配收入->旅游为GDP贡献巨大,占10%+
      • 外贸->出口、跨境->2021年上半年外贸为主要的GDP贡献来源,占30%+
      • 房地产->城市化快速推进的产物,完全(直接&间接)贡献约17%的GDP
        • 说明:欧美房地产的GDP贡献,包括租金和税收,二手房交易及贷款的贡献占比很小。
    • 从另一个角度看,我们的房地产产业结构属于粗放型,需要一系列改革,实现集约型增长。
      • 服务于民生,有利于内循环
      • 降杠杆,解耦地方债务;符合城市多元化、都市圈发展方向
    • 那么,如何改善产业结构👉房住不炒。我理解,这是未来我国五到十年的政策核心,使得GDP结构朝着可持续的集约型经济增长
      1. 改善居民可支配收入,民生服务
      2. 改善外贸的工厂模式,产能过剩问题
      3. 优化房地产产业结构
    • 那么,目前可预见的,如何改善房地产产业结构?我理解
      1. 房市从卖方市场全面转向买方市场
      2. 卖方有两个方向
      • 投向租赁市场
      • 套现离场
      • 交税,贡献GDP(目前,除了房屋买卖,持有不动产是不交税的,不贡献GDP)
    • 所以,房产税势在必行,且肯定是针对卖方。
    • 那么房地产以后就不会继续增值了么?要看具体区域
      • 二三线城市,配套不成熟,or 没有配套升级规划的
      • 一线都市圈核心城市,且是核心区域的房市,理论上是有升值空间的。
    • 但整体上,房价不会涨,至少涨不过居民收入,通货膨胀,弱化投资理财属性。
      • 也不会跌,至少不会大跌,出现恐慌性抛盘,因为房价与民生及地方经济的稳定息息相关
    • 关于地域间的发展不平衡
      • 一般,房价涨幅应该与当地人均GDP相匹配。比如加州的人口占米国约12%,相应的GDP也占了12%
      • 反观我们,内地人口大省如河南,人口超东部沿海省市,但GDP远低于东部,导致人均GDP偏低
      • 所以,规划发展都市圈及户籍改革,有助于改善地域间发展不平衡的现状,让低收入者进入高收入城市,发展第三产业;且第三产业的发展,也有利于招商引资&人才引进,发展优化土地配置,提高利用率,使得房价与人均GDP相匹配

待续

hexo操作

  • 安装hexo:
    • npm install -g hexo-cli
    • hexo init myBlog
    • 生成文件目录
    1
    2
    3
    4
    5
    6
    7
    8
      .
    ├── _config.yml # 网站的配置信息,您可以在此配置大部分的参数。
    ├── package.json
    ├── scaffolds # 模版文件夹
    ├── source # 资源文件夹,除 _posts 文件,其他以下划线_开头的文件或者文件夹不会被编译打包到public文件夹
    | ├── _drafts # 草稿文件
    | └── _posts # 文章Markdowm文件
    └── themes # 主题文件夹
    • 本地预览:hexo s

github操作

  • 创建仓库
  • 将该仓库设置为静态站点托管。
    • 点击仓库菜单Settings->Pages
    • 注意:Github 仅能使用一个同名仓库的代码托管一个静态站点
      logo
  • 在页面https://github.com/settings/tokens创建 Personal access tokens
    token
  • 添加仓库变量
    • 设置HEXO_DEPLOY_PRI, value 是上步生成的 BLOG_DEPLOY_TOKEN 的值
      pri
  • 添加 workflow, 文件路径为root/.github/workflows/deploy.yml
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

name: CI

on:
push:
branches:
- master

env:
GIT_USER: ghyghoo8
GIT_EMAIL: ghyghoo8@qq.com
THEME_REPO: theme-next/hexo-theme-next
THEME_BRANCH: master
DEPLOY_REPO: ghyghoo8/ghyghoo8.github.com
DEPLOY_BRANCH: master

jobs:
build:
name: Build on node ${{ matrix.node_version }} and ${{ matrix.os }}
runs-on: ubuntu-latest
strategy:
matrix:
os: [ubuntu-latest]
node_version: [18.x]

steps:
- name: Checkout
uses: actions/checkout@v3

- name: Checkout theme repo
uses: actions/checkout@v3
with:
repository: ${{ env.THEME_REPO }}
ref: ${{ env.THEME_BRANCH }}
path: themes/next

- name: Checkout deploy repo
uses: actions/checkout@v3
with:
repository: ${{ env.DEPLOY_REPO }}
ref: ${{ env.DEPLOY_BRANCH }}
path: .deploy_git

- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node_version }}
cache: 'yarn' # Or 'npm' or 'pnpm'

- name: Configuration environment
env:
HEXO_DEPLOY_PRI: ${{secrets.HEXO_DEPLOY_PRI}}
run: |
sudo timedatectl set-timezone "Asia/Shanghai"
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name $GIT_USER
git config --global user.email $GIT_EMAIL
cp _config.theme.yml themes/next/_config.yml

- name: Install dependencies
run: |
yarn install

- name: Deploy hexo
env:
GITHUB_TOKEN: ${{secrets.HEXO_DEPLOY_PRI}}
run: |
rm -rf .deploy_git
yarn deploy

  • _config.yml文件配置下新增配置,支持github自动部署
1
2
3
4
5
6
7
8
9
10
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
type: git
repo:
github:
url: https://github.com/ghyghoo8/ghyghoo8.github.com.git
branch: gh-pages
token: $GITHUB_TOKEN

  • 提交到github后,就能触发仓库Actions
    ci

参考

  • https://segmentfault.com/a/1190000017986794
  • https://timemachine.icu/posts/1eb3f811/