0%

AI 第一篇

背景

这篇文章拖了很久了。因为我之前带LMT团队,团队的主要工作内容就是处理客户现场问题,因为我要求过程留痕并且达到知识沉淀的效果,所以处理过程中产生了大量的文档,也就是很多经验都落到了文档上,比如linux系统(硬盘、系统版本、dns等)、docker、k8s、现场网络问题(防火墙、网闸等安全设备),也就是运维经常面临的问题,也有产品配置、bug等文档。

文档越来越多,但是却越来越难利用起来,我就想着把这些经验积累起来弄一个知识库,就像gpt一样,只要我输入有关问题他就能根据这些内容生成回答的内容,当然里面不仅仅是经验问答还需要有linux系统(硬盘、系统版本、dns等)、docker、k8s、现场网络问题(防火墙、网闸等安全设备)这些原始(原理)知识,还得有我们的产品知识。

这个知识库一是为了方便使用且能让我练手,二是当时公司推行创新活动,AI相关的案例也能为事业部加分。

开始

知识库的定位:小而美,因为是个人发起的前期申请到的服务器资源有限,而且功能非常单一明确,只需要满足知识库就行,不需要全能。

选型

通过一通查找对比,综合考虑,选择了Anything LLM或者Dify.AI+Ollama+Llama2小模型。

Anything LLM

alt text

考虑的其中一点

是用Anything LLM这种开箱即用的还是用LangChain这种需要自己上手写代码的
Anything LLM和Dify.AI在其架构中广泛使用了LangChain组件,尤其是:

  • 文档加载器(Document Loaders)
  • 文本分割器(Text Splitters)
  • 向量存储(Vector Stores)
  • 检索器(Retrievers)
  1. 直接使用Anything LLM这种系统的好处
    1. 意味着即使不直接编写LangChain代码,您也在间接使用LangChain的强大功能。这有几个好处:
      模块化设计 - 可以灵活替换组件(如切换向量数据库)
      经过验证的架构 - 使用业界已验证的RAG实现方式
      未来升级路径 - 如果您将来想更深入定制,可以直接使用LangChain API
  2. 坏处
    1. 没有深入的了解和实践经验

我当时其实想用LangChain的,环境都搭好了,但是因为没有系统的学习过,进度很慢,没法赶上评审节点,所以最终选择了使用Anything LLM这种简单的方式。

验证

Anything LLM+Ollama试了几种模型和Embedder,最终勉强得出一个组合Llama2:7B-chinese+bge-m3
还需要调整文档本身的内容,以及一些参数再多次尝试。

待续…

参考

https://docs.useanything.com/setup/llm-configuration/overview
https://github.com/Mintplex-Labs/anything-llm/blob/master/docker/HOW_TO_USE_DOCKER.md
https://adasci.org/anythingllm-for-local-execution-and-inferencing-of-llms-a-deep-dive/
https://itnext.io/deploy-flexible-and-custom-setups-with-anything-llm-on-kubernetes-a2b5687f2bcc
https://www.youtube.com/watch?v=4UFrVvy7VlA

AI 第二篇

背景

整理此篇最开始源于做知识库时AI应用-知识库时,当时就想整理写一篇关于AI的一些基础概念,个人扫盲专用,但是老忘。

刚好最近找工作看到了很多AI相关的JD,所以想借着找工作的空隙,补一补这块的知识。

其实我应该是比较早用chatgpt的用户,我都付费了一段时间后,我的很多同事才刚开始想方设法使用chatgpt,但是对于我来说更多时候把它作为一个效率工具或者新奇的玩具在用,关于AI的概念比较散,没有系统的深入了解过,刚好有工作中的机会让我意识到AI离我那么近,我应该好好认知它了,所以有了这篇文章,先把各种概念搞清楚。

正文

1. 人工智能的基础概念

什么是人工智能?

人工智能(Artificial Intelligence,简称AI)是指通过计算机系统模拟人类智能的技术。它让机器能够学习、推理、感知、交流,甚至模仿人类的认知能力。

AI的分类

从应用角度,AI可分为三种类型:

  1. 弱人工智能(Narrow AI):专注于解决特定问题的AI,如语音助手、图像识别等。现阶段大多数AI应用都属于此类。

  2. 通用人工智能(AGI):具备与人类相当的认知能力,能够理解、学习并应用知识解决各种问题。目前仍处于理论和研究阶段。

  3. 超级人工智能(ASI):理论上超越人类智能的AI,能在几乎所有领域超越人类最优秀的表现。

AI的核心技术基础

  1. 机器学习(Machine Learning):让计算机从数据中学习并改进的方法,而不需要被明确编程。

  2. 深度学习(Deep Learning):机器学习的一个子集,是神经网络的一种实现方法,使用多层神经网络模拟人脑结构进行学习。深度学习是一种让多层神经元可以进行有效计算的方法,大大提高了神经网络的性能。“深度学习”这个名字,就是比喻多层神经元的自主学习过程。

  3. 自然语言处理(NLP):使计算机能够理解、解释和生成人类语言。

  4. 计算机视觉(Computer Vision):让计算机能够”看到”并理解视觉信息。

2. 机器学习:AI的核心引擎

机器学习的基本概念

机器学习使计算机能够通过经验自动改进,这种”经验”通常来自数据。简单来说,传统编程是人类编写规则让计算机执行,而机器学习是计算机从数据中找出规则。

机器学习的主要类型

  1. 监督学习:使用已标记的数据训练模型,如分类和回归问题。

    • 例如:垃圾邮件分类、房价预测
  2. 无监督学习:从未标记的数据中发现模式和结构。

    • 例如:客户分群、异常检测
  3. 强化学习:通过尝试与环境互动并获得反馈来学习最佳策略。

    • 例如:游戏AI、自动驾驶决策系统

神经网络与深度学习

神经网络是机器学习的一种主要形式。它模仿人脑神经元连接方式的数学模型,由多层人工神经元组成:

  1. 输入层:接收初始数据
  2. 隐藏层:处理信息(深度学习通常有多个隐藏层)
  3. 输出层:产生最终结果

深度学习是神经网络的一种实现方法,使用的神经网络具有多个隐藏层,能够学习更复杂的特征和模式,特别适合处理非结构化数据如图像、声音和文本。

3. 现代AI模型与架构

深度学习的方法

卷积神经网络(CNN)

CNN专门设计用于处理图像数据,通过使用卷积层来检测特征(如边缘、形状等),然后通过池化层减少数据维度,最后通过全连接层进行分类。

CNN广泛应用于:

  • 图像分类与识别
  • 物体检测
  • 医学图像分析

循环神经网络(RNN)与长短期记忆网络(LSTM)

RNN能够处理序列数据,具有”记忆”功能,适合处理文本、语音等时序数据。LSTM是RNN的改进版,解决了长序列训练中的梯度消失问题。

应用领域:

  • 语音识别
  • 机器翻译
  • 文本生成

Transformer架构

Transformer通过自注意力机制处理序列数据,克服了RNN处理长序列的局限性,成为现代语言模型的基础架构。Transformer 不同于以前的方法,不再一个个处理输入的单词,而是一次性处理整个输入,对每个词分配不同的权重。这种方法直接导致了2022年ChatGPT和后来无数生成式AI模型的诞生,是神经网络和深度学习目前的主流方法。
由于基于 Transformer 的模型需要一次性处理整个输入,所以都有“上下文大小”这个指标,指的是一次可以处理的最大输入。比如,GPT-4 Turbo 的上下文是 128k 个 Token,相当于一次性读取超过300页的文本。上下文越大,模型能够考虑的信息就越多,生成的回答也就越相关和连贯,相应地,所需要的算力也就越多。

著名的Transformer模型:

  • BERT(谷歌)
  • GPT系列(OpenAI)
  • Claude系列(Anthropic)

大型语言模型(LLM)

大型语言模型(Large Language Models,简称LLM)如GPT-4、Claude和Llama是基于Transformer架构的巨型AI模型,通过大规模预训练和微调,能够理解和生成人类语言,执行各种复杂的语言任务。本质上是一种基于深度学习的人工智能系统,它能够理解、生成和处理人类语言。让我来简单解释一下:

大语言模型的本质

大语言模型是一种超大规模的神经网络,通常基于Transformer架构,它通过分析海量文本数据来”学习”语言的模式、规则和知识。想象一下,它就像一个阅读了互联网上大部分内容的”超级读者”,通过理解文字之间的关系来预测和生成文本。

工作原理

  1. 预训练:模型首先在海量文本数据上进行训练,学习词汇、语法、事实知识和一些推理能力
  2. 模式识别:它学会识别词语间的关系和上下文意义
  3. 生成文本:当你给它一个提示或问题时,它会预测最可能的后续文本

特点和能力

  • 规模巨大:现代LLM通常有数十亿到数万亿个参数(如GPT-4、Claude等)
  • 通用性强:不需要针对特定任务重新训练就能执行多种语言任务
  • 上下文理解:能够理解长文本中的上下文关系
  • 生成能力:可以创作文章、对话、代码、诗歌等多种内容
  • 少样本学习:只需几个例子就能理解新任务

常见应用

  • 聊天机器人和虚拟助手
  • 内容创作和写作辅助
  • 代码生成和编程辅助
  • 文档总结和信息提取
  • 语言翻译和知识问答

简单来说,大语言模型是一种能够”理解”并”生成”人类语言的AI系统,它通过分析海量文本数据学习语言模式,并能够处理各种语言相关的任务。正是由于它的规模和训练方式,使它具备了理解上下文、生成连贯文本、解决问题和模拟对话等能力。

4. AI模型评估与开发框架

AI模型的评价指标

  1. 准确率(Accuracy)

    • 定义:正确预测的样本数除以总样本数
    • 适用:分类问题,特别是类别平衡的情况
    • 局限:在类别不平衡情况下可能产生误导
  2. 精确率(Precision)与召回率(Recall)

    • 精确率:真正例数除以所有预测为正例的数量
    • 召回率:真正例数除以所有实际正例的数量
    • 应用:搜索引擎结果、医疗诊断等需要平衡查全率和查准率的场景
  3. F1分数

    • 定义:精确率和召回率的调和平均数
    • 特点:同时考虑精确率和召回率,对极端值敏感
    • 公式:F1 = 2 × (精确率 × 召回率) / (精确率 + 召回率)
  4. ROC曲线和AUC值

    • ROC曲线:以假正例率为横轴,真正例率为纵轴的曲线
    • AUC:ROC曲线下的面积,表示模型区分正负样本的能力
    • 数值含义:AUC为0.5表示随机猜测,越接近1表示模型越好
  5. 困惑度(Perplexity)

    • 定义:评估语言模型预测下一个词能力的指标
    • 计算:基于交叉熵,越低表示模型预测越准确
    • 应用:评估GPT、BERT等语言模型的训练效果
  6. BLEU分数

    • 用途:评估机器翻译或文本生成质量
    • 机制:比较生成文本与参考文本的n-gram重合度
    • 范围:0到1,越高表示越接近参考文本
  7. 推理速度与延迟

    • 测量:每秒处理的请求数或响应所需的时间
    • 影响因素:模型大小、硬件配置、批处理大小
    • 重要性:实时应用中的关键指标
  8. 参数量与计算复杂度

    • 参数量:模型包含的可训练参数数量,通常以亿(B)计
    • FLOPs:浮点运算数,衡量计算复杂度
    • 应用:评估模型规模和资源需求
  9. MMLU(大规模多任务语言理解)

    • 测试内容:涵盖57个科目的多选题
    • 价值:评估模型在不同领域的知识和推理能力
    • 应用:评估像GPT-4、Claude等大型语言模型
  10. 毒性与公平性评估

    • 毒性指标:评估模型产生有害内容的倾向
    • 公平性指标:评估模型对不同群体的偏见程度
    • 方法:使用特定的基准测试集和人类评估

流行的深度学习框架

  1. TensorFlow:由Google开发的开源机器学习框架

    • 特点:完整的生态系统,支持生产环境部署,TensorBoard可视化
    • 应用:大规模产品化AI服务,如语音识别、图像分类等
    • 适合:企业级应用和研究团队
  2. PyTorch:由Facebook (Meta) AI研究团队开发

    • 特点:动态计算图,直观的Python接口,更易于调试
    • 应用:学术研究,原型开发,尤其在NLP和计算机视觉领域流行
    • 适合:研究人员和快速迭代开发
  3. 其他重要框架

    • Keras:高级API,可在TensorFlow之上运行,简化开发流程
    • JAX:Google开发的用于高性能数值计算的库
    • Hugging Face Transformers:专注于预训练模型的库,尤其是NLP模型

数据与训练过程

AI模型的训练需要大量高质量数据和计算资源:

  1. 数据收集与处理:收集、清洗、标注和增强数据
  2. 模型设计:选择合适的架构和初始参数
  3. 训练过程:使用优化算法(如梯度下降)调整模型参数
  4. 验证与测试:使用独立数据集评估模型性能
  5. 部署与监控:将模型投入实际应用并持续监控性能

先进训练技术

  1. 迁移学习:利用在一个任务上训练的知识来改进另一个相关任务的性能。

  2. 微调:在预训练模型的基础上,使用特定任务的数据进行进一步训练。

  3. 对比学习:让模型学习区分相似和不同的数据样本。

  4. 强化学习与人类反馈(RLHF):使用人类反馈来指导模型行为,提高模型输出的质量和安全性。

5. AI应用领域与开发工具

alt text

这里有个我有些混淆的点,就是AI应用和AI Agent区别,单独拎出来说下:

AI应用

AI应用是指集成了AI技术的软件程序,通常为了解决特定问题或完成特定任务而设计:

  • 功能范围:通常专注于一个或几个特定功能(如图像识别应用、语音转文本工具)
  • 交互方式:用户提出请求,应用直接响应
  • 自主性:有限,主要按照预设的方式运行
  • 例子:智能照片编辑器、语音助手、自动翻译工具

AI Agent

AI Agent是一种更高级的系统,能够感知环境、自主决策并采取行动实现目标的AI系统:

  • 功能范围:能够执行多步骤任务,调用多种工具
  • 交互方式:可以理解用户意图,规划执行步骤,使用多种工具完成任务
  • 自主性:较高,能根据环境和反馈调整行动(反应能力、社交能力和主动性)
  • 例子:研究助手、客服代理、任务自动化

关键区别

  1. 自主决策能力

    • AI应用:按预定路径执行
    • AI Agent:可以自行规划和决策如何完成任务
  2. 工具使用

    • AI应用:通常使用内置功能
    • AI Agent:可以调用多种外部工具和API
  3. 状态维护

    • AI应用:每次交互可能是独立的
    • AI Agent:维护对话或任务的状态,记住上下文

在技术栈中的位置

alt text

正如之前的图表所示,AI应用处于技术栈的顶层,可以包含AI Agent作为其组成部分,也可以是更简单的AI功能实现。而AI Agent通常建立在大语言模型之上,使用特定的Agent开发平台构建。

本质上,所有的AI Agent都是AI应用,但不是所有的AI应用都是Agent。AI Agent代表了更高级、更自主的AI应用形式。

主流AI Agent和应用开发平台

  • Dify:开源的LLM应用开发平台,提供可视化界面和API接口

    • 功能:知识库管理、对话应用创建、数据标注
    • 适合:快速构建企业级AI助手和应用
  • Coze:微信团队开发的对话式AI平台

    • 功能:多场景机器人开发、无代码开发、多平台集成
    • 适合:社交媒体和聊天平台的AI助手开发
  • LangChain:开源的大型语言模型应用开发框架

    • 功能:链式处理、代理(Agent)、知识库集成、工具调用
    • 适合:开发者构建复杂的AI应用和工作流程
  • LlamaIndex:专注于数据连接和检索的框架

    • 功能:数据摄取、结构化、检索增强生成(RAG)
    • 适合:构建与私有数据交互的应用

自然语言处理应用

  • 聊天机器人与虚拟助手:如ChatGPT、Claude、Siri和小爱同学
  • 机器翻译:如谷歌翻译、DeepL
  • 文本摘要与生成:自动生成报告、文章和创意内容
  • 情感分析:分析社交媒体、评论的情感倾向

计算机视觉应用

  • 人脸识别:安防系统、手机解锁
  • 自动驾驶:感知环境、识别道路和障碍物
  • 医学影像分析:辅助诊断疾病
  • 增强现实(AR):叠加虚拟信息到真实世界

其他重要应用

  • 推荐系统:个性化电商、音乐、视频推荐
  • 金融科技:风险评估、算法交易、欺诈检测
  • 智能制造:预测性维护、质量控制
  • 科学研究:药物发现、蛋白质折叠预测、气候模拟

6. 生成式AI

什么是生成式AI?

生成式AI是能够创建新内容的人工智能系统,包括文本、图像、音频、视频等。它不仅能回答问题,还能创作各种内容。

文本生成

大型语言模型(如GPT-4、Claude等)可以:

  • 撰写文章、故事和诗歌
  • 创建对话和角色扮演
  • 编写代码和技术文档
  • 生成各种类型的商业内容

图像生成

基于扩散模型的AI系统(如DALL-E、Midjourney、Stable Diffusion)能够:

  • 根据文本描述生成高质量图像
  • 修改现有图像
  • 创建艺术作品和商业设计
  • 将草图转换为详细图像

音频与视频生成

  • AI语音合成:生成逼真的人工语音(如ElevenLabs)
  • 音乐生成:创作原创音乐(如Suno、MusicLM)
  • 视频生成:通过文本描述或图像创建视频(如Sora、Runway)

7. AI的伦理与挑战

伦理考量

  1. 偏见与公平性:模型可能继承训练数据中的偏见,导致不公平结果
  2. 隐私问题:AI系统的训练和运行可能涉及敏感个人数据
  3. 透明度与可解释性:深度学习模型通常被视为”黑盒”,难以解释决策过程
  4. 自主性与责任:当AI系统做出决策时,谁应负责任?

技术挑战

  1. 数据质量与规模:高质量训练数据的获取与处理
  2. 计算资源需求:大型模型训练需要大量计算资源
  3. 鲁棒性问题:模型在遇到分布外数据时可能表现不佳
  4. 安全与对抗性攻击:模型可能被精心设计的输入所欺骗

社会经济影响

  1. 就业变化:自动化可能改变就业结构
  2. 数字鸿沟:技术获取不平等可能加剧社会不平等
  3. 教育转型:教育系统需要适应AI时代的技能需求
  4. 信息真实性:生成式AI带来的深度伪造和虚假信息挑战

开源与AI民主化

  1. 开源模型的崛起

    • Llama系列:Meta发布的开源大型语言模型
    • Mistral AI:欧洲初创公司开发的高性能开源模型
    • Stability AI:开源图像生成模型的领先开发者
  2. 本地部署与私有化

    • 轻量级模型:适合在消费级硬件上运行的小型模型
    • 边缘计算:将AI能力部署到终端设备
    • 隐私优先:不依赖云服务的AI解决方案

应用前景

  1. 医疗健康:个性化医疗、疾病预测、药物发现加速

  2. 气候变化:优化能源使用、气候模型、环保解决方案

  3. 教育革新:个性化学习体验、智能辅导系统

  4. 太空探索:自主探测器、数据分析、任务规划

AI与人类协作

未来,最成功的场景很可能是人类与AI协作,而非完全替代:

  • 增强人类能力:AI作为工具,扩展人类的认知和创造能力
  • 互补优势:AI处理数据密集型和重复性任务,人类提供创造力、情感和道德判断
  • 共同演进:人类与AI技术相互适应,形成新的工作和生活方式

8. 如何入门AI学习

基础知识准备

  • 数学基础:线性代数、微积分、概率与统计
  • 编程技能:Python是AI领域最流行的语言
  • 计算机科学基础:算法、数据结构、计算复杂性

推荐资源

9. 结语

人工智能正在以前所未有的速度发展,从改变我们日常使用的应用程序到推动科学研究的前沿。无论你是对AI好奇的初学者,还是寻求深入了解的专业人士,了解AI的基本概念、技术和趋势都至关重要。

AI并非遥不可及的未来技术,而是已经深入我们生活的工具和伙伴。通过积极学习和理性看待,我们可以更好地利用AI的力量,同时规避潜在风险,共同创造一个技术与人文平衡发展的未来。

关键词说明

token

在自然语言处理(NLP)和大模型中,​Token(标记/词元)​ 是文本处理的基本单位,可以理解为模型“读懂”文本的最小片段。它的作用类似于人类语言中的“词语”,但具体定义更灵活,可能是一个单词、子词、标点符号,甚至单个字符。
可以看下chatgpt的Tokenizer:
alt text

B

在大模型(如GPT、LLaMA等)的命名中,”B”通常代表”Billion”(十亿),表示模型的参数量级。例如:

​13B → 130亿参数
​70B → 700亿参数
​175B → 1750亿参数(如GPT-3)

这个单位是衡量模型复杂度和规模的关键指标。参数越多,模型通常能力越强,但也需要更多计算资源和数据训练。这个参数直接影响模型的“知识容量”和学习能力,但并非绝对。模型性能还与数据质量、训练方法、架构设计等因素相关。比如咱们的DeepSeek跟chatgpt不就是一个典型的例子吗

大模型

大模型(Large Language Model, LLM)​是指参数量极大、训练数据量极广的深度学习模型,通常专指自然语言处理(NLP)领域的超大规模模型。它们的“大”不仅体现在参数规模(如千亿级),还体现在训练数据、计算资源和应用能力的突破性提升。

AI 幻觉​

AI 系统生成内容与现实事实或用户输入不符。原因包括数据缺陷(错误信息、偏见等)、训练过程局限(架构、推理、对齐问题)及推理随机性等。常见于大语言模型,影响输出可靠性。​​​幻觉​​是模型缺陷,需通过​​RAG检索增强​​或​​微调​​减少。

模型蒸馏​

把复杂大模型(教师模型)知识迁移到简单小模型(学生模型),让小模型以低计算成本模仿大模型性能。用于在资源受限场景部署模型,如智能家居设备的AI应用。​

模型微调​

在已训练好模型基础上,针对特定任务或数据集调整,提升模型在该场景的性能。例如医疗领域。

离职系列 第一篇
离职系列,想想这几年在公司的成长,在这做个记录。此为第一篇,源于调我去成立LMT团队,领导只给了我一个大概的设想,要我出一个详细的团队方案然后找他门评审。

以下是我写方案时的构想框架:

一、背景与目标

  1. 团队背景
    1. 团队的来源与设立目的。
    2. 需要解决的问题或推动的关键目标。
  2. 团队使命
    1. 团队存在的核心价值与对整体目标的贡献。

二、问题分析

  1. 现状是什么?
    1. 最好有数据依据,因为多数情况下领导只是发现了痛点但是缺少事实数据,最好是能让他们瞬间眼神清澈的数据
  2. 遇到的困难是什么?痛点是什么?
  3. 利益相关方以及领导最关注的是哪些问题?

三、怎么解决问题?

  1. 明确职责与边界
    1. 问题域:团队负责解决的具体问题范围。
    2. 责权划分:
      1. 职责(责):明确OKR,定义团队目标和绩效考核标准。
      2. 权利(权):所需资源、流程机制、跨团队支持及领导背书。
  2. 团队的OKR?「责」
    1. 责的具体体现,绩效考核的基准
    2. 画两根线
      • 及格线:用于兜底,反映团队最低价值(如拦截率≥60%)
      • 优秀线:有挑战性的,激励团队创新与突破(如拦截率≥90%)。
  3. 需要的支持是什么?「权」
    1. 流程机制,如问题的处理流程、故障覆盘流程、奖惩制度等
      1. 我当时写了现场故障流转、复盘等流程
      2. 事故定级及奖惩制度
    2. 其它团队的支持
    3. 领导背书
      1. 团队成立了缠着研发的老大拉着100号左右的研发开了一个同步会
      2. 跟领导申请了悬赏榜,研发和LMT都可揭榜提交故障处理文档,定期决出最有价值的文档,奖金2000元
    4. 工具
      1. 比如Jira系统的定制、流程系统的改造等
  4. 团队成员的画像是什么?
    1. 团队成员应具备的核心技能或特质。
      1. 比如技术只是一方面,协调沟通能力,情绪控制等同样重要。
    2. 人员配比是怎样的(不要贪多)
  5. 问题解决的标准是什么?
    1. 解决问题的定义:如何界定问题被有效解决?避免扯皮
      1. 比如故障状态到”已验证“。
    2. 标准化流程:建立问题分级和对应的解决机制。
      1. 比如我们问题分类为Blocker、Major、Normal、Minor,对应的SLA响应时效为30分钟、2天、5天。
  6. 怎么提升问题处理效率?
    1. 知识库建设:沉淀经验,复用最佳实践。
      1. 我们用飞书知识库沉淀了100+的文档,最终抽象成10+直接给到了一线服务团队做FAQ,有效的增强了一线服务团队的故障处理能力。
      2. 同时也增加LMT的问题处理效率,特别是共性问题。
    2. 专家培训与组内分享:提升团队整体能力。
      1. 对于较复杂深奥的模块或场景,我专门做了一张培训计划表,协调各专家以及各模块的核心研发,安排30~60分钟一场的培训,增强LMT成员的专业性以及故障处理能力
    3. 定期复盘:从故障和问题中总结经验,优化流程。
      1. 该活动重要性很高,但是要注意尺度(不能太多、不能搞针对),我当时定的是单双周固定时间,单周挑需要复盘故障单1~2个单子,,双周正式复盘。
      2. 参与的角色必须是核心利益方的核心人员,比如测试leader、研发leader、项目管理leader、当事人参加

四、 团队运营与管理

  1. OKR管理
    1. 制定、跟踪并动态调整个人与团队的OKR。
  2. 收集成员诉求,定期反馈并提供激励措施。
  3. 会议与沟通机制
    1. 站会、周会等例会形式,聚焦目标和风险。
  4. 过程跟踪:识别风险并提前解决。
  5. 绩效管理
    1. 基于OKR的绩效评分,保证透明与公平。

数据驱动的优化与评估

  1. 数据化呈现问题现状与解决成果。
    1. 我们当时用python+vue+pg,接入Jira系统,把现场缺陷数据按各种维度拉出来实时图表,一个是给各方有直观的数据,另一方面可作为团队OKR以及成员OKR完成情况的跟踪
  2. 持续优化
    1. 评估流程和机制的效果,不断改进工作方法。
    2. 工具支持:选择合适的工具简化流程提高效率等。

使用说明

灵活调整:根据团队的具体需求,扩展或精简上面模板的内容。
数据支持:所有分析和建议应尽量基于数据,以确保决策的客观性。
定期复盘:结合实际运营情况,每隔一段时间评估执行效果并优化。

背景

实现跨数据库数据的联邦查询需求,我主要负责整合需要的数据和表,另一个同时负责Redis里扩展模块。

解法设计

技术架构图

alt text

时序图

alt text

经历了一轮裁员后,焦虑了,想着提升提升自己。

英语虽然说一直在学,但是没有很严格的要求自己。刚好借着这波伤害把英语严格要求起来。

知识星球

专门开了个知识星球,就弄给英语相关的,同时也在公众号上把英语记录起来。

旨在学习英语,只包含英语学习相关的内容。

我日常学习英语的方式:

  1. 早晨7点半起床,送完孩子后开始听力20~30分钟
  2. 晚上下班写一篇英文学习的公众号20~30分钟
  3. 跟chatgpt用英文交流10~20分钟,可以选择一个小场景也可以根据白天学习的内容自由发挥

学习工具:

  1. 参考资料:
    1. https://vvyst0z7tes.feishu.cn/wiki/HQuawZepyiwNiNkImw6c00IXnmc?from=from_copylink
    2. https://1000h.org/
  2. 播客(纯英文的),youtobe music,apple 播客
  3. chatgpt
  4. LongMan Dictionary

公众号

遇见系列 第五篇

现场的应用A pod一段时间就会重启,用k8s命令看pod是因为超出limits。

查看了gc日志。因为使用的是G1回收器

让我详细解释G1 GC的工作流程:

内存分区:

整个堆内存被划分为大小相等的Region(默认2048个)
Region大小是2的幂次方,范围从1MB到32MB
每个Region可以是Eden、Survivor、Old或Humongous区
Humongous区专门用于存储大于Region大小一半的对象

GC周期的四个主要阶段:

a) 初始标记(Initial Mark)- STW:

标记所有直接从GC Roots可达的对象
这个阶段需要Stop-The-World(STW)
通常和年轻代收集同时进行
时间很短

b) 并发标记(Concurrent Mark):

遍历整个堆的对象图
标记所有可达的对象
与应用程序并发执行
使用SATB(Snapshot-At-The-Beginning)算法
记录标记期间的引用变化

c) 最终标记(Final Mark)- STW:

处理并发标记阶段遗留的SATB缓冲区
完成最终的标记工作
需要STW,但时间较短

d) 筛选回收(Live Data Counting and Evacuation)- STW:

计算各个Region的垃圾比例
根据用户期望的停顿时间建立回收集合
优先回收价值最大的Region(垃圾最多)
将存活对象复制到新的Region
清空旧Region

特殊处理:

a) 年轻代收集:

当Eden区满时触发
只关注年轻代Region
存活对象复制到Survivor区或老年代

b) 混合收集:

同时回收年轻代和部分老年代Region
根据全局并发标记的结果
老年代Region按垃圾收集价值排序

优化机制:

a) Remembered Sets(Rsets):

记录跨Region的引用关系
每个Region都有一个RSet
避免全堆扫描

b) Collection Sets(CSets):

需要被回收的Region集合
基于垃圾占比和期望停顿时间选择

正常GC流程:

Young GC:回收年轻代Region
并发标记周期:标记整个堆的存活对象
混合回收:回收年轻代和部分老年代Region

Full GC触发条件:

并发标记完成之前就出现内存分配失败
回收后的空间仍不足以支持下一次Young GC(空间担保失败)
混合回收后仍无法满足内存需求
Humongous对象分配失败

Full GC的特点:

必须Stop-The-World(STW)
对整个堆进行压缩和整理
单线程执行,停顿时间长
会明显影响应用程序性能

Full GC后的处理:

如果Full GC后内存足够,应用继续运行
如果Full GC后内存仍然不足,抛出OutOfMemoryError

避免Full GC的建议:

合理设置堆内存大小
调整并发标记的触发阈值
适当调整Region大小
控制大对象的产生
及时进行并发标记,避免内存耗尽

Full GC在G1中的具体执行步骤:

  1. 标记阶段(Marking Phase):
  • 进入STW阶段,停止所有用户线程
  • 从GC Roots开始进行全堆标记
  • 标记所有存活对象
  • 使用单线程进行标记,效率较低
  1. 清理阶段(Cleanup Phase):
  • 清理所有未被标记的对象(垃圾对象)
  • 回收空的Region
  • 重置各种元数据信息(RSet等)
  • 计算所有Region的存活对象信息
  1. 压缩阶段(Compaction Phase):
  • 对存活对象进行压缩整理
  • 将存活对象复制到新的Region
  • 按照新的分代布局重新整理对象
  • 更新对象引用关系
  • 释放旧的Region
  • 重建RSet等辅助数据结构

特点:

  • 整个过程完全STW
  • 单线程执行,性能较差
  • 会对整个堆内存进行处理
  • 会导致较长时间的停顿
  • 会破坏原有的分代结构,需要重新构建

触发Full GC通常意味着:

  • 内存分配压力过大
  • 并发收集来不及回收内存
  • 可能需要调整GC参数或应用程序代码

如何管理自我

成大事无捷径

笨功夫才是真功夫,没有快乐学习这一说法

如何平衡工作和生活

有所逼
有所专

  • 临事静对猛虎,事了闲看落花。
    有所规
  • 要立规矩,既要规范自己也要规范别人。
  • 你要让周围的人知道并遵守,久而久之,会享受到它带给你的福利。
  • 有所规划,多做计划。

有所贪

  • 早做夜思,以求有济。
  • 用平常心处世,用进取心做事。

真正的猛人

怎么区分是不是真正的猛人

  • 看他的凶猛是对自己还是对他人

    • 真正的猛人,对他人的要求自己肯定能做到甚至做得更好。
  • 从事情来判断。真正的猛人,他的凶猛和决绝是对事的。

    • 真正的猛人把事放在人之前,而不是看对自己爽不爽。
  • 真的猛人追求不一样

    • 经常说起的自律、怎么如履薄冰等而不是吹牛,自己怎么怎么厉害

猛人修炼方法:敬、恒

三不朽:立言、立功、立德

  • 敬:是敬天悯人,尊重常识和积累,尊重事,不走捷径。
  • 恒:在对事上坚持投入时间和精力,长期主义。

做自己熟悉的行业

  1. 做擅长的事容易成
  2. 在主业做到顶尖
    1. 先知道100个关键词
    2. 找到三五个专家,跟他们谈上半天到一天。
    3. 找到三五本专著,仔细的看完。
    4. 价值最大化

掌控情绪

如何对待妒忌和贪婪

  1. 不害人
  2. 要宽容

如何战胜自己,战胜逆境

  1. 看脚下
    1. 现金流
    2. 核心“上下游”
  2. 不断行
    1. 把自己稳定之后,不要停止努力,无论是在生活上还是在工作上。
    2. 多做推功揽过。
    3. 做一分算一分,在一日撑一日。
  3. 莫存顺逆
    1. 不要两分的看所谓的逆境。无论顺逆都是生活的一部分,都是正常的日子。

如何战胜自己,战胜逆境

  1. 真正的高手都有破局思维
    1. 在逆境中要考虑事在人为。

有时候“不努力”是种正确的战略

  1. 战略方面,重要的是要认命

  2. 从战术的角度,有时候需要你收敛

    1. 如果你有太强的目的性,很有可能遭到别人的反感。
    2. 你有可能跑的太快,遭到别人的妒忌。
    3. 长期过分努力做事,会遭到非常严重的抵抗。
  3. 不着急缓称王,是一种正确的态度。

可以不屠龙,但不能不磨剑。
能打仗、能力站、能快跑的时候,请力战快跑成事。
获得某个细分领域最多的知识和最高的智慧。

选择不仅仅是断舍离

养成好习惯

摒弃”身心灵“,在现实中修行

  1. 如何在现实中修行,珍惜每一个不舒服和难受。
  2. 真正的修行是忍耐、自强。

以笨拙为本分,求仁得仁

怎么通过拯救睡眠实现人生逆袭

分清欲望和志向

  1. 如何管理欲望

    1. 尊重欲望,尊重自己的好胜心
    2. 中庸
  2. 构建自己的乐园

如何应对年龄危机

  1. 锻炼好身体
  2. 在一个好身体的基础上,持续修炼。
  3. 衰年变法
  4. 做减法,减少无效社交。
  5. 减少日常花销
  6. 认怂,退居二线
  7. 回归生活

人人都该懂战略

什么事战略:战略是一套完整的行动方案。这套完整的行动方案包括:何处竞争、如何竞争、何时竞争

  1. 小公司通常不用做
  2. 为什么要做战略:上下同欲,少走弯路。
  3. 大处着眼,小处着手。

领导力

  1. 是否能成事,能够持续多成事。

  2. 抓大放小,容人,定方向,这是种小公司的领导力构成。

  3. 终极领导力,最终还是看个人的能力,危机时,只有自己靠得住,靠不了其他人。

    1. 团队在强只是辅助
  4. 不着急、不害怕、不要脸

    1. 不着急:对时间
    2. 不害怕:对结果
    3. 不要脸:对评价

职场沟通规范

多条理,少大言

  1. 倾听

    1. 在表达自己之前,先问三个问题:
      1. 你对于这个问题是怎么想的?
      2. 为什么这么想?
      3. 有没有其它解决办法?
  2. 在倾听的基础上,理解别人的诉求

    1. 了解清楚背景,站在对方的角度
  3. 开放

    1. 不要预设答案,不要预设解决方案。
  4. 平等

  5. 多条理

    1. 金字塔原则
  6. 少大言

    1. 越具体越好。
      1. 情况是怎么样的?原因是什么?结论是什么?希望解决的具体的措施是什么?
  7. 创造一个良好的职场沟通环境

  8. 就事论事

    1. 避免情绪化
  9. 可长可短

    1. 沟通时间
  10. 职场沟通多讲事实,少讲个人喜好。

  11. 交流时不要庞杂。

    1. 交流就交流,别看手机之类的
    2. 也不要在比较累的时候
    3. 找对方最好交流的状态
  12. 在职场交流中减少使用口头禅

  13. 在职场中交流少情绪化。

    1. 记住如果这股火撒出去,一定是对这件事情有害的。把火压下去,用更低更缓慢的声调来讲。

带团队的四条铁律

    1. 平时做不到的,战时一定也做不到。
    1. 从团队成员出发,知道他们在想什么,放手让团队去做。
  1. 势力

    1. 大局、实战
  2. 理想

算法与数据结构 第一篇
最近在看《数据结构与算法分析-第三版》,记录下解惑时刻。
  1. 指数
  2. 对数
  3. 取模
  4. 阶乘
  5. 归纳法
    1. 基准值
    2. 归纳假设
  6. 反证法
    1. 假设定理不成立,然后证明该假设导致已知的性质不成立。
  7. 递归

场景

处理了一个现场问题,现场部署了多个agent但是就一个agent离线。

agent是部署在单独的服务器A上,且使用docker部署,该agent需要与另外一台服务器B通信,当前的状态即是无法通信。

agent->docker->服务器A->….->服务器B

思路

先搞清楚请求要从agent到服务器B是个什么过程,找出其中的关键环节,逐个排查。

容器B中的某个服务程序(比如web服务器)需要向服务器C发送数据。它会调用socket接口,传入目标地址等信息来生成数据包。
数据包被传递给容器B的网络堆栈。该堆栈会为数据包添加上以太网头(包含源MAC、目标MAC等),然后发送到容器的虚拟接口veth pair。
veth pair会将数据包传递给Docker主机的网络命名空间。这里包含一个Bridge接口docker0。
docker0收到数据包后,查找路由表,确定应该通过主机的物理接口eth0发送。
数据包被传递至主机的网络协议栈,这里会为数据包添加物理层头信息(比如Ethernet II头)。
添加完头信息的数据包通过主机的物理接口eth0发送出去。
数据包到达主机所在物理网络的交换机,交换机根据MAC地址转发到路由器。
路由器剥离二层头信息,查找三层信息,确定应向ISP上的默认网关发送。
在各个ISP路由器之间,重复着提取IP头,查询路由表,转发的过程。
最终数据包到达服务器C,服务器C的网络栈处理数据包,将其传递给目标服务。

在Docker容器的网络中,还存在一个默认网关,它是容器访问外部网络的桥梁。

当容器B的网络栈处理数据包时,会查看目标IP是否在容器内网段:

如果目标IP在容器内网段,则直接通过veth pair发送给docker0。
如果目标IP不在容器内网段,则需要先发送给容器的默认网关。
容器的默认网关其实是一个在主机网络命名空间内的虚拟接口,IP地址属于docker0子网,比如172.17.0.1。

所以数据包的流程可以补充为:

容器B网络栈 -> 容器默认网关(172.17.0.1) -> docker0 -> eth0

默认网关负责帮助容器正确地将数据包发送到外部网络,从而实现网络访问。

可能的问题点

  1. 容器内默认路由未正确设置
    容器需要有默认网关来路由外部网络的访问。如果默认路由未设置或设置错误,可能导致容器内无法访问外部网络。

  2. docker0桥接问题
    docker0是连接容器和主机网络的桥梁。如果docker0配置错误,无法正确转发容器的数据包,会造成网络访问故障。

  3. 容器访问外部网络规则问题
    可能由于iptables等防火墙规则错误配置,导致容器无法访问外部特定网络或端口。

  4. 容器网络命名空间隔离问题

排查

查了下agent所在的服务器与主业务是能telnet通的,但是进入agent容器内部则不行,不管是ping还是curl都不行。

首先怀疑容器的网络配置可能存在问题。检查容器的网络设置,先后检查了iptables、DNS、检查默认路由都没有异常。又因为容器外能访问,且该agent与其它2、3个agent属于同一个子网下,所以也侧面证明了,服务器的网络配置确实没问题。

那接下来基本确定是docker网络配置的问题了。

基于nsenter,验证网络问题,发现确实存在网络问题,ping docker默认网关不通。

现场反馈更新过agent的网络地址,随即检查daemon.json 、docker-compose.yml文件

发现docker-compose.yml内定义的subnet为16为子网掩码,而daemon.json为24位子网掩码,

因为16比24的IP范围大,这种情况下,容器获得的IP地址可能不在docker-compose网络的子网范围内,从而无法连接到该网络,造成网络通信失败。

解决方案:

将docker-compose.yml和docker daemon中的子网掩码设置为相同。例如都使用24位子网掩码。