我的 SQLite 表中有数据,我想以“块”的形式处理这些数据,其中包括多行的串联字段,每个块的总体限制为 10,000 个字符。如果有帮助的话,我可以多次运行查询并写入临时表。但是,我不想多次运行同一行的数据。 我的主要限制是各个块的总长度。 我想通过连接多行来最大化每个输出块,直到无法再容纳 10,000 个字符的长度限制。
数据看起来有点像这样:
ID Customer Purchase
1 john 2x bolts, 2x screws, 5x lumber
2 jim 3x lumber, 1x screws, 14x nails
3 john 15x screws, 2x sodas, 2x, hotdogs
4 jim 1x foobars
etc...
假设我的长度限制是每个 group_concat(ed)“购买”50 个字符,我们忽略 ID,并基于“客户”进行分组,我希望输出为 john 创建两个块,为 jim 创建一个块。 (因为 jim 的两个购买字符串都可以连接并保持在 50 个字符的限制内) 如果我的块限制是 35,那么我就有 4 个块。 如果是 100,我就买 2。
目的是在单个 LLM 提示中获取尽可能多的数据,因为它可以立即接受,而不会使它过载。 我最终将与单个客户关联的多个 JSON(“购买”字段)组合在一起,并让法学硕士将这些 JSON 提取为一个仅包含每个 JSON 的相关信息的 JSON。 我怀疑,我必须进行多次传递,因为客户可能有 100k 个字符的 JSON 需要处理,而且我什至必须重新处理经过蒸馏的 LLM 输出。 幸运的是,我没有任何单独的行已经超过 10k 个字符。
如果块的填充足够智能,可以根据在达到限制之前可用的长度并选择长度 >= ( limit - 当前块长度)
如果有必要的话,我正在 Ubuntu 24 和 Python 3.12 上使用 SQLite。 在 Python 中进行上述一些处理也是一种选择。
我尝试询问人工智能,包括 Github Copilot,他们要么没有完全理解这个概念,要么没有生成 SQLite 可以处理的可用查询。 或者它只会处理给定客户的前 10k 个字符,不会为该客户创建任何其他块。
这并不完美,但应该足够好了。这个想法是在客户的所有先前行跨越块大小的倍数的地方创建组,然后对这些组进行 group_concat。
由于您使用的是 10000 块,所以应该没什么大不了的,但是如果您购买了 9000 块长块,然后是 2000 块,然后是 9000 块,然后是 2000 块,那么就会有 4 组,尽管显然可以将 2 2000 块组合在一起。如果您有这样的长值,您可能需要摆弄顺序。
WITH cte AS (
SELECT
Customer,
Purchase,
(SUM(LENGTH(Purchase)+2) OVER ( -- +2 for the length of the group_concat separator
PARTITION BY Customer ROWS UNBOUNDED PRECEDING
)-3)/10000 as LengthGroup
FROM purchases
)
SELECT
Customer,
GROUP_CONCAT(Purchase, ', ') AS Purchases
FROM cte
GROUP BY Customer, LengthGroup;