更新时间:2026-07-28 GMT+08:00
技术原理
特性在SQL引擎中添加新的系统函数llm_query/llm_embed/llm_rerank,当用户在SQL中使用上述函数时,GaussDB内核进行的处理如下图所示:
图1 特性执行流程
GaussDB的SQL引擎执行的步骤如下:
- GaussDB的parser识别出SQL中调用的函数和对应的参数,生成对应的查询计划和其中的表达式。
- GaussDB SQL优化器根据查询优化规则对查询计划进行优化。
- GaussDB SQL执行器在算子中调用llm_query、llm_embed、llm_rerank函数,在算子中的每行数据上执行。
- 对于每行数据,执行器从系统表中获取到该函数所调用的模型服务相关信息,根据系统表中记录的请求参数和函数中定义的prompt,生成模型服务调用的JSON请求。
- JSON请求通过https请求传递到外部的模型服务的端口上。
- 模型服务返回的结果在算子中生成对应的返回结果,在执行器中传递生成最终的查询结果。
功能在执行器执行线程里执行模型调用的请求,为避免模型服务的高延时造成对执行的阻塞,其通过如下两个优化方式提升系统的吞吐率并控制资源:
- 设置超时时间:针对单次模型服务的调用设置超时时间。超过设定的时间则终止该查询的执行。模型超时时间通过GUC参数endpoint_timeout_limit进行设置。
- 控制连接池的并发数:在单个查询中,针对多条数据,使用连接池控制整体连接的并发度。连接池使用libcurl中的多句柄机制实现。在libcurl中可以通过创建多个句柄,实现在单个线程之内并发处理多个异步请求,句柄的数量由guc参数llm_max_connections控制。
另外当查询计划存在同一个语义函数(仅支持llm_embed和llm_rerank)在表上多次调用时,会改写标准project算子生成批量调用请求。
例如当用户输入下列SQL命令:
select llm_embed('bge-embedding', 'Summarize the review below'||T.content) from T 默认的查询计划会对该表上每一行数据生成一次模型调用请求,示意查询计划如下所示:
Result [
llm_embed(concat('Summarize the review below: ', T.content))
]
└── SeqScan on T 当模型服务支持批量推理接口时,针对标准的Result[]算子,BATCH优化规则在查询计划里做如下改动:
- 添加Row To Vector 算子,将多行数据聚集成一个Chunk。
- 添加Vector执行算子,将一个Chunk中所有的行合并成对应的批调用请求,进行模型调用。
- 添加Vector To Row算子,在模型服务返回结果之后,将批请求的结果展开成对应的行数据。
例如上述的查询在执行查询优化之后,示意的查询计划如下所示:
Result
└── Vector to Row
└── Vector Result [
newspaper = llm_embed(concat('Summarize the review below: ', T.content))
]
└── Row To Vector on T
└── SeqScan on T 父主题: 模型调用