0%

架构图

alt text

背景

大数据与AI的关系

大数据让人工智能变得更加智能,
人工智能让大数据变得更有价值。

  1. 大数据为AI提供“燃料”
    • 训练基础:深度学习模型依赖大量数据训练,数据量直接影响模型性能。
    • 多样性增强:结构化与非结构化数据的融合(如文本、图像、传感器数据)帮助AI捕捉复杂模式。
    • 数据质量提升:清洗与标注技术优化减少AI模型的“垃圾输入”问题。
  2. AI为大数据提炼价值
    • 智能分析:AI通过深度学习从数据中自动发现非线性关系。
    • 实时决策:结合流数据处理,AI实现秒级甚至毫秒级响应。
    • 数据生成与增强:生成式AI可合成虚拟数据,缓解数据稀缺问题。

AI数字化转型路线

  1. 基础设施云化与数据资产化
    核心目标:构建数字化底座,让数据成为核心资产
    • 云原生架构:采用混合云、私有云,提升弹性算力(如中信证券与阿里云合作搭建金融云)。
    • 数据中台:整合交易、客户、市场数据,形成统一数据资产(如华泰证券的“数据工厂”)。
    • AI 算力储备:部署 GPU/TPU 集群,支持大模型训练(如国泰君安自建 AI 算力中心)。
  2. 业务智能化与自动化
    核心目标:用 AI 重构核心业务流程,提升效率与体验
    • 智能投研:AI 辅助研报生成、舆情分析(如中金公司“AI 策略报告”)。
    • 智能投顾:个性化资产配置(如广发证券“贝塔牛”)。
    • 智能风控:实时监测异常交易(如东方证券 AI 风控系统)。
    • RPA+AI:自动化运营(如东吴证券合同审核效率提升 80%)。
  3. 服务场景化与生态化
    核心目标:从“单一金融产品”转向“场景化服务生态”
    • 嵌入场景:与互联网平台合作(如华泰证券与同花顺、雪球合作)。
    • 开放 API:让客户、第三方开发者接入(如中信证券 CAP 开放平台)。
    • 数字员工:AI 客服、AI 投顾(如中信证券“数字人助理”)。

层级与组件介绍

数据层

  • 核心作用:为上层提供多模态数据支持,以及各种形态数据的存储、管理、访问
  • 关键组件:
    • 流式数据载体:Kafka(消息队列)
    • 结构化数据:Hive(批处理结果)。
    • 非结构化数据:多模态数据湖(图像视频/音频/文本/文件等)。
    • 搜索工具:ES(全文检索),Milvus(向量管理与检索)。
  • 典型应用:模型训练的数据来源、智能体的知识库基础。

多模态数据湖

以Deep Lake为例,其核心功能包括:

  • 多模态数据支持:
    支持图像、视频、音频、文本、PDF、DICOM(医学影像)等数据类型,统一存储为张量格式(如 NumPy 数组),兼容 PyTorch/TensorFlow 等框架。
  • 版本控制
    类似 Git 的分支管理(commit/checkout)、标签功能和合并操作,便于团队协作和实验回溯。
  • 高效查询与检索
    • TQL 查询引擎:支持语义搜索和过滤(如 ds.filter(lambda x: x.label == ‘cat’))。
    • 向量搜索:集成 LangChain/LlamaIndex,适用于 LLM 应用的嵌入检索。
  • 性能优化:
    • 流式加载:惰性加载数据,减少训练等待时间。
    • 原生压缩:图像/视频保持压缩格式,节省存储空间。

向量数据库

以Milvus(Faiss基础上开发)为例,其搜索功能包括:
KNN 搜索:查找最接近查询向量的前 K 个向量。
过滤搜索:在指定的过滤条件下执行 ANN 搜索。
范围搜索:查找查询向量指定半径范围内的向量。
混合搜索:基于多个向量场进行 ANN 搜索。
全文搜索:基于 BM25 的全文搜索。
Rerankers:根据附加标准或辅助算法调整搜索结果顺序,完善初始 ANN 搜索结果。
获取:根据主键检索数据。
查询:使用特定表达式检索数据。

整体数据流向

alt text

基建层

  • 核心能力:行业垂直模型开发与管理、知识库、AI应用程序框架、实时应用框架。
  • 关键模块:
    • 模型相关:大语言模型、Embedding生成/检索、模型蒸馏(轻量化)。
    • 知识管理:检索增强(RAG)、知识库构建。
    • 应用程序框架:LangChain(链式应用框架),Dify(链式应用框架的低代码平台),AutoGPT(自主任务执行),MetaGPT(多智能体协作框架)
  • 目标:支持从通用大模型到垂直领域微调的完整流程。

行业垂直模型

本人对模型了解不多,只给出一些可能方向

  • 金融大语言模型(LLM)
    • 微调方式:
      • 指令微调(如“生成某股票的深度分析”)
      • RLHF(人类反馈强化学习)确保合规性(如避免误导性投资建议)
    • 精调:数百条高质量样本,强化某些注意力头
    • 核心能力:
      • 金融文本理解(如财报摘要、行业趋势分析)
      • 投资逻辑推理(如“为什么某股票近期下跌?”)
      • 合规审核(如识别潜在违规表述)
  • 语音模型(ASR+TTS+NLP)
    • 语音识别(ASR):高精度金融术语识别(如“市盈率”“量化宽松”)。
    • 语音合成(TTS):自然语音播报(如实时行情播报、AI投顾交互)。
    • 语音NLP:
      • 客户语音查询理解(如“帮我查一下宁德时代的研报”)
      • 情绪分析(如识别客户投诉或投资焦虑)
  • 多模态模型(视觉+文本)
    • 图表理解:解析K线图、财报图表、行业趋势图。
    • 文档OCR:扫描合同、研报、公告,提取关键信息。
    • 视频分析:解读财经新闻视频、路演直播内容。

RAG

RAG(Retrieval-Augmented Generation,检索增强生成)是AI领域的一项前沿技术,旨在通过结合外部知识检索与生成式模型的能力,提升大型语言模型(LLM)在知识密集型任务中的准确性和时效性。
alt text
RAG通过以下两个关键阶段工作:

  • 检索阶段:
    • 文本:
      • 利用传统信息检索模型(如BM25)从外部知识库(全文搜索数据库)中检索与用户查询相关的文档片段。
      • 使用词向量,与传统信息检索模型类似
      • 利用上下文相关模型(如BERT)生成句向量进行向量检索
    • 多媒体与文件:用户提问时,问题被实时向量化,通过近似最近邻(ANN)算法(如HNSW)快速匹配最相关的知识片段
  • 生成阶段:将检索到的上下文输入LLM,生成基于实际知识的回答,而非仅依赖模型预训练的参数化知识。

常见的Embedding生成器

模型名称 类型 支持语言 最大Token 特点 适用场景
OpenAI text-embedding-3-small 文本 多语言 8192 轻量级,检索任务平均分61.0,适合快速验证 通用文本检索、RAG基础版
OpenAI text-embedding-3-large 文本 多语言 8192 高精度,检索任务平均分64.6,延迟较高 高精度语义匹配、复杂问答
BGE-M3 文本 194种 8192 多语言榜首,支持密集/稀疏/多向量检索,长文本处理强 多语言知识库、长文档解析
Sentence-BERT 文本 多语言 512 句子级嵌入,语义相似度计算精准,开源易部署 短文本匹配、推荐系统
ResNet50 图像 - - 图像特征提取老将,适合以图搜图 电商图片检索、视频帧分析
PANNs 音频 - - 预训练音频模型,支持音乐分类、语音检索 音频内容识别、智能客服录音分析
CLIP/SigLIP 多模态 多语言 77(文本) 文图互搜,SigLIP优化了zero-shot效果,适合跨模态搜索 广告创意检索、多模态推荐
Word2Vec 文本 单语言 - 经典词向量,训练成本低,但无法处理一词多义 简单语义分析、教学演示

应用程序框架对比

维度 LangChain Dify AutoGPT MetaGPT
产品形态 Python/JS代码库(需编程) 可视化低代码平台(BaaS+LLMOps) 自主任务执行的AI Agent框架
抽象层级 底层模块化工具链(高灵活性) 高度封装(开箱即用) 任务自动化引擎(目标驱动) 高层工作流编排(角色分工/SOP标准化)
目标用户 开发者/技术团队(需编程能力) 全团队协作(非技术成员可参与) 个人/企业(自动化需求) 企业开发者/AI工程团队(需复杂任务自动化)
模型支持 需手动适配接口(如HuggingFace) 一键切换数百个模型(统一API) 默认依赖GPT系列,社区扩展有限 依赖大模型API(如GPT-4生成代码/规划)
扩展性 高(可集成任意API/数据库) 依赖插件市场,企业功能完善 任务分解能力强,但生态较封闭 模块化设计(可自定义角色/工具链)
核心优势 灵活性高,适合复杂系统 开发效率极快,企业级支持完善 自动化任务执行 标准化协作流程(显式分解复杂任务)
主要短板 学习曲线陡峭,维护成本高 定制能力有限 资源消耗大,稳定性待提升 成本敏感(多Agent调用放大API开销)

实时性支持

实时性支持此处列举得比较简单,但其实施通常是对整个链路的改造,包括以下几个方面:
1. AI agent感知层的实时触发

  • 事件驱动架构:
    • 采用消息队列(如Kafka/Pulsar)或边缘设备事件触发器(如IoT传感器),实现毫秒级事件感知。
    • 示例:工业质检Agent通过摄像头帧级事件实时捕捉产品缺陷。
  • 流式数据处理:
    • 集成流计算框架(Flink/Spark Streaming),对输入数据实时清洗与特征提取。
    • 挑战:高并发场景下需平衡吞吐量与延迟(如自动驾驶需<100ms响应)。
  1. RAG流式更新知识
    • 动态索引构建:
      • 增量索引技术(如Elasticsearch的_update_by_query)支持文档级实时更新,避免全量重建索引的延迟。
      • 优化点:结合向量数据库(Milvus/Pinecone)的相似度检索,确保新知识即时生效。
    • 多级缓存策略:
      • 热点知识缓存在内存(Redis),冷数据下沉至磁盘,平衡实时性与成本。
      • 案例:金融风控Agent实时同步监管政策变更至缓存层。
  2. 工具层的实时性支持
    • 低延迟工具调用:
      • 工具API设计遵循轻量化原则(如gRPC替代REST),预加载工具上下文减少冷启动延迟。
      • 示例:电商客服Agent调用库存API时,通过HTTP长连接保持会话状态。
    • 异步执行与超时熔断:
      • 工具调用采用异步协程(如Python asyncio),超时机制(如Hystrix)避免阻塞主线程。
  3. 数据层的实时性支持
    • 实时数仓与OLAP优化:
      • 使用实时OLAP引擎(ClickHouse/Doris)或时序数据库(InfluxDB),支持亚秒级聚合分析。
      • 技术选型:Lambda架构兼顾实时流(Flink)与批处理(Hive)数据一致性。
    • 分布式状态管理:
      • 通过分布式快照(如Flink Checkpoint)保证Agent状态跨节点实时同步,避免决策偏差。

底层应用

底层应用是AI Agent的工具模块的一部分。由于上下文提示的影响,Agent也可能无法导向正确的知识,甚至产生知识幻觉。再加上缺乏语料库、训练数据以及针对特定领域和场景的调整,在专注于特定领域时,Agent的专业知识也会受到限制。专业化工具能让 LLM 以可插拔的形式增强其专业知识、调整领域知识并更适合特定领域的需求。

  • 业务场景:
    • 大数据应用:客户画像、数据血缘分析。
    • 垂直业务:智能客服、精准营销、风险处置。
  • 特点:直接解决具体业务问题,依赖下层技术支撑。

AI Agent智能体

alt text

  • 架构核心:自主决策与协作系统。
  • 关键设计:
    • 单智能体:包含感知→决策→执行的闭环(如零售智能体的推荐逻辑)。
    • 多智能体系统:通过通信模块协作(如风控+量化智能体联合决策)。

智能体组成

AI Agent(智能代理)是一个能够感知环境、自主决策并执行动作的智能系统,其核心组成和实现方式通常包括以下部分:
1. 感知模块(Perception)

  • 作用:从环境中获取信息(如传感器数据、用户输入、网络数据等),并将其转化为结构化数据供其他模块处理。
  • 实现方式:
    • 传感器:物理设备(如摄像头、麦克风)或软件接口(API、网页爬虫)。
    • 自然语言处理(NLP):解析文本或语音输入(如BERT、GPT)。
    • 计算机视觉:处理图像/视频(如CNN、YOLO)。
    • 数据预处理:清洗、归一化、特征提取等。
  1. 决策模块(Reasoning/Planning)
    • 作用:基于感知信息、内部知识库和目标,制定行动策略或生成响应。
    • 实现方式:
      • 规则引擎:基于预定义规则(如专家系统)。
      • 机器学习模型:通过强化学习(RL)、深度学习(DL)或符号逻辑推理(如Prolog)。
      • 规划算法:如A*搜索、蒙特卡洛树搜索(MCTS)用于路径规划或任务分解。
      • 大语言模型(LLM):如GPT-4生成对话或决策建议。
方法 优势 局限性 适用场景 技术依赖
规则引擎 透明、易解释 灵活性低,规则维护成本高 结构化流程(如审批) 专家知识库
规划算法 支持多步骤任务分解 计算复杂,需环境模型 机器人导航、供应链优化 图搜索算法、动态规划
强化学习 自适应动态环境 训练成本高,奖励设计困难 游戏AI、实时控制 深度神经网络、模拟环境
大模型推理 泛化能力强,自然语言交互 可能产生幻觉,算力需求高 开放域问答、创意生成 LLM、RAG、工具调用API
  1. 记忆模块(Memory)
  • 作用:存储短期/长期信息,支持上下文理解和学习。
  • 实现方式:
    • 短期记忆:缓存当前会话的上下文(如对话历史)。
    • 长期记忆:知识图谱、向量数据库(如FAISS)、SQL数据库。
    • 检索增强生成(RAG):结合外部知识库提升回答准确性。
  1. 执行模块(Action)
  • 作用:将决策转化为具体行动,影响环境或用户。
  • 实现方式:
    • 物理执行器:机器人控制电机、机械臂。
    • 软件接口:调用API(如发送邮件、控制智能家居)。
    • 自然语言输出:语音合成(TTS)或文本生成(如ChatGPT)。
  1. 学习模块(Learning)
  • 作用:通过反馈优化行为(在线学习或离线训练)。
  • 实现方式:
    • 监督学习:标注数据训练模型(如分类任务)。
    • 强化学习(RL):通过奖励机制调整策略(如AlphaGo)。
    • 联邦学习:分布式数据下的隐私保护学习。
  1. 通信模块(Communication)
  • 作用:与用户、其他Agent或系统交互。
  • 实现方式:
    • 自然语言交互:基于NLP的对话系统。
    • 协议接口:HTTP/RPC、消息队列(如MQTT)。

多智能体

多智能体系统(Multi-Agent System, MAS)是由多个AI Agent组成的协作网络,这些Agent通过通信和协同工作,共同完成复杂任务。多智能体的核心优势在于:
1. 分工协作:不同Agent专精于特定任务(如搜索、数据分析、代码生成等),通过任务拆解和分配实现高效协同。
2. 复杂任务处理:单个Agent难以完成的复杂任务(如全域营销、供应链优化),可通过多Agent协作分阶段解决。
3. 适应性更强:动态环境中,多Agent系统能通过实时交互调整策略,例如无人机编队或金融风控场景。

架构设计

  • 分层协作:参考Manus的三大模块:
    • 规划模块:拆解任务并分配子任务(如将“旅游保险分析”拆解为PDF解析、数据对比等步骤)。
    • 执行模块:调用专用Agent(如Content Agent生成报告)。
    • 验证模块:审核结果准确性后交付用户。
  • 通信协议:采用标准化框架(如InterAgent协议)确保Agent间互操作性,类似区块链中的智能合约协调。

开发框架与工具

  • 开源平台:
    • AutoGen:支持多Agent对话和人类参与,适合构建聊天机器人协作系统。
    • CrewAI:强调流程化任务分配,适合顺序性强的场景(如自动发邮件流程)。
    • MetaGPT:基于角色设计的框架,模拟软件开发团队分工。
  • 商业化应用:如Manus的付费多Agent服务,或微盟的“数字员工”企业级解决方案。

案例

数据分析智能体

alt text

以下场景为deepseek生成。(从侧面体现了LLM的决策能力)
提示词:请你设计一个数据分析智能体,用对话的形式,实现“描述性分析”与“探索性分析”两种分析场景。能用到的工具有:数据地图,数据卡片平台,归因分析平台,客户画像系统,数据血缘,埋点平台、客群分析平台等

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
数据分析智能体对话设计
1. 启动对话(意图识别)
用户:我想分析最近三个月的销售数据。
智能体:
您好!我将协助您完成分析。请问您需要哪种分析类型?
* 描述性分析:快速了解数据分布(如均值、趋势、异常值)。
* 探索性分析:深入挖掘潜在模式(如归因、客群差异)。
2. 描述性分析场景(基础统计与可视化)
用户:先做描述性分析。
智能体:
已通过数据地图定位到销售数据集,包含订单量、销售额、地区等字段。以下是关键统计结果:
a. 数据卡片平台生成摘要:
* 销售额均值:x=120万(环比+15%)
* 订单量分布:华东占比45%(异常值:3月15日单日订单激增200%)
b. 可视化建议:
* 折线图(时间趋势)
* 热力图(地区销售密度)
是否需要进一步拆分维度(如按产品类别)?
3. 探索性分析场景(深度挖掘)
用户:为什么华东地区销售额突增?
智能体:
正在调用工具链进行多维度归因:
a. 归因分析平台:
* 关键因子:促销活动(贡献度62%)、新客增长(25%)
b. 客户画像系统:
* 新客特征:25-35岁女性,偏好高单价品类(通过埋点平台追踪行为路径)
c. 数据血缘验证:
* 活动数据与销售数据链路完整,无ETL异常
建议下一步:
* 通过客群分析平台对比华东与其他地区用户画像差异
* 需检查促销活动ROI吗?
4. 动态交互与工具调度
用户:我想看促销活动的转化漏斗。
智能体:
已从埋点平台提取用户行为事件,生成漏斗图:
* 曝光→点击转化率:12%(低于平均水平15%)
* 点击→下单转化率:8%(行业基准7%)
异常定位:
* 曝光环节流失率高,建议检查广告投放渠道(数据血缘显示部分渠道数据缺失)
5. 总结与自动化建议
智能体:
分析完成!是否需要:
a. 保存当前分析流程至数据卡片平台供复用?
b. 设置自动化监控(如销售额异动触发归因分析)?
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
flowchart LR
%% 分层架构
subgraph 用户交互层
A[自然语言输入] --> B[对话引擎]
B --> C[可视化卡片-图表/表格/摘要]
C --> D[交互式追问]
end

subgraph 分析服务层
B --> E{分析类型路由}
E --> |描述性分析| F[查询引擎]
E --> |探索性分析| G[归因分析平台]
E --> |探索性分析| H[客群分析平台]
F --> I[查询可视化平台]
G --> J[客户画像系统]
end

subgraph 数据治理层
I & G & H --> K[数据地图]
K --> L[数据湖]
L --> M[结构化数据]
L --> N[非结构化数据]
M --> O[数据血缘]
end

subgraph 支撑系统
Q[元数据管理] --> K
R[权限控制] --> L
S[查询缓存] --> F
end

%% 关键数据流
F -.-> |SQL/API| L
I -.-> |渲染图表| C
P -.-> |实时事件流| H
O -.-> |血缘校验| G
J -.-> |生成摘要| C

可能的方向

  1. 员工效率提升
    • 重复性工作:数据录入、报表生成、邮件分类等规则明确的流程。
    • 预测分析:基于历史数据的销售预测、风险评估。
    • 辅助性数据探索工作:ChatBI
    • 实时响应:客服聊天机器人(如回答常见问题)。
  2. 信息处理与生成
    • 内容创作:生成文本(研报、市场简报)、图像/视频合成(研报文生图)。
    • 事件驱动分析:识别突发事件对行业的影响(如疫情对航空股冲击)。
    • 知识检索:快速搜索并整合信息(投研问答)。
  3. 风险管理与合规
    • 异常交易监测:识别操纵市场、老鼠仓等模式(如监测账户关联性)。
    • 反洗钱(AML):AI分析资金流水,标记可疑交易
  4. 客户服务与营销
    • 智能投顾:根据风险问卷生成标准化组合。
    • 精准营销:通过用户行为分析推荐产品(如低风险客户推国债逆回购)。
    • 合规质检:AI监听客服通话,实时提示违规话术(如承诺收益)。

公开招募工具
✓✓✓ = 最多6星 | ✓✓ = 最多5星 | ✓ = 最多4星

词条+词条

词条组合 支援 狙击 远程位 位移 减速 控场 召唤 削弱 爆发 费用回复 近战位 治疗 快速复活 群攻 生存 防护 输出
​支援​ - ✓✓✓ ✓✓✓ ✓✓ ✓✓✓ ✓✓ ✓✓✓
​狙击​ - ✓✓ ✓✓
​远程位​ ✓✓ - ✓✓ ✓✓
​位移​ - ✓✓ ✓✓✓ ✓✓ ✓✓
​减速​ ✓✓✓ ✓✓ - ✓✓
​控场​ ✓✓✓ ✓✓✓ ✓✓ - ✓✓ ✓✓ ✓✓ ✓✓✓
​召唤​ ✓✓ -
​削弱​ - ✓✓ ✓✓ ✓✓
​爆发​ ✓✓ - ✓✓
​费用回复​ ✓✓ ✓✓ -
​近战位​ ✓✓ -
​治疗​ - ✓✓
​快速复活​ ✓✓ ✓✓ -
​群攻​ ✓✓✓ ✓✓✓ ✓✓ ✓✓ - ✓✓
​生存​ ✓✓ - ✓✓
​防护​ ✓✓✓ ✓✓ ✓✓ ✓✓ ✓✓ - ✓✓
​输出​ ✓✓ ✓✓ ✓✓ ✓✓ -

词条+职业

词条组合 输出 减速 快速复活 召唤 支援 控场 爆发 位移 狙击 治疗 防护 削弱 生存 远程位
​先锋​ ✓✓
​术师​ ✓✓✓ ✓✓ ✓✓ ✓✓
​辅助​ ✓✓ ✓✓ ✓✓ ✓✓ ✓✓ ✓✓
​重装​ ✓✓ ✓✓✓ ✓✓ ✓✓
​狙击​ ✓✓✓ ✓✓ -
​医疗​
​特种​ ✓✓ ✓✓✓ ✓✓ ✓✓ ✓✓ ✓✓✓
​近卫​ ✓✓

关于BBR的介绍参见 BBR (很久以前写过详细文档,后来丢了,只找到了一小部分……)

在一些比较老的OpenVZ的vps(宿主机内核低于4.9版本)上,是无法开启bbr的。tcp的拥塞控制,在网络链路存在严重丢包时,会将拥塞窗口乘性减少,所以进行文件传输时,速度会越来越慢。以下介绍一下我面临scp速度慢的问题的解决办法

haproxy-lkl代理ssh端口

市面上有很多代替BBR的方案,大多都大差不差,都是使用lkl(linux kernal library)内核库绕过内核协议处理网络数据,再使用端口代理,实现在某几个端口的传输层能达到bbr的效果。

参考了ovz架构安装bbr内核一文,很方便,一建安装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
恭喜!BBR 安装完成并成功启动

已加速的端口: 2222

你可以通过修改文件:
/usr/local/haproxy-lkl/etc/port-rules

来配置需要加速的端口或端口范围。

请使用 systemctl {start|stop|restart} haproxy-lkl
来 {开启|关闭|重启} 服务

服务已自动加入开机启动,请放心使用。

如果这个脚本帮到了你,你可以请作者喝瓶可乐:
https://blog.kuoruan.com/donate

享受加速的快感吧!

但也有缺点,这个端口代理只能影响外部访问该端口的,不能影响由内向外的。我尝试过打开某个本地端口,再通过以下代码将文件scp到外面,但是并没有用

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
# 指定本地端口
# 没有用,haproxy-lkl并监听由本地端口发起的连接
def transfer_and_delete_file_using_key_and_local_port(local_file_path, remote_host, remote_user, private_key_path,
remote_file_path, local_port):
private_key = paramiko.RSAKey.from_private_key_file(private_key_path)
local_host = "0.0.0.0" # 表示从任意本地网络接口连接

# 创建 SSH 客户端对象
ssh = paramiko.SSHClient()
# 自动添加主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((local_host, local_port))
sock.connect((remote_host, 22))
transport = paramiko.Transport(sock)
try:
transport.start_client()
transport.auth_publickey(remote_user, private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 检查远程文件路径的目录是否存在,如果不存在则创建
remote_dir = os.path.dirname(remote_file_path)
try:
sftp.listdir(remote_dir)
except IOError:
sftp.mkdir(remote_dir)
sftp.put(local_file_path, remote_file_path)
sftp.close()
logging.info(f"local file scp finish, {local_file_path}")
# 删除本地文件
os.remove(local_file_path)
logging.info(f"local file deleted: {local_file_path}")
except Exception as e:
traceback.print_exc()
logging.error(f"exception on {local_file_path} with error {e}")
finally:
# 关闭 Transport 连接
transport.close()

http请求呼叫远端pull

我干脆就不push了,让远端pull。这里面只有一个问题,就是网络链路不稳定容易导致('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))错误

解决方案是pull接口幂等+重试

本地:

1
2
3
4
5
6
7
8
9
10
11
def ask_remote_scp_local_file_and_remote():
while True:
try:
resp = session.post("http://xxx", json=req,timeout=3600)
if resp:
break
except Exception as e:
logging.error("ask remote scp fail," + e.__str__())
if resp.status_code == 200 and resp.text == 'success':
os.remove(file_path)
return

远端:
使用python-redis-lock包

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
def scp_from_remote_using_key(local_file_path, remote_host, remote_user, private_key_path, remote_file_path, port):
# 创建 SSH 客户端
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
# 加载私钥
private_key = paramiko.RSAKey.from_private_key_file(private_key_path)
# 连接到远程服务器
ssh.connect(remote_host, port=port, username=remote_user, pkey=private_key)
# 使用 sftp 传输文件
sftp = ssh.open_sftp()
# 检查远程文件路径的目录是否存在,如果不存在则创建
local_dir = os.path.dirname(remote_file_path)
try:
os.listdir(local_dir)
except IOError:
os.mkdir(local_dir)

sftp.get(remote_file_path, local_file_path)
sftp.close()
logging.info(f"remote file scp finish, {remote_file_path}")
except Exception as e:
logging.error(f"exception on {remote_file_path} with error {e}")
finally:
# 关闭 SSH 连接
ssh.close()
def lock_and_scp(local_file_path, remote_host, remote_user, private_key_path, remote_file_path, port):
m2 = hashlib.md5()
m2.update(remote_file_path.encode('utf-8'))
md5 = m2.hexdigest()
lock = redis_lock.Lock(redis_connect, "lock_" + md5, expire=600)

if lock.acquire(blocking=True):
if redis_connect.get("finished_" + md5) is None:
scp_from_remote_using_key(local_file_path, remote_host, remote_user, private_key_path, remote_file_path,
port)
redis_connect.set("finished_" + md5, "1")
redis_connect.expire("finished_" + md5, 600)
lock.release()

起因

在truenas的nextcloud升级后,可能是由于容器拉取混乱,k3s里的nextcloud空间也乱了。陆续出现了几个问题:

  1. 原本只有3个pod,结果多了nextcloud-postgres-ncnextcloud-nc两个deployment,而且都是比我设置版本低的,读的同一个映射路径(直接删掉多余的deploy)
  2. 在nextcloud-postgres容器中出现了2025-01-01T00:10:27.747127138+08:00 2024-12-31 16:10:27.747 UTC [169] FATAL: role "postgres" does not exist报错。虽然没找到这个错误的起因,但还是尝试解决了一下。
  3. app_api插件更新卡住不动(在将/html/apps/app_api目录先移出目录在移进后就莫名其妙好了)

网上说解决第2个问题的方法都语焉不详。postgres应该是默认的超级管理员用户,现在超级管理员直接没了,所以很多操作实际上是执行不了的。一下说一下我的解决办法

创建临时pg容器

在原有容器中,postgres进程是不能关的,关了后容器会重建,尝试设置了一下pod的restartPolicy为Never也没用。因此创建了一个临时容器来处理,新容器删掉了探针,加了一个tail -f /dev/null保持容器不关闭。

配置postgres.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
apiVersion: v1
kind: Pod
metadata:
name: postgres-13.1
labels:
app: postgres
namespace: default
spec:
restartPolicy: Never
containers:
- name: postgres
image: postgres:13.1
command: ["tail", "-f", "/dev/null"]
ports:
- containerPort: 5432
name: postgres
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-data
hostPath:
path: /xxxx # 宿主机挂载到容器的pg根目录
type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard

接着启动容器

1
2
k3s kubectl apply -f postgres2.yaml
k3s kubectl delete pod postgres-13.1 -n default

进入single模式,增加postgres用户

1
2
3
4
5
6
7
8
pg_ctl stop -D /var/lib/postgresql/data/

postgres --single -D /var/lib/postgresql/data/
>CREATE ROLE postgres SUPERUSER LOGIN CREATEDB CREATEROLE INHERIT REPLICATION BYPASSRLS;

pg_ctl start -D /var/lib/postgresql/data/

k3s kubectl delete pod postgres-13.1 -n default

总指南《保姆级教程!将 Vim 打造一个 IDE (Python 篇)》
系统:Linux version 5.4.0-198-generic (buildd@lcy02-amd64-109) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2))

安装 vim 9.1

安装python3.8及以上的python

YouCompleteMe插件必须要python3.8+编译的vim

1
2
3
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.8

安装vim9.1

YouCompleteMe插件必须要最新的vim版本才能支持,网上的添加非官方库add-apt-repository ppa:jonathonf/vim的方法也只能装9.0版本的,因此需要手动编译
The Vim repository at GitHub
How To Install Vim with Python3 Support

1
2
3
4
5
6
7
8
sudo apt install -y python3-distutils python3-dev 
sudo apt install libncurses-dev
./configure --enable-python3interp \
--with-python3-config-dir=/usr/lib/python3.8/config-* \
--with-python3-command=/usr/bin/python3 \
--without-x
make
sudo make install

安装插件

安装插件管理工具vim-plug

1
2
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

插件配置

在.vimrc中添加

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
" 插件开始的位置
call plug#begin('~/.vim/plugged')

" 代码自动完成,安装完插件还需要额外配置才可以使用
Plug 'ycm-core/YouCompleteMe'

" 用来提供一个导航目录的侧边栏
Plug 'scrooloose/nerdtree'
" 设置NerdTree
map <F3> :NERDTreeMirror<CR>
map <F3> :NERDTreeToggle<CR>
" 可以使 nerdtree 的 tab 更加友好些
Plug 'jistr/vim-nerdtree-tabs'

" 可以在导航目录中看到 git 版本信息
" Plug 'Xuyuanp/nerdtree-git-plugin'

" 查看当前代码文件中的变量和函数列表的插件,
" 可以切换和跳转到代码中对应的变量和函数的位置
" 大纲式导航, Go 需要 https://github.com/jstemmer/gotags 支持
Plug 'preservim/tagbar'
nmap <F9> :TagbarToggle<CR>

" 自动补全括号的插件,包括小括号,中括号,以及花括号
Plug 'jiangmiao/auto-pairs'

" Vim状态栏插件,包括显示行号,列号,文件类型,文件名,以及Git状态
Plug 'vim-airline/vim-airline'

" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
" 可以快速对齐的插件
Plug 'junegunn/vim-easy-align'

" 可以在文档中显示 git 信息
Plug 'airblade/vim-gitgutter'

" markdown 插件
Plug 'iamcco/mathjax-support-for-mkdp'
Plug 'iamcco/markdown-preview.vim'

" 下面两个插件要配合使用,可以自动生成代码块
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'

" go 主要插件
Plug 'fatih/vim-go', { 'tag': '*' }

" go 中的代码追踪,输入 gd 就可以自动跳转
Plug 'dgryski/vim-godef'

" 可以在 vim 中使用 tab 补全
"Plug 'vim-scripts/SuperTab'

" 可以在 vim 中自动完成
"Plug 'Shougo/neocomplete.vim'


" 插件结束的位置,插件全部放在此行上面
call plug#end()

安装插件

打开 vim 输入 :PlugInstall

安装YouCompleteMe

YouCompleteMe需要单独安装

1
2
cd ~/.vim/plugged/YouCompleteMe
python3 install.py

安装 ctags

tagbar需要单独安装ctags

1
sudo apt install ctags

插件使用

切换窗口

CTRL-w j
光标切换到下一个窗口。
CTRL-w k
光标切换到上一个窗口。
CTRL-w h
光标切换到左边窗口。如果左边没有窗口,保持在当前窗口不变。
CTRL-w l
光标切换到右边窗口。
CTRL-w w
在各个窗口之间来回切换。每输入一次,切换一个窗口。不停输入,可以遍历所有窗口。在只有两个窗口时很方便来回切换。

YouComplete 代码自动补全

自动补全代码,使用方法和普通IDE一样

NerdTree 文件目录

.vimrc中添加

1
2
map <F3> :NERDTreeMirror<CR>
map <F3> :NERDTreeToggle<CR>

设置F3为打开文件目录的快捷键

基本操作快捷键:

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
?: 快速帮助文档
o: 打开一个目录或者打开文件,创建的是buffer,也可以用来打开书签
go: 打开一个文件,但是光标仍然留在NERDTree,创建的是buffer
t: 打开一个文件,创建的是Tab,对书签同样生效
T: 打开一个文件,但是光标仍然留在NERDTree,创建的是Tab,对书签同样生效
i: 水平分割创建文件的窗口,创建的是buffer
gi: 水平分割创建文件的窗口,但是光标仍然留在NERDTree
s: 垂直分割创建文件的窗口,创建的是buffer
gs: 和gi,go类似
x: 收起当前打开的目录
X: 收起所有打开的目录
e: 以文件管理的方式打开选中的目录
D: 删除书签
P: 大写,跳转到当前根路径
p: 小写,跳转到光标所在的上一级路径
K: 跳转到第一个子路径
J: 跳转到最后一个子路径
<C-j>和<C-k>: 在同级目录和文件间移动,忽略子目录和子文件
C: 将根路径设置为光标所在的目录
u: 设置上级目录为根路径
U: 设置上级目录为跟路径,但是维持原来目录打开的状态
r: 刷新光标所在的目录
R: 刷新当前根路径
I: 显示或者不显示隐藏文件
f: 打开和关闭文件过滤器
q: 关闭NERDTree
A: 全屏显示NERDTree,或者关闭全屏

tagbar 大纲式导航

.vimrc中添加nmap <F9> :TagbarToggle<CR> 绑定F9为打开关闭的快捷键
上下移动(jk), 选中回车后会跳转

vimgrep 文件内查找

在 Vim 命令行模式下输入 :h vimgrep 可以看到 vimgrep 的使用文档

命令

1
2
:vim[grep][!] /{pattern}/[g][j] {file} ...
:vim[grep][!] {pattern} {file} ...

含义

  • vim 可作为 vimgrep 的缩写
  • ! 可紧随 vimgrep 之后,表示强制执行该命令
  • 索引的关键字 pattern 放在了两个 “/” 中间,并且支持正则表达式
  • g, j 可选。 如果添加 g,将显示重复行, 如果添加 j,vim 将不会自动跳转到第一个匹配的行(可能是别的文件)
  • file 可以是正则文件名,也可以是多个确定的文件名

使用
:vimgrep /user/g **
使用该命令可以查找当前目录下所有文件中包含 user 字符串的文件,并跳转到第一个匹配的文件,
同时所有搜索结果会显示在 Quickfix 中,使用 :cw, :copen 可以打开该列表

更多命令

1
2
3
4
5
:cnext, :cn         # 当前页下一个结果
:cprevious, :cp # 当前页上一个结果
:clist, :cl # 使用 more 打开 Quickfix 窗口
:copen, :cope, :cw # 打开 Quickfix 窗口,列出所有结果
:ccl[ose] # 关闭 Quickfix 窗口。