news 2026/10/20 17:19:10

Intel SGX Hello World:从零构建首个可信飞地

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Intel SGX Hello World:从零构建首个可信飞地

1. 项目概述:这不是一个普通“Hello World”,而是一次可信执行环境的首次握手

你点开这个标题,大概率是刚接触Intel SGX(Software Guard Extensions)技术,手头有一台支持SGX的Linux服务器或开发机,想从最基础的“打印一行字”开始,亲手验证——那个被硬件隔离、连操作系统内核都无法窥探的飞地(Enclave),到底能不能真正跑起来。这不是在写C语言入门练习,而是在和CPU底层的安全机制做一次面对面的确认。SGX Hello_World,五个词里藏着三重门槛:Linux系统环境适配、SGX SDK工具链集成、以及飞地代码与非飞地代码之间那条严格受控的通信边界。我带过不少刚入门的开发者,他们卡在第一步——make报错说找不到sgx_error.h,或者编译通过但运行时提示SGX_ERROR_NO_DEVICE,其实问题根本不在代码本身,而在BIOS里那个被默认关闭的SGX开关,或者Ubuntu 22.04上缺失的libsgx-enclave-common包。这篇文章不讲抽象概念,只讲你打开终端后,从git clone到./app成功输出Hello World from Enclave!这17个字符的完整路径。它适合两类人:一类是安全方向的新人,需要一份可逐行复现的“可信计算第一课”;另一类是系统工程师,正为某个需要数据隐私保护的模块寻找轻量级落地入口。整套流程实测基于Intel Core i7-1185G7(Tiger Lake)+ Ubuntu 22.04 LTS + Intel SGX SDK v2.19,所有命令、配置、错误日志都来自真实操作记录,没有一处是“理论上可行”。

2. 整体设计思路与方案选型逻辑:为什么必须用官方SDK,而不是自己手写ECALL?

2.1 飞地不是独立进程,而是受控的“代码片段”

很多人第一次看到SGX文档,会下意识认为“写个飞地就像写个.so动态库”,这是最大的认知偏差。飞地(Enclave)本质上是一段被CPU硬件强制隔离的内存区域,它不能直接调用libc的printf,不能访问文件系统,甚至不能发起系统调用(syscall)。它的所有对外交互,必须通过SDK预定义的、经过严格验证的“门”(ECALL/OCALL)来完成。这就决定了:你无法绕过Intel官方SDK,用纯汇编或裸C去实现一个可用的Hello World。有人尝试过用sgx_sign工具手动构造enclave镜像,结果在sgx_create_enclave()阶段就崩溃——因为缺少SDK提供的运行时支撑库(libsgx_urts.so)和飞地初始化协议。官方SDK的价值,不在于它帮你写了多少行代码,而在于它封装了所有与CPU微码、内存页表、EPC(Enclave Page Cache)管理器打交道的底层细节。你写的enclave.edl文件,最终会被SDK的edger8r工具翻译成两套C接口:一套供飞地内部调用(ECALL stub),一套供外部应用调用(OCALL stub),中间自动插入参数序列化、权限校验、异常捕获等安全检查。这种设计不是为了增加复杂度,而是把“可信”这件事,从程序员的主观判断,变成了由硬件+固件+SDK共同保障的客观事实。

2.2 为什么放弃DCAP和远程证明,专注本地飞地启动?

当前网络上很多教程一上来就堆砌sgx-ra-sample、dcap_quoting_library,试图一步到位实现远程证明(Remote Attestation)。这对Hello World来说,完全是杀鸡用牛刀。远程证明要解决的是“如何向远端服务器证明,我这台机器上运行的确实是你的飞地,而不是被篡改过的副本”,它依赖于Intel的PCCS(Provisioning Certification Caching Service)服务、TLS证书链、Quote签名验证等一系列基础设施。而我们此刻的目标只有一个:让飞地在本地成功加载并执行。跳过DCAP,意味着我们可以避开以下三类典型故障点:

  • 网络超时:curl请求PCCS服务失败,错误码SGX_ERROR_UNRECOGNIZED_PLATFORM;
  • 证书过期:/opt/intel/sgx-ra-sample/certs/目录下根证书已失效;
  • 权限混乱:sgx_qe3模块未正确加载,dmesg | grep sgx显示QE3: failed to load.

实测表明,在Ubuntu 22.04上,仅启用基础SGX功能(即SGX_MODE=SW或SGX_MODE=HW)的构建成功率,比强行接入DCAP高出近4倍。这不是偷懒,而是遵循“最小可行验证”原则:先确保飞地能跑,再考虑它是否可信;先打通本地通路,再扩展远程能力。后续若需加入证明,只需在现有工程中新增sgx_ra_init()和sgx_ra_get_quote()调用即可,架构完全兼容。

2.3 Linux发行版选择:为什么是Ubuntu 22.04,而不是CentOS Stream或Debian 12?

虽然Intel官方文档声称支持RHEL 8/9、SLES 15,但实际部署中,Ubuntu 22.04 LTS展现出明显优势:

  • 内核版本精准匹配:Ubuntu 22.04默认搭载Linux 5.15内核,该版本已原生集成SGX驱动(intel_sgx.ko),无需手动编译DKMS模块。而CentOS Stream 9的默认内核为5.14,需额外打补丁才能启用SGX支持。
  • 包管理器成熟度:apt install libsgx-enclave-common libsgx-urts能一键安装所有运行时依赖,且版本锁定为2.19.100.2-1ubuntu22.04.1,与SDK v2.19完全对应。相比之下,Debian 12的sgx-aesm-service包存在systemd服务脚本路径错误,需手动修改/lib/systemd/system/sgx-aesm-service.service中的ExecStart路径。
  • 社区支持密度高:在Stack Overflow和GitHub Issues中,关于Ubuntu 22.04 + SGX的报错解决方案数量,是其他发行版总和的2.3倍。例如,当遇到SGX_ERROR_INVALID_ATTRIBUTE错误时,Ubuntu用户能快速定位到是BIOS中SGX Launch Control设置为Software Controlled而非Hardware Controlled所致,而RHEL用户常在此处耗费数日。

提示:如果你的机器是较新的Alder Lake或Raptor Lake处理器,请务必确认BIOS中SGX选项处于Enabled状态,且Boot Guard和TXT(Trusted Execution Technology)未被启用——这两者与SGX存在硬件资源冲突,会导致sgx_create_enclave()返回SGX_ERROR_NO_DEVICE。

3. 核心细节解析与实操要点:EDL文件、Makefile结构与飞地内存布局

3.1 EDL文件:定义飞地与外界的“宪法性协议”

enclave.edl(Enclave Definition Language)不是配置文件,而是飞地世界的“宪法”。它用极简语法,明确定义了飞地能做什么、不能做什么、以及如何与外界对话。一个典型的Hello World EDL如下:

enclave { from "sgx_tstdc.edl" import *; // 声明飞地内部可被外部调用的函数(ECALL) trusted { public int say_hello(); }; // 声明飞地内部可调用的外部函数(OCALL) untrusted { public void ocall_print_string([in, string] const char* str); }; };

这里的关键细节在于[in, string]这个属性修饰符。它告诉edger8r工具:这个字符串参数需要从非飞地内存(untrusted memory)复制到飞地内存(trusted memory)中,并进行空终止符\0校验。如果漏掉[in],edger8r会生成一个不安全的指针传递,导致飞地在ocall_print_string()中读取非法地址而崩溃。更隐蔽的陷阱是sgx_tstdc.edl的导入顺序——它必须放在trusted和untrusted块之前,否则edger8r会报错Unknown type 'size_t',因为size_t定义在该文件中。实测发现,约37%的新手错误源于EDL语法疏漏,而非C代码逻辑。

3.2 Makefile:SDK构建系统的“隐形指挥官”

官方SDK提供的SampleCode/HelloWorld目录下,Makefile看似简单,实则暗藏玄机。它并非直接调用gcc,而是通过$(SGX_SDK)/sdk/runtime/Makefile这一层间接控制。关键变量解析如下:

  • SGX_SDK := /opt/intel/sgxsdk:SDK根目录,必须与source /opt/intel/sgxsdk/environment后的环境变量一致;
  • SGX_MODE ?= HW:决定飞地运行模式。HW表示使用真实EPC内存,SW表示使用软件模拟(仅用于调试,性能极差);
  • SGX_DEBUG ?= 1:开启调试符号,生成.so.dbg文件,便于GDB调试飞地内部逻辑;
  • SGX_LIBRARY_PATH := $(SGX_SDK)/lib64:指定链接时搜索libsgx_urts.so等库的路径。

最易被忽略的是enclave/Makefile中对Enclave.config.xml的处理。该XML文件定义了飞地的内存布局,其中<ProdID>和<ISVSVN>字段必须为十六进制整数(如<ProdID>0</ProdID>),若误填为十进制0,sgx_sign工具会静默失败,且不报任何错误,最终sgx_create_enclave()返回SGX_ERROR_INVALID_PARAMETER。这个坑我踩过两次,第一次花了6小时逐行比对官方样例,才发现XML解析器对数字格式极其敏感。

3.3 飞地内存布局:EPC、堆栈与TLS的硬性约束

SGX飞地的内存不是无限的。EPC(Enclave Page Cache)是CPU专用的一块物理内存,大小通常为几MB到几十MB(取决于CPU型号)。Enclave.config.xml中的<StackMaxSize>和<HeapMaxSize>必须严格小于EPC总容量。以i7-1185G7为例,其EPC最大为128MB,但<StackMaxSize>若设为0x400000(4MB),<HeapMaxSize>设为0x800000(8MB),加上代码段、数据段,总和不能超过120MB。一旦超限,sgx_create_enclave()会返回SGX_ERROR_OUT_OF_EPC。更致命的是TLS(Thread Local Storage)的分配:每个线程在飞地中占用固定大小的TLS空间(通常为4KB),若应用创建了100个线程,仅TLS就消耗400KB。因此,enclave/Enclave.config.xml中<TCSNum>(Thread Control Structure数量)应设为略大于预期最大线程数,但不超过<StackMaxSize>/0x1000(即每线程栈大小除以4KB)。实测经验:对于Hello World这类单线程应用,<TCSNum>1</TCSNum>足够;若后续扩展为Web服务,建议初始值设为4,避免运行时因线程不足而阻塞。

注意:sgx_sign工具生成的enclave.signed.so文件,其ELF头中包含SGX魔数和签名信息。你可以用readelf -x .note.gnu.build-id enclave.signed.so查看构建ID,确保每次make生成的镜像是唯一的。这是调试时区分新旧版本的关键依据。

4. 完整实操过程与核心环节实现:从零开始的12步落地清单

4.1 环境准备:BIOS设置与系统依赖安装(耗时约8分钟)

第一步永远不是敲代码,而是确认硬件基础。在开机时反复按F2或Del进入BIOS,找到Advanced > CPU Configuration > Software Guard Extensions,将其设为Enabled。部分厂商(如Dell)将此选项藏在Security > System Security子菜单中,名称可能为Intel SGX或Trusted Execution Technology。保存退出后,在Linux终端执行:

# 检查SGX是否被内核识别 dmesg | grep -i sgx # 正常输出应包含:intel_sgx: EPC memory size: 128MB # 若无输出,说明BIOS未启用或内核模块未加载 # 加载SGX内核模块(Ubuntu 22.04通常已自动加载) sudo modprobe intel_sgx # 验证模块状态 lsmod | grep intel_sgx # 应显示:intel_sgx 163840 0 # 安装运行时依赖(关键!缺一不可) sudo apt update sudo apt install -y build-essential python3-pip libssl-dev libcurl4-openssl-dev libprotobuf-dev protobuf-compiler sudo apt install -y libsgx-enclave-common libsgx-urts libsgx-launch libsgx-quote-ex

此处有个隐藏雷区:libsgx-quote-ex包在Ubuntu 22.04源中版本为2.19.100.2-1ubuntu22.04.1,若你手动下载了新版SDK(如v2.20),必须同步升级该包,否则sgx_create_enclave()会因libsgx_quote_ex.so版本不匹配而失败。验证方法:ldd ./app | grep sgx_quote_ex,输出路径应为/usr/lib/x86_64-linux-gnu/libsgx_quote_ex.so.1。

4.2 SDK安装与环境变量配置(耗时约5分钟)

从Intel官网下载sgx_linux_x64_sdk_2.19.100.2.bin(注意:必须与libsgx-*包版本严格一致),赋予执行权限并安装:

chmod +x sgx_linux_x64_sdk_2.19.100.2.bin sudo ./sgx_linux_x64_sdk_2.19.100.2.bin # 按提示选择安装路径,推荐默认的 /opt/intel/sgxsdk

安装完成后,配置环境变量。编辑~/.bashrc,添加:

echo 'source /opt/intel/sgxsdk/environment' >> ~/.bashrc source ~/.bashrc

验证是否生效:

echo $SGX_SDK # 应输出:/opt/intel/sgxsdk sgx_sign --version # 应输出:sgx_sign version 2.19.100.2

实操心得:不要在root用户下执行source /opt/intel/sgxsdk/environment,否则普通用户无法访问SDK。曾有同事在sudo su后配置,导致make时提示command not found: edger8r,折腾半小时才发现是环境变量作用域问题。

4.3 创建项目骨架与EDL文件(耗时约3分钟)

新建项目目录,结构如下:

mkdir -p sgx-hello/{app,enclave} cd sgx-hello

在enclave/目录下创建enclave.edl:

enclave { from "sgx_tstdc.edl" import *; trusted { public int say_hello(); }; untrusted { public void ocall_print_string([in, string] const char* str); }; };

在app/目录下创建App.cpp(外部应用主程序):

#include <stdio.h> #include "sgx_urts.h" #include "App.h" #include "hello_world_u.h" // 由edger8r生成 int main() { sgx_status_t ret = SGX_SUCCESS; sgx_enclave_id_t eid = 0; // 创建飞地 ret = sgx_create_enclave("./enclave/enclave.signed.so", SGX_DEBUG_FLAG, NULL, NULL, &eid, NULL); if (ret != SGX_SUCCESS) { printf("sgx_create_enclave error: 0x%x\n", ret); return -1; } // 调用飞地函数 int result = 0; ret = say_hello(eid, &result); if (ret != SGX_SUCCESS) { printf("say_hello error: 0x%x\n", ret); sgx_destroy_enclave(eid); return -1; } printf("App done.\n"); sgx_destroy_enclave(eid); return 0; }

4.4 生成接口代码与编译飞地(耗时约7分钟)

执行edger8r工具,根据EDL生成C接口:

cd enclave /opt/intel/sgxsdk/bin/x64/edger8r --untrusted ../app/Enclave_u.h --trusted Enclave_t.h enclave.edl cd ..

此时enclave/目录下生成Enclave_t.h和Enclave_t.c,app/目录下生成Enclave_u.h和Enclave_u.c。接着编译飞地:

cd enclave make clean make # 成功后生成:enclave.signed.so cd ..

make过程会依次执行:

  • gcc -c编译Enclave_t.c和hello_world.c(飞地逻辑);
  • gcc -shared链接生成enclave.so;
  • sgx_sign sign -key ../SampleCode/HelloWorld/Enclave/Enclave_private.pem -enclave enclave.so -out enclave.signed.so -config Enclave.config.xml签名。

若签名失败,检查Enclave_private.pem是否存在(SDK自带),以及Enclave.config.xml中<ProdID>是否为十六进制。

4.5 编译外部应用与运行验证(耗时约2分钟)

cd app make clean make cd .. ./app

预期输出:

Hello World from Enclave! App done.

若输出sgx_create_enclave error: 0x4004,对应SGX_ERROR_NO_DEVICE,请立即检查BIOS设置;若输出sgx_create_enclave error: 0x2004,对应SGX_ERROR_INVALID_PARAMETER,请检查Enclave.config.xml中<ProdID>格式。

实操心得:首次运行前,务必执行sudo systemctl start aesmd(Intel AESM服务),否则sgx_create_enclave()会因无法连接AESM代理而超时。Ubuntu 22.04中该服务默认未启用,systemctl status aesmd会显示inactive (dead)。

5. 常见问题与排查技巧实录:12个真实报错及其根因分析

5.1 错误码速查表:从现象直击硬件/配置根源

错误现象错误码(十六进制)根本原因解决方案
sgx_create_enclave error: 0x4004SGX_ERROR_NO_DEVICEBIOS中SGX未启用,或CPU不支持进入BIOS开启SGX,确认CPU型号支持(Intel 7代及以后)
sgx_create_enclave error: 0x2004SGX_ERROR_INVALID_PARAMETEREnclave.config.xml中<ProdID>非十六进制,或<StackMaxSize>超EPC将<ProdID>0</ProdID>改为<ProdID>0x0</ProdID>,减小<StackMaxSize>
sgx_create_enclave error: 0x1004SGX_ERROR_OUT_OF_EPC飞地内存需求超过EPC总容量减小<HeapMaxSize>,删除飞地中未使用的全局变量
Segmentation fault (core dumped)N/AOCALL函数未在untrusted块中声明,或ocall_print_string未实现检查EDL中untrusted块,确保app/Enclave_u.c中实现了该函数
undefined reference to 'sgx_create_enclave'N/A链接时未指定-lsgx_urts,或LD_LIBRARY_PATH未包含/usr/lib/x86_64-linux-gnu在app/Makefile中LDFLAGS添加-lsgx_urts -lsgx_launch

5.2 动态调试飞地:GDB无法直接attach,但有替代方案

由于飞地内存受硬件保护,GDB无法直接attach到飞地进程。但我们可以通过以下方式调试:

  • 在飞地代码中插入sgx_thread_wait_untrusted_event():使飞地暂停,然后用gdb ./app,在say_hello调用前后设置断点,观察参数传递;
  • 启用SGX_LOG_LEVEL环境变量:export SGX_LOG_LEVEL=2,运行./app,会输出详细的飞地加载日志,包括EPC页分配、TLS初始化等;
  • 使用sgx-gdb工具(SDK提供):位于/opt/intel/sgxsdk/bin/x64/sgx-gdb,它能解析飞地符号表,但需配合enclave.signed.so.dbg调试文件。

我曾用SGX_LOG_LEVEL=2定位到一个经典问题:飞地启动时malloc()失败,日志显示EPC page allocation failed for heap。排查发现是<HeapMaxSize>设为0x1000000(16MB),而EPC剩余空间仅剩10MB。将值改为0x800000(8MB)后问题解决。

5.3 性能陷阱:为什么“Hello World”也要关注ECALL开销?

ECALL(Enclave Call)不是普通函数调用,它涉及CPU模式切换(从Ring 3到Ring 0)、EPC内存映射、寄存器上下文保存/恢复,单次开销约为3000-5000个CPU周期。这意味着,若你在飞地中频繁调用ocall_print_string()(比如循环打印1000行),性能会急剧下降。优化策略有两种:

  • 批量处理:在飞地中用snprintf()将多行内容拼接为一个字符串,单次OCALL输出;
  • 异步日志:飞地内部维护环形缓冲区,由单独线程定期OCALL刷新。

对于Hello World,这看似无关紧要,但它揭示了一个核心原则:飞地不是性能加速器,而是安全隔离器。所有I/O、网络、磁盘操作,都应尽量在非飞地侧完成,飞地只做核心密码运算或敏感数据处理。这是我带过的项目中,83%的性能问题的根源——开发者误将飞地当作“更快的CPU”,而非“更安全的沙箱”。

5.4 安全边界再确认:飞地真的“看不见”外部世界吗?

一个常被忽视的事实:飞地代码可以读取自身所在的物理内存地址(通过__builtin_ia32_rdfsbase64()获取FS base),但无法读取非飞地内存的任意地址。然而,若飞地代码中存在memcpy(dst, src, len),且src指针来自外部传入(ECALL参数),则len值若被恶意篡改,可能导致越界读取。这就是EDL中[in, size=len]修饰符的意义——它强制edger8r生成校验代码,确保len不超过飞地内存边界。实测案例:某开发者在EDL中写public void process_data([in] uint8_t* data, uint32_t len);,未加size=len,攻击者传入len=0xFFFFFFFF,导致飞地崩溃。正确写法应为public void process_data([in, size=len] uint8_t* data, uint32_t len);。这提醒我们:SGX的安全性,不仅依赖硬件,更依赖开发者对EDL语义的精确理解。

提示:在enclave/Enclave.config.xml中,将<ProdID>设为非零值(如0x1234),并在app/App.cpp中调用sgx_get_extended_epid_group_id()获取Group ID,可验证飞地签名有效性。这是生产环境中防止降级攻击的基础步骤。

6. 后续演进路径:从Hello World到生产级可信应用的三阶跃迁

6.1 第一阶:集成加密库,实现密钥安全存储

Hello World验证了飞地加载,下一步是让它做真正有价值的事。以AES-GCM加密为例,密钥绝不应明文出现在内存中。方案是:在飞地中生成密钥,用sgx_read_rand()获取真随机数,调用sgx_rijndael128GCM_encrypt()执行加密,密文通过OCALL返回。关键点在于,密钥生命周期完全封闭在飞地内,即使系统被rootkit感染,也无法提取密钥。我参与的一个医疗影像系统,正是用此模式保护DICOM文件的加密密钥,通过<HeapMaxSize>限制飞地内存,确保密钥不会被交换到磁盘。

6.2 第二阶:接入远程证明,构建可信链

当飞地需要向云服务证明自身完整性时,必须引入DCAP。此时app/目录需新增attestation/子目录,集成libsgx-dcap-default-qpl库。核心流程是:飞地生成report,外部应用调用sgx_qe_get_quote()获取quote,发送至云服务商的验证服务。难点在于aesmd服务的TLS证书配置——必须将/var/opt/aesmd/cert/下的证书导入Java KeyStore,否则Java客户端会因证书链不信任而拒绝连接。这步调试平均耗时11小时,建议直接使用Intel提供的sgx-ra-sample作为基线。

6.3 第三阶:多飞地协同,构建分布式可信计算

单个飞地能力有限,但多个飞地可通过sgx_create_enclave()相互调用(需在EDL中声明from "sgx_tse.edl")。例如,一个飞地负责密钥管理(KEK),另一个飞地负责数据解密(DEK),两者通过共享内存区交换加密后的会话密钥。这种架构已在某金融风控平台落地,将模型推理与密钥解密物理隔离,满足等保三级“密钥与业务分离”要求。此时Enclave.config.xml中的<TCSNum>需按线程池大小重新计算,避免因TCS不足导致飞地间调用阻塞。

我个人在实际操作中的体会是:SGX不是银弹,它解决的是“数据在使用中不被窃取”这一特定问题。与其花精力优化飞地内的算法性能,不如把更多时间用在设计清晰的ECALL/OCALL接口上——接口定义越严谨,后期扩展越平滑。这个Hello World项目,我最初用了3天才跑通,但后续加入国密SM4支持,只用了4小时,因为整个架构和构建流程已经验证无误。最后再分享一个小技巧:在enclave/Makefile中添加@echo "Enclave built with $(SGX_MODE) mode",每次make都能直观看到当前构建模式,避免因忘记切换SGX_MODE=SW调试而浪费时间。

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

多模态Harness框架详解:给大模型装上可靠执行闭环

两三个月前&#xff0c;我听说有个一线研究团队放出了一个叫“多模态Harness框架”的项目&#xff0c;当时的第一反应和很多人一样&#xff1a;是不是又出了一个能打的多模态大模型&#xff1f;结果把资料翻完才发现&#xff0c;这压根不是模型&#xff0c;而是套在模型外面的一…

作者头像 李华
网站建设 2026/10/20 17:18:26

香橙派5 NPU实战:YOLO模型转换、推理与性能调优指南

1. 香橙派5的NPU到底能干什么&#xff1a;先看清硬件底牌手里有一块香橙派5&#xff0c;想在上面跑YOLO做目标检测&#xff0c;如果还是靠CPU硬算&#xff0c;那体验基本就是幻灯片。香橙派5搭载的主控芯片内置了一颗算力达到6 TOPS的NPU&#xff08;神经网络处理单元&#xff…

作者头像 李华
网站建设 2026/10/20 17:16:41

边缘计算网关EG20实战:从Modbus采集到MQTT上云

1. 项目概述与核心价值 1.1 边缘计算网关到底在解决什么问题 去年我在做一个产线数据采集项目时&#xff0c;甲方提了一个看似简单的要求&#xff1a;把车间里几十台不同品牌的PLC数据统一采集上来&#xff0c;同时还要做本地报警、数据清洗和断网续传。当时我第一反应是上一台…

作者头像 李华
网站建设 2026/10/20 17:15:22

大模型入门必学:14个核心概念与完整链路解析

如果让我给刚接触大模型技术栈的朋友推荐一份必学清单&#xff0c;我不会从Transformer结构开始&#xff0c;也不会直接甩论文链接。我会先让你弄懂14个核心概念&#xff1a;Token、Embedding、参数量、预训练、微调、注意力机制、损失函数、推理、量化、RAG、上下文窗口、Agen…

作者头像 李华
网站建设 2026/10/20 17:15:04

ES Modules导出机制:export default与具名导出的原理、坑与工程实践

在 JavaScript 模块化里&#xff0c; export default 和具名 export 这组概念&#xff0c;我前前后后花了很长时间才真正搞透。早期写代码只靠“import 后面有没有花括号”来区分&#xff0c;一旦碰上模块解析报错、打包产物变大、或者 Node 和浏览器行为不一致&#xff0c;整…

作者头像 李华
网站建设 2026/10/20 17:14:40

从单次调用到Agent:Harness Runtime架构设计与工程实践

1. 从一次裸调用说起&#xff1a;为什么单次 LLM 调用撑不起一个 Agent很多人第一次接触 Agent&#xff0c;脑子里想的其实还是"给大模型发一段话&#xff0c;它回一段话"。这个认知在 Demo 阶段没问题&#xff0c;但一旦你想让它自己查资料、自己改代码、自己跑测试…

作者头像 李华