news 2026/10/17 5:32:59

PostgreSQL连接全解析:从连接池到pg_hba.conf的排查实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PostgreSQL连接全解析:从连接池到pg_hba.conf的排查实践

1. 从一条报错说起:连接问题到底卡在哪

先讲个我自己的经历。有次线上系统半夜报警,业务方反馈"数据库连不上了",我登上服务器看了一眼日志,满屏都是FATAL: sorry, too many clients already。当时的第一反应是查max_connections,结果一查配置,默认值100,当前活跃连接数也就90出头,按道理不该报错。再往下查才发现,应用层的连接池配置出了问题,每个实例起了50个连接,一共3个实例,加上后台任务、监控采集、定时脚本,全挤在一起,瞬间打满了。

这种问题在PostgreSQL的日常运维里太常见了。很多人一听到"PostgreSQL连接",第一反应就是改max_connections,但连接这件事远不止一个参数那么简单。它涉及网络层怎么建立通信、服务端怎么认证身份、客户端用哪种工具发起连接、连接串里的参数怎么配置、高并发下连接怎么复用,每一层都有坑。

这篇就把PostgreSQL的连接方式、常用连接工具、连接串配置、连接池选型,以及我实际踩过的问题一次讲清楚。不管你是刚接触PostgreSQL的初学者,还是已经在生产环境里维护过一阵子的开发者,应该都能从这里找到有用的东西。

2. 连接的本质:从协议握手到身份认证

2.1 PostgreSQL到底是怎么接住一个连接的

PostgreSQL的服务端有一个核心进程叫postmaster,它负责监听固定的端口(默认5432),所有客户端连接请求首先到达这里。postmaster接住请求后,会fork()出一个独立的子进程来处理这个连接,这个子进程就是我们常说的backend process。也就是说,每一个客户端连接,在服务端都有一个专属的进程在服务它,进程之间互不干扰。

这里有个关键点:PostgreSQL是进程模型,不是线程模型。这意味着每个连接都有独立的内存上下文、独立的执行状态,一个连接崩溃不会直接影响其他连接。但代价也很直接——每增加一个连接,系统就要多消耗一份内存和进程资源。这也是为什么PostgreSQL的连接数不是"越大越好"的底层原因。

从协议层面讲,PostgreSQL使用的是自家定义的Frontend/Backend Protocol,流程大致是这样的:

  1. 客户端发起TCP连接(或Unix Socket连接)到服务端端口。
  2. 服务端返回一条AuthenticationRequest消息,告诉客户端需要认证。
  3. 客户端根据配置返回认证响应,常见的有明文密码、MD5、SCRAM-SHA-256等。
  4. 认证通过后,服务端发送ParameterStatus、BackendKeyData等消息,告知数据库版本、编码、当前事务状态等信息。
  5. 连接正式建立,客户端可以发送查询请求。

这个流程看起来简单,但其中任何一个环节出问题,表现出的错误信息都不同。比如connection refused是TCP层就没通,password authentication failed是认证阶段挂了,timeout expired则是握手迟迟没完成。

2.2 连接方式的选择:TCP/IP和Unix Socket

PostgreSQL支持两种连接通道,一种是常规的TCP/IP网络连接,另一种是Unix域套接字(Unix Socket)。很多新手只知道前者,但后者在本地运维中反而更常用。

TCP/IP连接适用于远程访问,需要指定主机地址和端口。postgresql.conf里的listen_addresses决定了服务端监听哪些IP。默认是localhost,也就是只能本机连。如果想让其他机器访问,需要改成具体IP或者*,同时还要在pg_hba.conf里放行对应网段。

Unix Socket连接只在同一台机器上有效,不需要经过网络协议栈,性能和安全性都比TCP高。psql在本地连接时,默认走的就是Unix Socket。socket文件的路径由unix_socket_directories控制,默认在/var/run/postgresql或/tmp下。

实战里有个很容易被忽略的细节:通过Unix Socket连接时,认证方式通常走peer或trust,也就是直接以操作系统用户的身份映射到数据库用户。比如你用Linux用户postgres执行psql -U postgres,服务端看到peer认证的对端用户就是postgres,直接就放行了,不需要输密码。但如果通过TCP连接进来,peer认证就不适用了,必须走密码或者证书认证。

所以很多初学者在刚装完PostgreSQL后,直接执行psql -U postgres能进,但换成psql -h 127.0.0.1 -U postgres就报错,很多时候不是密码错了,而是pg_hba.conf里TCP连接的认证规则还没配好。

2.3 pg_hba.conf:连接的生杀大权

pg_hba.conf是PostgreSQL的访问控制文件,名字里的HBA是Host-Based Authentication的缩写。这个文件决定了"谁能从哪个地址、以什么方式、连接哪个数据库、用什么认证方法"。

文件里每一行是一条规则,按从上到下的顺序匹配,匹配到第一条就不再往后看了。这是个极其容易踩坑的设计:如果你在文件上部写了一条宽松的规则,下面的严格规则根本不会生效。

规则格式大致是这样的:

local all postgres peer host all all 127.0.0.1/32 scram-sha-256 host all all 0.0.0.0/0 scram-sha-256
  • local表示Unix Socket连接。
  • host表示TCP连接,后面的网段决定来源限制。
  • 最后一列是认证方式,常见的有trust、peer、md5、scram-sha-256、reject等。

trust是最危险的认证方式,表示不需要任何验证直接放行。我在测试环境见过有人图省事把pg_hba.conf里配了一堆trust,结果任意机器只要网络能通就能连上数据库。生产环境千万不能用。

peer适合本地Socket连接,用操作系统用户身份做映射。scram-sha-256是目前推荐的密码加密认证方式,MD5已经被标记为废弃,新版本里默认就是scram-sha-256。

改完pg_hba.conf后需要重新加载生效,不需要重启服务,执行:

SELECT pg_reload_conf();

或者命令行方式:

pg_ctl reload -D /path/to/data

很多新手改完配置后直接重启数据库,其实没必要,reload就够了,不会中断正在执行的连接。

3. 工具盘点:从psql到图形客户端再到驱动

3.1 命令行工具psql:绕不开的基本功

psql是PostgreSQL自带的交互式命令行工具,不管你是大神还是小白,这东西都躲不开。它支持完整的SQL执行、事务控制、脚本调用、元命令等功能。

连接数据库的基本语法:

psql -h 主机地址 -p 端口 -U 用户名 -d 数据库名

连接成功后,可以用\conninfo查看当前连接的详细信息,包括协议版本、连接方式、用户、数据库、端口等。这个命令在排查连接问题的时候特别有用,能快速确认你到底是走了Socket还是TCP。

psql里有一堆实用的元命令,比如:

  • \l列出所有数据库
  • \dt列出当前库的所有表
  • \du列出所有角色
  • \dn列出所有schema
  • \x切换行式显示和扩展显示
  • \timing开启SQL执行耗时显示

新手最容易问的问题:psql连接时需要密码,但不想每次都输怎么办?两个办法,一是设置环境变量PGPASSWORD,二是用~/.pgpass密码文件。前者不安全,生产环境别用;后者是把密码以特定格式写在用户目录下的隐藏文件里:

主机:端口:数据库:用户名:密码

比如:

localhost:5432:mydb:myuser:mypassword

文件权限必须设为600,否则PostgreSQL会直接忽略它。设置好之后,psql、pg_dump等所有libpq系工具都会自动读取这个文件。

3.2 图形化客户端:pgAdmin、DBeaver、Navicat的取舍

命令行虽好,但日常开发调试、写复杂查询、看执行计划,图形界面效率确实高。市面上主流的PostgreSQL图形客户端有这么几个,我分别说下我的使用感受。

pgAdmin是PostgreSQL官方出品的Web版管理工具,功能覆盖极全——数据库对象管理、SQL编辑器、执行计划可视化、监控面板、备份恢复,甚至还有服务器级别的健康检查。因为它是Web应用,部署在服务器上之后,随时随地用浏览器登录就能管理数据库,这点在运维场景特别方便。但它也有个让人不太舒服的地方——启动慢,界面交互稍微有点重,而且它是Python后端加JS前端,整体资源占用偏高。在低配机器上跑会有明显卡顿。

DBeaver是通用数据库客户端,基于Eclipse框架开发,支持PostgreSQL、MySQL、Oracle等几乎所有主流数据库。它的SQL编辑器和数据网格做得很好用,尤其是结果集的筛选排序,比pgAdmin顺手。对开发来说,DBeaver支持内置SSH隧道,直连云上数据库很方便。社区版免费,功能对个人开发完全够用。但如果是做DBA的深度运维操作,比如复杂的权限配置、表空间管理,DBeaver的深度不如pgAdmin。

Navicat收费,但用户体验确实精致,尤其是在macOS上,界面流畅度是另外两家的数倍。它的数据传输功能很强,跨库导表、结构同步都是一键操作。如果你经常需要在不同环境之间搬数据,Navicat的效率优势非常明显。

选型建议:日常开发调试用DBeaver就够了,免费的且功能全面;DBA角色建议pgAdmin和命令行结合使用,负责深度运维;在乎手感和效率、且预算充足的话可以直接上Navicat。

3.3 编程语言驱动:从libpq到各语言适配器

除了交互式工具,程序代码里连接PostgreSQL靠的是各种驱动库。这些驱动归根结底都绕不开一个底层库——libpq,它是PostgreSQL的C语言客户端接口,定义了连接逻辑、协议交互、参数解析等核心行为。几乎所有语言的PostgreSQL驱动,本质上都是对libpq的封装或对相同协议的重新实现。

常用的驱动有这么几类:

  • Python:psycopg2和psycopg3是老牌驱动,基于C实现,性能稳定,行业事实标准。asyncpg是异步驱动,性能极强,适合高并发异步场景。SQLAlchemy本身不是驱动,它是ORM,底层接的是psycopg2或asyncpg。
  • Java:JDBC驱动org.postgresql:postgresql,目前最新的版本对PostgreSQL 16/17支持都不错,支持连接池特性。
  • Node.js:pg是最常用的库,底层通过C扩展调用libpq;postgres.js是纯JavaScript实现,安装更友好,不依赖编译环境。
  • Go:pgx是目前最推荐的驱动,纯Go实现,同时支持标准database/sql接口和原生接口,性能比旧的lib/pq好不少。lib/pq官方已经停止维护了,新项目直接选pgx就好。
  • Ruby:pggem 是标准选择,也是libpq的封装。

写代码连数据库时,连接串的格式高度统一。standard格式长这样:

postgresql://用户名:密码@主机地址:端口/数据库名?参数1=值1&参数2=值2

比如:

postgresql://postgres:secret@127.0.0.1:5432/mydb?sslmode=require&connect_timeout=5

还有一种URI格式,也是上面这种postgresql://开头的写法,两种叫法其实指的是同一个东西。另一类是keyword/value格式,用空格分隔参数:

host=127.0.0.1 port=5432 user=postgres password=secret dbname=mydb sslmode=require

很多驱动都支持这两种写法。psql和libpq原生支持keyword/value,JDBC则必须用URI格式。这里有个开发中常见的坑:密码里有特殊字符时,URI格式必须做URL编码。比如密码是abc@123,直接拼到URI里会被解析成连接参数分隔符,必须写成abc%40123。

4. 连接串里的门道:参数配置与常见坑

4.1 关键连接参数逐个拆解

一个连接串里能配的参数不少,但真正影响连接的稳定性和安全性的,就这么几个:

connect_timeout:连接超时时间,单位秒。这个参数经常被忽略,但作用极大。默认情况下的超时行为在不同环境里不一致,TCP层的超时有时能拖到几分钟。显式设置connect_timeout=5,表示5秒内连不上就直接失败,应用层可以快速感知并切换到备用节点或重新排队。

sslmode:SSL模式,取值有disable、allow、prefer、require、verify-ca、verify-full。其中prefer是很多驱动的默认值,意思是"能加密就加密,不能加密就明文"。但注意,prefer有一个安全隐患——它允许降级到非加密连接,有中间人攻击风险。生产环境建议至少用require,追求更高安全的话用verify-full,它会校验服务端证书的CN和主机名是否一致。

application_name:应用名,用于标识连接来源。这个参数在运维排查时极其重要。如果所有连接都叫默认名,出了问题根本分不清是哪个业务在连。在连接串里写清楚应用名:

...?application_name=order_service

之后在pg_stat_activity视图里就能直接看到这个连接来自哪个应用。

keepalives:TCP保活参数,包括keepalives_idle、keepalives_interval、keepalives_count。这三个参数控制TCP层检测死连接的频率。默认配置在某些Linux内核版本上偏宽松,导致一条已经死掉的连接要很久才能被系统回收。对于长连接场景,建议显式设置:

keepalives_idle=60 keepalives_interval=5 keepalives_count=5

意思是"空闲60秒后,每5秒探测一次,连续5次无响应就判定连接死亡"。

client_encoding:客户端字符集编码。一般推荐UTF8,但要注意数据库内部编码不是UTF8时,连接层做了隐式转换,性能和正确性都可能受影响。最保险的做法是建库时就统一用UTF8。

4.2 密码加密方式的兼容性陷阱

PostgreSQL从10版本开始默认使用scram-sha-256做密码认证,13版本之后完全移除了对md5认证的支持(注意是认证方式移除,不是密码存储格式)。这里有个非常典型的兼容性问题:

如果你是用老版本驱动连接新版本PostgreSQL,比如旧版psql或者旧版JDBC驱动,服务端要求scram-sha-256,但客户端只支持md5,就会报:

FATAL: unsupported frontend protocol

或者:

FATAL: password authentication failed for user "xxx"

这个报错非常迷惑人,因为密码明明是正确的,但就是连不上。排查思路是:确认pg_hba.conf里认证方式是什么,然后用客户端执行:

SELECT name, setting FROM pg_settings WHERE name LIKE '%password_encryption%';

如果服务端是scram-sha-256,客户端驱动版本太老,升级驱动或重新编译基本就能解决。

4.3 常见连接报错和对应解法

我在运维过程中整理了几个最高频的连接问题,列个表格,方便对照:

错误信息问题本质排查方向
connection refusedTCP层被拒绝检查端口是否监听、防火墙是否放行
could not translate host nameDNS解析失败检查主机名拼写和DNS配置
password authentication failed认证失败确认密码、认证方式和用户是否存在
no pg_hba.conf entry for hostpg_hba.conf未放行给对应IP段添加规则
too many clients already连接数打满调整max_connections或优化连接池
timeout expired握手超时检查网络延迟和connect_timeout
SSL error: certificate verify failed证书校验失败检查sslmode设置和服务端证书
terminating connection due to administrator command连接被服务端强制断开DBA执行了pg_terminate_backend或重启

其中no pg_hba.conf entry for host这个报错很有迷惑性,很多人会以为是网络不通,其实服务端已经收到了连接请求,只是在HBA匹配阶段拒绝了。先看pg_hba.conf里的规则顺序,再用psql -h 实际IP测试,基本能定位。

5. 连接池:高并发下的必修课

5.1 为什么PostgreSQL不适合"一个请求一个连接"

前面提到过,PostgreSQL是进程模型,每个连接对应一个独立进程。这意味着连接的成本非常高——内存占用、进程创建开销、上下文切换开销都不可忽视。一个空闲连接在默认配置下也要占掉几MB内存(不算查询期间临时分配的内存),几百个连接就是几百个进程在系统里休眠。

假设一个Web应用,每秒有200个并发请求,如果每个请求单独建连接、查询、销毁,那PostgreSQL要频繁经历 fork 新进程、认证握手、协议协商的过程,光是连接开销就可能占到总延迟的30%以上。更可怕的是,如果短时间请求量暴涨,数据库可能因为连接数瞬间超过max_connections而拒绝服务。

所以连接池是PostgreSQL生产环境架构中不可缺少的一层。其核心思想是复用连接——提前建立一批连接,让请求轮流使用,用完不销毁而是归还给池子。

5.2 连接池选型:PgBouncer还是Pgpool,还是应用内置池

连接池主要有两类:一类是应用内置连接池,集成在程序进程里;另一类是外部代理连接池,独立运行在数据库和客户端之间。

应用内置连接池的代表是HikariCP(Java)、SQLAlchemy池(Python)、node-postgres的Pool等。这类池子直接在应用进程里管理连接,不增加额外的网络跳数,配置简单,适合绝大多数常规业务场景。缺点是:连接数 = 应用实例数 × 每个实例的池大小。如果应用有20个实例,每个池20个连接,数据库就要承受400个连接。而且在实例频繁弹性伸缩的场景下,连接数会剧烈波动。

外部代理连接池的代表是PgBouncer和Pgpool-II。它们的区别主要体现在工作模式上。

PgBouncer是纯连接池代理,支持三种模式:

  • session模式:客户端整个会话期间独占一个服务端连接,退出后归还。
  • transaction模式:每次事务开始时取连接,事务结束后归还。这个模式对事务边界清晰的业务非常友好,连接复用率极高。
  • statement模式:每条SQL语句执行完就归还连接,复用率最高,但对事务的支持有限制。

生产环境最常用的就是transaction模式,一个PgBouncer实例可以支持上千个客户端连接,而后端只维持几十个实际数据库连接。它没有SQL解析能力,所以对性能几乎没有影响。

Pgpool-II功能更重,除了连接池,还能做读写分离、负载均衡、自动故障转移。它的连接池本质是复用后端连接,同时根据SQL类型分发到主库或从库。但正因为功能多,配置复杂度高,排错链路也长,小团队不太建议在生产环境随意启用。

说到这,有个经典的选型建议:常规业务直接用应用内置连接池,连接数可控且不复杂;如果应用实例数多、或需要为多个服务统一管理数据库连接,用PgBouncer做中间代理层;只有明确需要读写分离和自动故障转移时才考虑Pgpool-II。

5.3 连接池参数怎么定

连接池大小不是拍脑袋定的,它受两个因素约束:数据库自身的max_connections,以及单条连接的内存开销。

数据库侧,max_connections默认100,生产环境一般会调高到300到500之间,但要同步调整shared_buffers、work_mem等内存参数,否则连接数上来后内存会爆。内存估算公式大致是:

系统可用内存 ≈ shared_buffers + max_connections × 单连接内存预估 + 文件系统缓存等

单连接内存包括进程基础内存、work_mem的排序/哈希操作分配、临时表空间等。work_mem默认4MB,但每个排序操作最多可能分配这么多,多个连接并发排序就是加法叠加。

应用侧,连接池大小的经典经验公式是:

连接池大小 = 最大并发事务处理数 × (1 + 高峰等待时间比例)

实际项目中,你可以从一个小值起步,比如单实例10到20,然后观察pg_stat_activity里的状态分布和SQL响应时延逐步调整。如果发现state为idle in transaction的连接占比很高,说明业务里有长事务持有连接不释放,池子再大也会被拖垮。

5.4 连接池实践里的两个经典坑

坑一:设置了连接池但没设置连接回收时间。应用内置池里的连接如果长期空闲,可能被数据库侧的网络层或防火墙悄然断开,但池子不知道,下次取出来使用时才发现连接已死,报connection reset。解决方法是给池子配置连接存活检测(如HikariCP的connectionTestQuery或validationTimeout),并定期回收空闲连接。

坑二:PgBouncer的transaction模式下,服务端预处理语句会失效。比如Java JDBC的PreparedStatement在连接池模式下,如果某个事务结束连接还回池子,下一次可能有其他客户端用同一个后端连接,预处理语句上下文就不对了。PostgreSQL的JDBC驱动在检测到连接被池化时,会自动处理这个问题,但有时候还是会遇到prepared statement "S_1" does not exist的报错。这种场景要么关闭服务端预处理,要么改用session模式,要么在连接池里做特殊配置。

6. 真实排障:我遇到的几个连接问题

6.1 一个"偶发断连"的排查过程

有次客户反馈,他们应用里的PostgreSQL连接偶尔会断掉,报错信息是:

org.postgresql.util.PSQLException: Connection has been closed.

这种报错有两个常见来源:一是应用侧连接池把空闲连接清理了但业务代码仍持有引用;二是数据库侧有东西主动踢了连接。我先查了pg_stat_activity,发现报错时刻确实有多个连接被终止,日志里也有terminating connection due to idle-in-transaction timeout的记录。问题一下就清楚了:他们有业务代码在事务里执行到一半,既不提交也不回滚,事务长期挂起,而某个中间件设置了idle_in_transaction_session_timeout(默认0,即不限制),触发超时后服务端主动断了连接。

解决方法是双管齐下:应用侧修正事务边界,确保所有操作都有明确的提交或回滚;数据库侧给关键业务库设置一个合理的idle_in_transaction_session_timeout,比如30秒。这样即使应用侧有疏漏,数据库也能兜底,不会让长事务长期占用连接。

6.2 一个"外部机器连不上"的排查过程

另一个常见场景:开发反馈,应用部署在另一台机器上,连接数据库报connection refused。数据库服务器本身没问题,因为我在本机用psql能正常连。

排查链路是这样的:

  1. 先确认TCP层通不通,在应用服务器上执行:

    telnet 数据库IP 5432

    结果连接被拒绝,说明问题在网络层或服务端监听层。

  2. 上数据库服务器确认监听地址:

    SHOW listen_addresses;

    发现配的是localhost,只监听了本机回环地址,外部机器当然连不上。

  3. 修改postgresql.conf里的listen_addresses为*,或者具体的业务网段IP,然后重启或reload。

  4. 再查pg_hba.conf,确认外部IP网段有对应的host规则放行,且认证方式是scram-sha-256而不是trust。

  5. 最后再查防火墙,确认5432端口对外放行。

这里有个细节值得注意:修改listen_addresses需要重启数据库,光reload不生效。这和pg_hba.conf的reload机制不同,好多人在这里卡了很久。

6.3 查连接数和状态的实用SQL

日常运维里,以下几个SQL非常常用,建议直接存到你的运维脚本里。

查看当前所有连接的基本信息:

SELECT pid, usename, datname, client_addr, client_port, backend_start, state, wait_event_type, query FROM pg_stat_activity WHERE datname IS NOT NULL ORDER BY backend_start;

按客户端IP统计连接数:

SELECT client_addr, COUNT(*) FROM pg_stat_activity WHERE datname IS NOT NULL GROUP BY client_addr ORDER BY COUNT(*) DESC;

查看空闲连接和空闲事务:

SELECT pid, usename, datname, state, query, state_change FROM pg_stat_activity WHERE state IN ('idle', 'idle in transaction');

查看当前总连接数和最大连接数:

SELECT current_setting('max_connections') AS max_connections, COUNT(*) AS current_connections FROM pg_stat_activity;

强制终止某个异常连接:

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle in transaction';

注意,pg_terminate_backend不是能随便乱用的,终止连接会让对应事务回滚。但面对失控的长事务,这是最快最直接的手段。

7. 个人经验总结

PostgreSQL连接这块,说难不难,说简单也不简单。难在它涉及网络、认证、进程模型、驱动实现、连接池策略好几个层面,任何一个环节配置不当,表现出来的都是同一个现象——"连不上"。说简单也简单,把listen_addresses、pg_hba.conf、max_connections、连接池这几个关键点管好,绝大多数问题都能提前规避。

我个人的建议是:把所有连接参数的配置当成代码一样对待,写进仓库、留好注释、变更走评审。连接池大小、超时时间、SSL模式这些参数,不同环境应该有各自明确的配置,而不是"默认值就挺好"。线上连接出问题时,先看pg_stat_activity,再查服务端日志,不要一上来就重启数据库——重启解决不了问题,只会让你丢失现场。

最后分享一个我自己的小习惯:我会在数据库里建一个监控角色,只授予pg_stat_activity和pg_stat_database的查询权限,然后专门用来做连接健康巡检。这样排查问题时用的不是超级用户,权限边界清晰,也更安全。连接管理这件事,提前做规划和约束,比事后救火省心太多。

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

2026前沿科技盘点:AI原生、量子纠错与具身智能的跃迁

每年年初我都会做一轮跨领域的技术盘点,四年下来,2026年这轮的视角和以往明显不同。过去聊AI,核心是模型参数、算力规模这些“军备竞赛”指标;过去聊量子计算,核心是比特数量、保真度这类“物理器件进度条”。而今年围…

作者头像 李华
网站建设 2026/10/17 5:31:28

AutoML如何落地?自动化机器学习实战与避坑指南

如果说传统机器学习建模像做一顿饭——买菜、洗菜、切菜、配菜、掌握火候全得亲力亲为,那AutoML想做的就是从"全程手作"变成"预制菜加开放厨房",把人从重复劳动里捞出来,把精力留给真正需要判断力的事情。AutoML这个自动…

作者头像 李华
网站建设 2026/10/17 5:30:25

AI元人文:打破单向定义,构建双向可对话的智能系统

上周和某团队碰一个AI辅助古籍整理的项目,争论到一半,分歧根本不是模型效果,而是“什么算一条正确记录”:一位文史背景的同事认为断句、句读、版本异文应当完整保留在数据里,算法同学却说这些是噪音,去掉之…

作者头像 李华
网站建设 2026/10/17 5:30:09

基于MUSIC算法的HF雷达电离层回波DOA估计仿真

HF雷达这块我一直觉得是被低估的方向。很多人一听到雷达就想到微波相控阵、毫米波,但3-30MHz这个频段的高频地波雷达,在海洋动力环境监测、超视距目标探测这些场景里,一直是不可替代的存在。我最近正好在做一个电离层回波方向估计的Matlab仿真…

作者头像 李华
网站建设 2026/10/17 5:29:13

机器人技术十年演进:硬件降价、算法换血与工程实战

整理工作电脑里的旧文件,翻到2015年给一台六轴机械臂调运动规划的代码备份,忽然发现那段程序里用到的算法库,现在已经找不到默认兼容的版本了。十年时间,机器人技术演进的速度,比很多人感知到的要快得多——但这种快有…

作者头像 李华