目录

一、项目概述

二、数据爬取及处理

三、构建知识图谱

四、应用开发:智能问答

五、Django+Echarts实现可视化

六、总结

一、项目概述

本文搭建知识图谱使用技术有:

  • 爬虫技术
  • Neo4j图数据库
  • Django框架
  • Echarts可视化库
  • Lac词法分析工具

整体结构

阅读全文 »

目录

一、语法规范

二、声明定义与作用域

三、指针专题

四、类型转换

五、常用函数方法

六、输入输出

七、STL使用相关

八、面向对象

九、泛型编程

十、内存分配

十一、编译相关

十二、C++11新特性

十三、待解决问题

附:C语言函数

一、语法规范

  1. C++中主程序要写成
    1
    2
    3
    int main(){
    return 0;
    }
    不能写成void main,这是不规范的有些g++编译器会报错,return 0表示已经执行完成了

且C++规定:不明确标明返回值的,默认返回值为int,也就是说main()等同于int main(),但会被警告

阅读全文 »

目录

TPL部分

推荐部分

当前工作

TPL部分

推荐部分

1.协同过滤算法(CF)

  • 两种思路
    • 基于用户UBCF:以用户为主体,挖掘用户与用户之间的相似性,将与某用户相似的用户购买的物品推荐给该用户
    • 基于物品IBCF:寻找与该用户购买的物品相似的物品来之间推荐
  • 核心步骤:计算相似度,一般用余弦相似度或皮尔逊相似度
  • 针对协同过滤构建的共现矩阵稀疏度较高的缺点,用矩阵分解来解决
    • 通过分解共现矩阵为每一个用户和每一个商品生成一个隐向量
    • 向用户推荐距离近的商品
    • 具体步骤
      • 矩阵分解就是把一个mxn的共现矩阵,用梯度下降分解成一个mxk的用户矩阵和kxn的物品矩阵相乘的形式,
      • 用户隐向量和物品隐向量就分别是对用户矩阵的行向量和物品矩阵的列向量
阅读全文 »

目录

基础概念

云产品

解决方案

基础概念

云计算模式:IaaS、PaaS、MaaS
● IaaS:基础设施及服务,云服务器ECS、云盘EBS、私有网络VPC
● PaaS:平台即服务,人工智能平台PAI、容器服务ACK
● MaaS:模型即服务,百炼、API调用

HDFS:分布式文件系统,A机器硬盘->内核缓冲区->A网卡
● 普通文件传输需要:A机器硬盘->->内核缓冲区->JAVA内存(用户态)->网络Socket缓冲区->A网卡
RDMA:阿里云Lunar网络的技术核心,A机器内存->A网卡->B网卡->B机器内存

Milvus:开源向量数据库

SLB/ALB:负载均衡

云产品

基建

ECS:云服务器,E是elatic表示弹性

ACK:容器服务,负责管理各种容器

VPC:专有网络,保证ECS、数据库等都在一个私有的局域网内,外网进不来也看不到

存储

OSS:对象存储,可以看作是一个大型网盘,只能根据名字存和取整个文件,不支持检索操作

EBS:块存储,可以看作是ECS上的一块可插拔硬盘(ECS本身还有一个本地硬盘,插在ECS物理机上的),需要和一个共处一个可用区的ECS绑定(可解绑切换到其他ECS上,数据不会丢失),只有该ECS可以访问EBS,比OSS的http传输快(阿里云自研的 Lunar 网络,使用了 RDMA 技术)

NAS:网络附属存储,可以看作一个网络共享文件夹,可以挂载到多个ECS,每个ECS的Linux系统里都视作一个本地文件夹,写操作会加文件锁,阻止其他机器写

数据库

RDS:关系数据库(支持MySQL),适合业务增删改查

PolarDB:云原生数据库,RDS升级版,计算和存储分离,支持毫秒级弹性扩容和海量数据存储

Tair:高性能内存数据库(兼容Redis),支持极高并发访问,适合缓存和热点数据

DashVector:向量数据库

Lindorm:云原生多模数据库(兼容Hbase),适合大量数据存和读

ODPS:离线表,适合做数据分析,可以看作是阿里自研的Hive

AI平台

PAI:PaaS人工智能平台,为训练、微调模型设计的平台

  • DSW,本质是一个notebook,可以直接远程在网页上用Pytorch写transformers代码
  • DLC,本质是一个任务调度器,可以将一个训练3天的任务提交给他,自动找显卡去执行
  • EAS,本质是一个包装对端接口的生成器,把微调好的模型交给他,会自动生成一个供前端调用的URL,自带负载均衡请求量大了自动加显卡

百炼:MaaS,对外提供千问模型调用入口,也包含简化操作的微调模型和RAG实现

解决方案

1.获得微调模型的三种模式

  • 极客模式IaaS:
    • 配置环境:购买带GPU的ECS、装vLLM、PyTorch环境
    • 训练:使用transformer、QLoRA在SFT数据集上微调模型
    • 部署:写LlamaIndex代码连接数据库为模型提供RAG能力,写后端接口接入模型
  • 开发者模式PaaS:
    • 训练:在PAI-DSW用QLoRA微调模型,并把任务传给PAI-DLC调度运行
    • 部署:将微调好的参数传给PAI-EAS,自动生成调用API
  • 商业模式MaaS:
    • 训练:上传数据集可视化微调
    • 部署:训练或微调后会自动获得api key和end point

2.云计费模式

  • 按量计费,按流量计费,比如网络流量,比如DashVector查询了多少次
  • 按服务器计费,比如一台2核4G的服务器一年多少钱

目录

基础概念

LLM应用

基础概念

训练:前向计算+反向传播(算梯度、更新权重)

推理:前向计算

微调:使用预训练模型在带标注的数据集上训练,过程中算法工程师主要关注loss曲线和LR

  • 全参数微调Full Fine-tuning,FFT:重新训练预训练模型的所有参数
  • 低秩自适应LoRA(Low-rank adaptation):原有预训练模型参数不变,新增参数,训练过程只改变这些新挂接的参数。Transformers的LoRA库是PEFT
    • QLoRA:把原有的预训练模型参数压缩,原本一个数字用16-bit存,现在只用4-bit存。Transformers库是BitsAndBytes

token:词块,并不等同于最后生成的答案,例如“人工智能”这 4 个字。优化好的模型(如 Qwen)可能会把它识别为 1 个 Token;而没优化的模型可能会把它拆成 4 个甚至更多 Token。并且符合、空格换行等也算token,或者一个生僻字可能会被拆成多个音节,那么它就占了多个token。(api调用的大模型返回completion_tokens代表该回答使用了多少token)

双向:模型能看到之前和之后的词。训练方式为把中间的词mask,然后让模型根据前后的词预测。BERT
单向:模型只能看到之前的词。给前3个词,让模型预测第4个词。也是模型生成能力的来源,GPT、qwen、Llama

分词器tokenzier:将自然语言翻译成大模型能理解的机器语言

  • 切分:将句子切成一个个块,例如”大模型”可能会被切成”大”和”模型”
  • 映射:给每一个词按照词典映射成一个ID,例如”模型”->[121, 108]
  • 还原:LLM输出数字后,将数字还原成文字

损失函数loss:微调的目标是为了让模型生成的答案更接近SFT里的output,loss函数就是用来衡量生成答案和output之间差距的尺子。一个微调训练必须有一个损失函数,其会在正向计算结束后立即介入

学习率LR:损失函数计算出梯度(误差的方向和大小)后,需要乘以学习率才是最终模型参数需要挪动的距离。即学习率越高,参数更新越大

  • 当前业界一般采用动态学习率,例如在刚启动训练时学习率需从0缓慢升到设定值(预热)

温度Temperature:惊喜值,控制随机性和创造力,越高答案越随机,越地答案越准确
maxToken:给生成的回答设定的物理上限,控制长度、节约成本、防止死循环

Transformers:Hugging Face开发的一套Python库,把复杂的深度学习模型架构(BERT、GPT、Llama、Qwen)进行了封装,同时支持PyTorch和TensorFlow,在没有这个库之前想要使用BERT需要写上几百行代码,现在只需要3行就能调用BERT这个世界顶级的预训练模型

自注意力机制:一个词在理解自己的同时,能自动地看向句子中其他的词,从而更确定自己在当前语境下的含义。在Transformers中自注意力机制是,每一个字(token)会被转化为三个向量,Query、Key、Value
以”小明骑自行车”中的”小明”为例

  • Q:”我要去找一个动作,看看我做了什么”->在句子中找到了”骑”的K符合要求
  • K:”我是主语、我是名词、我是人”->句子中的其他字,例如”骑”的Q在找主语时会匹配到这个K
  • V:”我是具体叫小明的那个人,我有头发 我身高165 是个学生”,其他Q匹配到这个K时,模型就会把这个V提取出来,融合到最终理解中

AutoModel:Transformers库里的工具,只需要传入模型名,自动去匹配加载对应模型
Hugging Face:社区,Transformers项目诞生地,也是全球最大的AI模型库,包含模型权重、数据集和demo

LangChain:python的开源库,也是一种思想。当前业界常见做法是编排和智能共存,即部分步骤用人为写好的编排,部分步骤交给Agent规划

  • 零件层:手动拼接字符串Prompt、构造发送http请求、解析LLM返回的JSON等脏活、RAG的实现(和LlamaIndex功能一样)
  • 编排层:人为制定好流程,步骤1->步骤2->…..
  • Agent智能层:告诉模型自然语言,让模型自动去规划编排步骤。

深度学习框架:PyTorch(统治地位)、TensorFlow(传统,C++支持较好)、JAX(谷歌最新推出,性能好),提供底层的数学计算能力,大模型的本质是矩阵计算和求导,如何把数据传给显卡让其计算、利用GPU的CUDA核、管理显存、计算梯度并更新模型参数这些最脏最累的活都由深度学习框架来做,还有比如多张显卡来实现分布式计算这种操作也由其管理

Map-Reduce策略:将执行内容分割成一个类似map的结构,map的每个key对应部分执行内容,分别执行完成后再汇总。常用于RAG文档过长,导致模型上下文窗口无法完全载入使用。

vLLM:在用户和LLM展开会话时,为了记住之前的对话内容,需要把这些内容放在显存里,比如Pytorch会为每次请求预留一大块连续显存。vLLM参考操作系统的虚拟内存思想提出了分页注意力机制,将KV cache拆成一个个分页,哪里有空间就塞到哪里,提高显存利用率,并且在用户针对某一个文章重复提问时,可以重复利用
● 比起pyTorch原生的批处理(同时来4个请求,需要4个都生成完答案才能返回),vLLM可以一个请求结束就空出位置,给下一个请求计算,保证显卡不空转

KV Cache:大模型的推理过程是,输入”你好吗”,根据”你好吗”->预测出第一个字”我”,根据”你好吗 我”->预测出”我很”……最后得出回答”我很好”。处理每个字都会产生K和V两个关键矩阵,KV Cache作用就是把之前已经计算出来的KV做缓存,避免后续重复计算。所以KV Cache能极大地提高推理速度,但是很吃显存,和算法题一样用空间换时间

  • 原理在于“你”中你的KV和“你好吗”中你的KV是一模一样的

微调用标注数据集:用于微调用的数据集,微调过程就是让大模型根据指令instruction+输入input生成回答,然后一次次地调整参数让大模型生成的回答概率上更接近于输出output

1
2
3
4
5
{
"instruction": "请把下面的话翻译成英文。",
"input": "今天天气真不错,我想去公园散步。",
"output": "The weather is really nice today, and I want to go for a walk in the park."
}

MoE混合专家架构:传统模型在一个推理进来的时候会经过所有的参数计算,也叫Dense稠密模型,MoE模型是在神经网络每一层不视作一个矩阵,而是多个小矩阵,每个推理过此层时根据router判断只激活相关的小矩阵去进行计算

  • 优点:时间换空间,保证生成质量的同时推理速度快
  • 缺点:显存占用依旧大,需要将完整的参数放进显存;进行LoRA微调后可能会出现路由坍塌(例如:所有的token在某层只去激活特定的几个矩阵,导致57B模型效果退化为7B)
    • 路由坍塌的解决办法:负载均衡,强制router把流量均匀分给各专家,或者LoRA只微调新增参数部分

LLM应用

1.LangChain框架:模块化的框架,用于将LLM与其他组件(数据源、代理等)相结合来实现一个完整应用

  • Agent:LLM结合工具实现多步推理和行动
  • Chain:顺序执行多个组件(如Prompt+LLM)
  • Loaders:从各种数据源加载数据
  • Prompts:管理和构建发给LLM的提示
  • Memory:在多轮对话中保持上下文记忆
  • Retrieval:从外部知识库检索信息

2.检索增强生成RAG:一种思想,根据私有文档丰富大模型知识的技术,解决大模型训练完成后无法获取新知识的弊端

  • 检索:根据用户提问到文档库里找到相关的一部分知识
    • 进阶版可以加上精排,例如对检索到的结果,用Rerank模型根据用户的提问进行重排序
  • 增强:将这部分知识塞进用户的提问中
    • 例如:比如用户问:“我下周能请假吗?”会把搜到的《公司请假制度》里的那段话塞进去。
  • 生成:LLM看到用户提问+检索到的知识生成回答
    LlamaIndex:Python的开源库,RAG的具体实现
  • 加载、清洗
  • 切片:固定500个字符切一次、尽可能保留完整性以/n为分隔符切、每次切片保留上次切片末尾的50-100字符重叠来保证连贯性
  • 打标签:为每个切片标记来自于原始文档哪个位置(给每个向量新增一个元数据,最后一起放进向量数据库里)
  • 向量化:使用预训练的词嵌入模型来做
  • 入库:存入向量数据库,向量、对应文本、元数据都放入向量数据库

3.一个完整的Agent包括以下部分

  • 大脑LLM
  • 记忆Memory
  • 工具Tools
  • 规划Planning