news 2026/9/18 16:15:34

人工智能核心技术有哪些?机器学习、知识图谱与语音交互实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
人工智能核心技术有哪些?机器学习、知识图谱与语音交互实战

简介:这份PDF文档围绕「人工智能的核心技术」展开,依据《人工智能标准化白皮书(2018)》的框架,面向人工智能入门学习者、备考人员及需要梳理知识体系的从业者,解答AI核心技术包含哪些内容这一问题。文档以机器学习为主线,逐一讲清监督学习、无监督学习与强化学习三种模式的原理、典型算法与落地场景,并对比传统机器学习与深度学习在可解释性、有效性上的差异,同时介绍TensorFlow、PyTorch等主流开源框架的定位。内容还延伸至知识图谱的实体—关系—实体结构及其在搜索、反欺诈中的应用,以及自然语言处理中的机器翻译等方向,并补充迁移学习、主动学习与演化学习的思路。资源为1个PDF文件,约318KB,篇幅精炼、脉络清晰,适合作为概念速查与体系梳理的轻量读物,已有220人学习。

1. 从《人工智能标准化白皮书(2018)》看七项核心技术的骨架

很多人下载这份《什么是人工智能的核心技术?》PDF,扫两眼标题就丢进资料堆,觉得无非是一份概念科普。真翻进去会发现,它其实是把白皮书里那份技术清单拆解开了:机器学习、知识图谱、自然语言处理、人机交互、计算机视觉、生物特征识别、虚拟现实/增强现实,七块内容边界清楚,每块还带着分类判据和关键难点。这份文档资料最有价值的地方不在名词解释,而在它给出的分类逻辑——按学习模式切机器学习,按抽象层次切图像理解,按信息交换方向切人机交互,这些切法直接决定了你后面选模型、选框架、定阈值的动作。做 AI 应用的人常犯的错是先挑框架再想问题,顺序反了。这份白皮书式的骨架适合两类人:一类是要做技术选型、需要一张全景图把散点连成线的人,另一类是被各种框架文档绕晕、想先搞清概念边界再去写代码的人。下面按这份文档的七块内容,一块块落到能跑的命令和能改的参数上。

2. 机器学习三种学习范式与 scikit-learn 最小复现

2.1 监督、无监督、强化学习的分界是数据形态而非算法

白皮书按"学习模式"切分机器学习,这个切法在工程上很实用。决定用哪一类,看的不是你想解决什么问题,而是手上有没有标签、能不能和环境反复交互。监督学习要求训练样本的分类标签已知,标签精度越高、样本越有代表性,模型准确度越高;无监督学习不需要人工标注,靠未标记数据里的内部结构吃饭;强化学习连"标准答案"都没有,只有环境返回的奖赏信号,智能体必须靠自身经历去逼近从状态到行为的映射。

范式数据要求典型算法主要评估指标常见落地场景
监督学习带标注样本逻辑回归、SVM、决策树、KNN准确率、F1、AUC垃圾邮件侦测、文本分类、手写体辨识
无监督学习无标注样本KMeans、DBSCAN、PCA、单类密度估计轮廓系数、重构误差异常检测、市场分割、集群调度
强化学习可交互环境 + 奖赏函数Q-Learning、PPO、DQN累计回报、收敛步数机器人控制、下棋、工业控制

选型时最容易踩的坑是拿无监督的聚类结果当分类结论直接上线。聚类只能用来说明"这批数据里存在结构",至于每个簇对应什么业务含义,还得回到人工确认那一步。

2.2 用 scikit-learn 跑通监督与无监督的最小闭环

下面这段代码把两个范式压在同一份数据上,便于直观看到"有标签"和"没标签"的差别到底有多大。

# 监督路径与无监督路径的最小对照实验 import numpy as np from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.cluster import KMeans from sklearn.metrics import classification_report, silhouette_score X, y = load_breast_cancer(return_X_y=True) # y 为已标注的 0/1 标签 # ---- 监督路径 ---- X_tr, X_te, y_tr, y_te = train_test_split( X, y, test_size=0.2, stratify=y, random_state=42) scaler = StandardScaler().fit(X_tr) # 只在训练集拟合,避免信息泄漏 X_tr_s, X_te_s = scaler.transform(X_tr), scaler.transform(X_te) clf = LogisticRegression(C=1.0, max_iter=1000, class_weight="balanced") clf.fit(X_tr_s, y_tr) print(classification_report(y_te, clf.predict(X_te_s), digits=3)) # ---- 无监督路径:把标签扔掉,看簇结构是否还站得住 ---- km = KMeans(n_clusters=2, n_init=10, random_state=42).fit(scaler.transform(X)) print("silhouette =", round(silhouette_score(scaler.transform(X), km.labels_), 3))

几处参数值得记住:C是 L2 正则强度的倒数,调小等于加重惩罚,样本量小的时候先动它;max_iter给到 1000 是防止 lbfgs 在未标准化数据上不收敛,配合StandardScaler一起用;class_weight="balanced"在处理正负样本失衡时按类别频率反比加权,比手动过采样省事;n_init=10让 KMeans 换 10 组初始质心取最优,避免陷入局部解;silhouette_score越接近 1 说明簇内越紧、簇间越远,低于 0.3 基本说明这个 k 值没选对。想找合适的 k,把n_clusters从 2 扫到 10,逐个打印轮廓系数就够了。

2.3 传统机器学习与深度学习的边界:三层网络这条线

白皮书给了一条很好用的判据:深度学习指层数超过 3 层的神经网络。按这个口径,一个输入层加一个隐层加一个输出层,总共 3 层,仍然算传统机器学习的范畴;一旦堆到两个隐层以上,就跨过了那条线。传统机器学习算法清单里的逻辑回归、隐马尔科夫、支持向量机、K 近邻、Adaboost、贝叶斯、决策树,共同特点是把特征工程和模型训练分开,人负责告诉模型看什么。

from sklearn.neural_network import MLPClassifier # 单隐层:总共 3 层结构,仍在“传统”口径内 shallow = MLPClassifier(hidden_layer_sizes=(32,), max_iter=500, random_state=0) # 两个隐层:总共 4 层结构,越过了白皮书里的 3 层线 deep = MLPClassifier(hidden_layer_sizes=(64, 32), activation="relu", alpha=1e-4, max_iter=500, random_state=0)

hidden_layer_sizes元组的长度就是隐层数量,这是控制模型深度的直接旋钮;activation="relu"在多层结构下比 tanh 收敛更快;alpha=1e-4是结构变大后必须补上的 L2 惩罚,否则小样本上大概率过拟合。深度学习放弃了可解释性去换有效性,落到代码里就是:你很难说清第 2 个隐层的第 17 个神经元在学什么,但它在足够数据上确实比决策树准。数据量低于几千条、又必须给业务方解释每个特征权重的场景,老老实实待在三层以内更划算。

2.4 迁移学习与主动学习:数据不够时的两条退路

某个领域拿不到足够的标注数据,是实际项目里最常见的卡点。迁移学习的思路是把已训练好的模型参数迁到新模型上,用别的领域学到的底层规则做初始化,从而减少所需数据量,目前在传感器网络定位、文字分类、图像分类这类变量规模有限的场景里用得比较多。主动学习则换个角度,不去扩充数据,而是用算法查询最有用的未标记样本交给专家标注,通过较少的样本拿到高性能模型,最常用的选取策略是不确定性准则和差异性准则。

# 主动学习的一轮采样:挑出模型最没把握的样本送人工标注 import numpy as np from sklearn.linear_model import LogisticRegression def uncertainty_query(model, X_pool, k=20): proba = model.predict_proba(X_pool) # 二分类下 |p - 0.5| 越小,模型越犹豫 margin = np.abs(proba[:, 1] - 0.5) return np.argsort(margin)[:k] clf = LogisticRegression(max_iter=1000).fit(X_labeled, y_labeled) idx = uncertainty_query(clf, X_unlabeled, k=20) # 把 idx 对应的样本送去标注,再合并回训练集重训,循环若干轮

predict_proba给出的概率越靠近 0.5,说明决策边界正好卡在这条样本上,标注它能带来的信息增益最大;k是每轮标注预算,通常控制在总池子的 1% 到 5%,太大就退化成随机采样了。注意多分类场景下这套 margin 计算要换成"最大概率与次大概率的差值",直接沿用二分类写法会挑出一堆毫无区分度的样本。

3. 知识图谱三元组与自然语言处理流水线的打通

3.1 "实体—关系—实体"三元组的建模与 Neo4j 落库

知识图谱本质是结构化的语义知识库,由节点和边组成图数据结构,基本单位是"实体—关系—实体"三元组,加上实体自身的"属性—值"对。每个节点表示现实世界的一个实体,每条边是两个实体之间的关系。建图的第一步不是选图数据库,而是把schema定死:哪些是实体类型,哪些是允许的关系类型,关系的方向怎么定义。

head(头实体)rel(关系)tail(尾实体)属性键值
卷积神经网络属于深度学习模型适用数据=空间性分布
循环神经网络属于深度学习模型适用数据=时间性分布
知识图谱组成单位三元组结构=实体-关系-实体
生物特征识别包含虹膜识别理论框架=分割/归一化/提取/识别
// 先建唯一约束,避免同一实体被重复写入 CREATE CONSTRAINT entity_name IF NOT EXISTS FOR (n:Entity) REQUIRE n.name IS UNIQUE; // 用 MERGE 而不是 CREATE,重复导入不会产生脏节点 UNWIND $rows AS row MERGE (h:Entity {name: row.head}) MERGE (t:Entity {name: row.tail}) MERGE (h)-[r:REL {type: row.rel}]->(t) SET r.source = row.source;

CREATE CONSTRAINT必须在数据写入之前执行,否则同名实体会被拆成多个节点,后面做路径查询时结果直接翻倍;MERGE是"存在即匹配、不存在才创建",这是批量导入时的默认选择,配合UNWIND可以把整个 JSON 数组一次性提交,比逐条 Cypher 快一到两个数量级。参数$rows从驱动层传入,字段名要和建表时的键保持一致。

3.2 从 PDF 抽文本到实体识别:pdfplumber + spaCy

白皮书和标准文档大多是双栏排版,直接extract_text()会把左右两栏的句子交叉串行,抽出来的实体关系全是错的。按 x 坐标切列是成本最低的解法。

import pdfplumber import spacy nlp = spacy.load("zh_core_web_sm") # 中文实体识别模型 def extract_entities(pdf_path, max_pages=20): chunks = [] with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages[:max_pages]: # 双栏排版必须按 x 坐标切列,否则句子会串行 left = page.crop((0, 0, page.width / 2, page.height)) right = page.crop((page.width / 2, 0, page.width, page.height)) chunks.append(left.extract_text() or "") chunks.append(right.extract_text() or "") doc = nlp("\n".join(chunks)) return [(ent.text, ent.label_) for ent in doc.ents] for name, label in extract_entities("ai_core_tech.pdf"): print(f"{name}\t{label}")

page.crop接收(x0, y0, x1, y1)四个坐标,坐标系原点在页面左上角,单位是点(1 点约等于 1/72 英寸)。max_pages是保护性参数,扫描版 PDF 文本层为空,不设上限会白跑很久。zh_core_web_sm是小模型,实体召回一般,若领域术语密集,把识别结果先落成候选词表再做人工校对,比直接上大模型省钱。注意扫描件要先过 OCR,pdfplumber 对纯图片页面返回的字符串是空的,这一点排查时看输出长度就够。

3.3 机器翻译与语义理解:统计模型与端到端模型的取舍

机器翻译这块,文档里区分了两条技术路线。统计机器翻译包含训练和解码两个阶段,训练阶段的目标是获得模型参数,解码阶段用估计出的参数和既定优化目标求最佳译文,中间要经过语料预处理、词对齐、短语抽取、短语概率计算、最大熵调序这一串步骤。基于神经网络的端到端翻译不需要针对双语句子专门设计特征模型,直接把源语言词串送进网络,用递归或卷积神经网络对句子做表征建模。

对比项统计机器翻译神经端到端翻译
特征工程需要词对齐、短语表、调序模型无需人工设计特征
训练数据依赖大规模平行语料与对齐工具同样依赖平行语料,但对齐要求低
译文流畅度短语拼接痕迹明显上下文连贯,日常口语场景更自然
可调试性中间产物可查,问题定位容易黑盒,出错只能回调数据
部署成本CPU 可跑,模型小推理需要 GPU 或量化后的小模型

文档里提到的语义理解走的是另一条路:用神经网络对篇章和问题建模,预测答案的起始和终止位置,从篇章里抽片段。做智能客服或产品自动问答时,这种抽取式方案在"答案确实在文档里"的前提下精度很高;一旦问题需要跨段落推理或者答案本身是生成的,就得换成生成式方案,代价是可溯源性和幻觉控制难度同时上升。

3.4 数据噪声与一致性校验:知识图谱最容易翻车的地方

文档里点得很直白,知识图谱的发展还有很大挑战,比如数据的噪声问题——数据本身有错误,或者数据存在冗余。这不是理论问题,是导入当天就会遇到的。

// 找孤立实体:只被创建、没进任何关系的脏节点 MATCH (n:Entity) WHERE NOT (n)--() RETURN n.name LIMIT 50; // 找同形不同写的重复候选 MATCH (a:Entity), (b:Entity) WHERE a.name < b.name AND replace(a.name, ' ', '') = replace(b.name, ' ', '') RETURN a.name, b.name LIMIT 50;

第一条查询用NOT (n)--()判断节点没有任何边,这类节点通常来自抽取失败或者关系类型不在白名单里被丢弃的部分;第二条用去空格后的字符串做粗匹配,能捞到"卷积神经网络"和"卷积 神经网络"这种写法差异。实践里再加一步规范化函数,把全半角、括号、英文缩写统一处理掉,重复率能降一个量级。做公共安全领域的反欺诈、组团欺诈分析时,噪声节点会直接污染社区发现结果,上线前跑一遍这两条校验比事后补救便宜得多。

4. 计算机视觉与生物特征识别的端到端推理链路

4.1 图像理解三层抽象对应的模型选型

文档把图像理解按抽象程度分了三个层次,这个分层直接对应不同的模型和算力预算。

层次理解对象典型输出常见方案
浅层理解边缘、特征点、纹理元素角点坐标、纹理描述子Canny、SIFT、ORB
中层理解物体边界、区域与平面分割掩码、区域框分水岭、FCN、U-Net
高层理解语义信息类别、框、姿态、文字说明检测/分割/姿态网络 + 语言头

选型时容易犯的错是拿高层模型去干浅层的活:只是判断产线上零件有没有装反,用边缘检测加模板匹配往往比训一个检测网络稳定得多,也不用维护数据集。反过来,刷脸支付、智慧安防、图像搜索这类需要高层语义的场景,浅层特征完全不够用,硬堆传统算子只会把召回率拖到不可接受。

4.2 OpenCV + ONNX Runtime 的人脸检测与特征比对

人脸识别从应用流程看可划分为检测定位、面部特征提取、人脸确认三个过程,下面这段代码把后两步串起来。

import cv2, numpy as np, onnxruntime as ort sess = ort.InferenceSession("arcface.onnx", providers=["CPUExecutionProvider"]) def embed(img_bgr): """输入 BGR 人脸图,返回 L2 归一化后的特征向量""" face = cv2.resize(img_bgr, (112, 112)) # 1/127.5 缩放 + 127.5 均值,把像素从 [0,255] 映射到 [-1,1] blob = cv2.dnn.blobFromImage(face, 1 / 127.5, (112, 112), (127.5, 127.5, 127.5), swapRB=True) inp = sess.get_inputs()[0].name vec = sess.run(None, {inp: blob})[0].ravel() return vec / np.linalg.norm(vec) # 归一化后余弦相似度等价于点积 def cosine(a, b): return float(np.dot(a, b)) sim = cosine(embed(face_reg), embed(face_query)) print("similarity =", round(sim, 4))

blobFromImage里的swapRB=True是因为 OpenCV 读进来是 BGR,而模型训练时用的是 RGB,这个参数写错的典型症状是相似度整体偏低但排序还算正常,非常隐蔽。providers指定推理后端,CPU 上跑 112×112 的模型单张在毫秒级,批量比对时把providers换成 GPU 执行器收益更明显。阈值的设定取决于任务:确认(一对一)场景下阈值可以放到 0.5 附近,辨认(一对多)场景因为要在库里挑最像的那个,阈值必须往上提,否则误接受率会随库容量线性上升。文档里也提到,人脸识别效果受光照、拍摄角度、图像遮挡、年龄等因素影响,约束条件下相对成熟,自由条件下还在持续改进,所以别指望一套阈值打通所有摄像头。

4.3 注册—识别两阶段:辨认与确认的工程差别

生物特征识别从流程上分注册和识别两个阶段,注册阶段采集生物表征信息、预处理、提特征、入库;识别阶段用一致的采集方式重新采一遍,再和库里特征做比对分析。从任务上分辨认和确认,前者是一对多,后者是一对一。

任务比对方式核心指标阈值取向典型场景
确认1:1误拒绝率 FRR偏宽松手机解锁、门禁刷卡
辨认1:N误接受率 FAR、Top-K 命中率偏严格走失人员检索、黑名单布控

文档里提到的几种模态各有各的工程约束,值得记一下:指纹识别走数据采集、数据处理(预处理、畸变校正、特征提取)、分析判别三段;虹膜尺寸小且受黑色素遮挡,必须在近红外光源下配高分辨率传感器才成像清晰;指静脉利用脱氧血红蛋白对特定近红外波段的吸收特性成像,属于体内特征,稳定性好,难点在成像单元;声纹识别分前端处理和建模分析两阶段,常用模板匹配法和概率模型法;步态是远距离复杂场景下唯一可清晰成像的生物特征,需要从视频里提取运动特征,预处理要求更高。多模态融合时不要简单地对多个分数取平均,各模态的量纲和分布不同,先做分数归一化再加权,效果差别很大。

4.4 视频编解码与算力预算

视频编解码这块,文档列的国际标准有 H.261、H.263、H.264、H.265、M-JPEG 和 MPEG 系列,压缩分无损和有损两类:无损压缩重构后数据与原始数据完全相同,有损压缩重构后有差异但不影响信息理解。

# 监控场景:1080p25,用 H.265 换带宽,关键帧间隔压到 2 秒便于回放定位 ffmpeg -i in.mp4 -c:v libx265 -preset medium -crf 28 \ -g 50 -keyint_min 50 -c:a aac -b:a 64k out.mp4

-crf 28是恒定质量模式,数值越大压缩越狠,监控类画面 28 到 32 之间通常够用;-g 50配合-keyint_min 50把关键帧间隔固定在 50 帧,25fps 下正好 2 秒一个 I 帧,回放拖动和抽帧定位都会快很多;-preset medium是编码速度和质量的中点,实时流场景往veryfast调,离线转码可以压到slow。算力预算上,解码路数比模型推理更容易被低估:一路 1080p H.265 解码在普通 CPU 上就吃掉一个核,多路并发时先把解码卡算进去,再算推理卡。

5. 语音交互四段链路的延迟拆解与压测脚本

5.1 采集—识别—语义理解—合成的预算分配

语音交互的过程分四部分:语音采集完成音频录入、采样及编码,语音识别完成语音信息到文本的转化,语义理解根据文本完成对应操作,语音合成完成文本到声音的转换。文档里把这个链路讲得很干净,但落到产品上,用户感知的是这四段加起来的总延迟。

阶段典型耗时主要影响因素优化手段
语音采集20~40 ms采样率、音频缓冲长度缩短缓冲,用流式上传
语音识别150~400 ms模型大小、是否流式流式解码、端点检测提前截断
语义理解50~300 ms意图模型、是否检索外部知识意图分级,先走小模型兜底
语音合成80~250 ms声码器、是否首包优先首包先播,边合成边下发

端到端能压到 600 ms 以内,对话体感就基本自然了;超过 1.5 秒,用户会开始怀疑没听清而重复说话,反而把识别压力放大。这四段里最该先动的是采集缓冲,很多项目默认开 200 ms 缓冲,光是这一项就吃掉了全部预算的三分之一。

5.2 一段可复用的端到端延迟打点脚本

import time def timed(stage, fn, *args, **kwargs): """对单个阶段打点,返回结果和耗时(毫秒)""" t0 = time.perf_counter() out = fn(*args, **kwargs) dt = (time.perf_counter() - t0) * 1000 print(f"{stage:<12}{dt:8.1f} ms") return out, dt audio, t_cap = timed("capture", record, 1.0, 16000) text, t_asr = timed("asr", recognize, audio) intent, t_nlu = timed("nlu", parse_intent, text) wav, t_tts = timed("tts", synthesize, intent["reply"]) print("total:", round(t_cap + t_asr + t_nlu + t_tts, 1), "ms")

time.perf_counter()是单调时钟,不受系统时间调整影响,测短间隔比time.time()可靠;每次跑三到五轮取中位数,单次结果受调度抖动影响会偏大。把asrtts单独打点,是因为这两段通常跨进程甚至跨服务,直接在客户端测总时长会发现 P95 比 P50 高出一大截,这时候要去看的是首包时间而不是整体时间。

5.3 采样率与端点检测这两个参数先定死

采集环节最容易被忽略的参数是采样率和端点检测。语音交互的前端采集直接锁 16 kHz、16 bit、单声道,后端做重采样和通道合并的成本比前端改一行代码高得多;声纹识别对高频细节更敏感,采样率低于 8 kHz 时梅尔谱的高频段基本空了,识别分数会明显掉。端点检测的静音阈值一般设在 -35 dBFS 到 -45 dBFS 之间,阈值太松会把环境噪声当语音送进识别,太紧则会切掉用户话尾的轻声字,这个参数必须拿真实场景录音调,用实验室安静环境调出来的值上线必翻车。体感和脑机这类交互方式对采样率的要求更极端,脑电信号的有效成分集中在低频但事件相关电位的时间分辨率要求高,采集端通常要 256 Hz 以上并保证时间戳同步,否则后续的特征提取和命令输出根本对不齐时间轴。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 16:14:37

Django图片服务器完整指南:从上传到访问的链路设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 16:14:06

Linux WiFi设备驱动开发实战:从SDIO到数据包的完整链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 16:10:33

数据编织实战指南:从元数据到客户360度视图的企业数据架构

简介&#xff1a;这是一份来自Gartner《有效商业决策指南》系列研究的正式报告&#xff0c;是该系列五大指南中的第四篇&#xff0c;主题为了解数据编织的作用。报告面向数据和分析领导者、企业架构师及技术决策者&#xff0c;为解决多云混合环境下数据孤岛激增、人工整合任务繁…

作者头像 李华
网站建设 2026/9/18 16:10:01

解决VMware与Hyper-V冲突:彻底关闭虚拟机监控程序的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华