RECOMP: Improving Retrieval-Augmented LMs with Compression and Selective Augmentation

828 篇文章

已下架不支持订阅

本文提出RECOMP方法,通过压缩检索文档并进行选择性增强,降低推理成本,提高语言模型在各种任务中的性能。研究了提取压缩器和抽象压缩器,能够在保持性能的同时显著压缩文档,且能选择性地不增强无关文档。

本文是LLM系列文章,针对《RECOMP: Improving Retrieval-Augmented LMs with Compression and Selective Augmentation》的翻译。

摘要

在推理时检索文档并在上下文中为其做准备可以提高语言模型在各种任务中的性能。然而,这些文件往往跨越数百个单词,使推理成本大大增加。我们建议在上下文集成之前将检索到的文档压缩为文本摘要。这不仅降低了计算成本,而且减轻了LM在长时间检索的文档中识别相关信息的负担。我们提出了两个压缩器——一个是提取压缩器,它从检索到的文档中选择有用的句子;另一个是抽象压缩器,它通过合成多个文档中的信息来生成摘要。当生成的摘要被准备到LM的输入中时,两个压缩器都经过了训练,以提高LM在最终任务中的性能,同时保持摘要的简洁性。如果检索到的文档与输入无关,或者没有向LM提供额外信息,我们的压缩器可以返回一个空字符串,从而实现选择性扩充。我们在语言建模任务和开放域问答任务上评估了我们的方法。我们实现了低至6%的压缩率,同时两项任务的性能损失最小,显著优于现成的摘要模型。我们证明,我们为一个LM训练的压缩器可以在语言建模任务中转移到其他LM,并提供在很大程度上忠实于检索到的文档的摘要。

1 引言

2 问题公式化:RECOMP

3 学习压缩器

4 实验设置

5 结果

<

已下架不支持订阅

PROCEDURE DMSCAKY.DMS_P_ACTIONCLAIM 编译错误 错误:PL/SQL: ORA-04063: view "DMSCAKY.SERVICES" 有错误 行:25 文本:services ts, 错误:PL/SQL: SQL Statement ignored 行:16 文本:select tp.fnumber, 错误:PLS-00364: 循环索引变量 'I' 的使用无效 行:66 文本:FPartNumber := i.fpartnumber; 错误:PL/SQL: Statement ignored 行:66 文本:FPartNumber := i.fpartnumber; 错误:PLS-00364: 循环索引变量 'I' 的使用无效 行:67 文本:FName := i.fname; 错误:PL/SQL: Statement ignored 行:67 文本:FName := i.fname; 错误:PLS-00364: 循环索引变量 'I' 的使用无效 行:68 文本:FOldProviderCode := i.foldprovidercode; 错误:PL/SQL: Statement ignored 行:68 文本:FOldProviderCode := i.foldprovidercode; 错误:PLS-00364: 循环索引变量 'I' 的使用无效 行:69 文本:FCompleteTime := i.FCompleteTime; 错误:PL/SQL: Statement ignored 行:69 文本:FCompleteTime := i.FCompleteTime; 错误:PLS-00364: 循环索引变量 'I' 的使用无效 行:70 文本:FMileage := i.FMileage; 错误:PL/SQL: Statement ignored 行:70 文本:FMileage := i.FMileage; 错误:PLS-00364: 循环索引变量 'I' 的使用无效 行:71 文本:FServiceCode := i.FServiceCode; 错误:PL/SQL: Statement ignored 行:71 文本:FServiceCode := i.FServiceCode; 错误:PLS-00364: 循环索引变量 'I' 的使用无效 行:72 文本:FVinCode := i.FVinCode; 错误:PL/SQL: Statement ignored 行:72 文本:FVinCode := i.FVinCode; 错误:PLS-00364: 循环索引变量 'I' 的使用无效 行:73 文本:for j in 1 .. i.fnumber loop 错误:PL/SQL: Statement ignored 行:73 文本:for j in 1 .. i.fnumber loop
09-20
<think> 我们正在解决一个PL/SQL存储过程编译错误的问题。用户提到了两个错误: 1. ORA-04063: view "DMSCAKY.SERVICES" 有错误 2. PLS-00364: 循环索引变量 'I' 的使用无效 首先,我们需要分别分析这两个错误的原因和解决方法。 ### 错误1: ORA-04063: view "DMSCAKY.SERVICES" 有错误 这个错误表示视图`DMSCAKY.SERVICES`存在编译错误。当我们尝试编译一个依赖该视图的存储过程时,如果视图本身无效,就会导致这个错误。 解决步骤: 1. 检查视图`DMSCAKY.SERVICES`的状态: ```sql SELECT status FROM all_objects WHERE owner = 'DMSCAKY' AND object_name = 'SERVICES' AND object_type = 'VIEW'; ``` 如果状态是`INVALID`,则需要重新编译视图或检查视图定义。 2. 查看视图的编译错误: ```sql SHOW ERRORS VIEW DMSCAKY.SERVICES; ``` 或者查询`USER_ERRORS`视图: ```sql SELECT line, position, text FROM all_errors WHERE owner = 'DMSCAKY' AND name = 'SERVICES' AND type = 'VIEW'; ``` 3. 根据错误信息修复视图定义。可能是视图所依赖的表或视图发生了变化,或者视图的SQL语句有错误。 ### 错误2: PLS-00364: 循环索引变量 'I' 的使用无效 这个错误通常发生在PL/SQL循环中,索引变量`I`的使用方式不正确。常见原因包括: - 在循环内修改了索引变量`I`的值(例如,在循环体内执行了`i := i+1;`),这是不允许的。 - 在循环条件中使用了不恰当的表达式。 例如,以下代码会导致该错误: ```plsql FOR i IN 1..10 LOOP i := i + 1; -- 这里修改了循环变量i,会导致PLS-00364错误 ... END LOOP; ``` 解决步骤: 1. 在存储过程`DMSCAKY.DMS_P_ACTIONCLAIM`中找到使用循环索引变量`I`的地方(可能是`FOR`循环)。 2. 检查循环体内是否有对索引变量`I`的赋值操作。如果有,应该避免直接修改循环变量,可以引入一个局部变量来代替。 3. 如果循环是`WHILE`循环或`LOOP`循环,确保循环条件中的变量使用正确。 ### 综合解决方案 由于存储过程`DMS_P_ACTIONCLAIM`依赖于视图`SERVICES`,我们首先需要修复视图的错误,然后再修复存储过程中的循环错误。 步骤: 1. 修复视图`DMSCAKY.SERVICES`: - 根据视图的错误信息进行修复,可能需要调整视图的查询语句。 - 重新编译视图:`ALTER VIEW DMSCAKY.SERVICES COMPILE;` 2. 修复存储过程中的循环错误: - 定位到循环索引变量`I`的使用位置。 - 移除对循环索引变量的任何赋值操作,或者改用其他变量。 3. 重新编译存储过程: ```sql ALTER PROCEDURE DMSCAKY.DMS_P_ACTIONCLAIM COMPILE; ``` ### 示例代码修改 假设存储过程中有类似以下有问题的循环: ```plsql FOR i IN 1..claims.count LOOP i := i + 1; -- 错误:修改循环变量 ... END LOOP; ``` 应改为: ```plsql FOR i IN 1..claims.count LOOP -- 使用一个新的变量,而不是修改循环变量i l_index := i + 1; ... END LOOP; ``` 注意:如果循环索引变量`I`在循环条件中被错误使用(比如在`WHILE`循环中),则需要调整循环逻辑。 ### 总结 - 首先解决视图`DMSCAKY.SERVICES`的无效状态,因为它是存储过程编译失败的根本原因之一。 - 然后修复存储过程中循环索引变量`I`的错误使用。 完成这些步骤后,重新编译存储过程应该能够成功。 §§相关问题§§ 1. 如何查询Oracle中无效对象并重新编译? 2. PL/SQL循环中哪些操作会导致编译错误? 3. 如何避免PL/SQL存储过程因依赖对象无效而编译失败? </think> ### 解决 PROCEDURE DMSCAKY.DMS_P_ACTIONCLAIM 的 PL/SQL 编译错误 #### 错误 1:ORA-04063 "视图 DMSCAKY.SERVICES 有错误" **原因分析** 该错误表明存储过程依赖的视图 `DMSCAKY.SERVICES` 本身存在编译错误或失效。Oracle 在编译存储过程时会验证所有依赖对象的状态[^1]。 **解决步骤**: 1. **检查视图状态**: ```sql SELECT status FROM all_objects WHERE owner = 'DMSCAKY' AND object_name = 'SERVICES' AND object_type = 'VIEW'; ``` - 若返回 `INVALID`,需修复视图 2. **诊断视图错误**: ```sql SHOW ERRORS VIEW DMSCAKY.SERVICES; ``` - 或查询错误详情: ```sql SELECT line, position, text FROM all_errors WHERE owner = 'DMSCAKY' AND name = 'SERVICES'; ``` 3. **常见修复方案**: - 重新编译视图: ```sql ALTER VIEW DMSCAKY.SERVICES COMPILE; ``` - 检查视图依赖的表是否被修改或删除 - 确认视图 SQL 语法正确(特别是 JOIN 条件) --- #### 错误 2:PLS-00364 "循环索引变量 'I' 使用无效" **原因分析** 此错误通常发生在 `FOR` 循环中非法修改索引变量: ```plsql FOR i IN 1..10 LOOP i := i + 1; -- 错误!禁止修改循环索引 END LOOP; ``` **解决步骤**: 1. **定位问题代码**: 在存储过程中搜索 `FOR i IN ...` 循环结构 2. **修正方案**: - **方案 1**:移除对索引变量的修改 将: ```plsql FOR i IN (SELECT ...) LOOP i := new_value; -- 非法操作 END LOOP; ``` 改为使用中间变量: ```plsql FOR rec IN (SELECT ...) LOOP l_temp := rec.column; -- 通过中间变量修改 END LOOP; ``` - **方案 2**:改用 `WHILE` 循环 ```plsql DECLARE j NUMBER := 1; BEGIN WHILE j <= 10 LOOP j := j + 1; -- 允许修改 END LOOP; END; ``` --- #### 完整验证流程 1. 修复视图 `DMSCAKY.SERVICES` 2. 修改存储过程中的循环逻辑 3. 重新编译存储过程: ```sql ALTER PROCEDURE DMSCAKY.DMS_P_ACTIONCLAIM COMPILE; ``` 4. 检查编译结果: ```sql SELECT status FROM user_objects WHERE object_name = 'DMS_P_ACTIONCLAIM'; ``` > **关键注意事项**: > - 修改后需重新编译**所有依赖** `DMSCAKY.SERVICES` 的对象 > - 使用 `UTL_RECOMP` 批量编译失效对象: > ```sql > EXEC UTL_RECOMP.RECOMP_SERIAL('DMSCAKY'); > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UnknownBody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值