AI News HubLIVE
站內改寫3 分鐘閱讀

突破上下文視窗限制:使用 Amazon Bedrock AgentCore 實現遞迴語言模型

本文介紹瞭如何利用 Amazon Bedrock AgentCore Code Interpreter 和 Strands Agents SDK 實現遞迴語言模型(RLM),從而能夠處理任意長度的文件,徹底擺脫上下文視窗的限制。透過將文件作為外部環境,模型透過程式設計方式迭代分析,呼叫子LLM進行語義理解,實現無上限的文件處理能力。

來源AWS Machine Learning Blog作者: Yuan Tian

在處理數百萬字元的文件時,上下文視窗的限制往往成為瓶頸,即使是最大的上下文視窗也無法滿足需求。模型要麼拒絕輸入,要麼基於不完整的資訊生成答案。那麼,如何推理超出上下文視窗的文件呢?本文將介紹如何使用 Amazon Bedrock AgentCore Code Interpreter 和 Strands Agents SDK 實現遞迴語言模型(RLM),從而處理任意長度的文件,且不受上下文大小的限制。

上下文視窗為何不夠

考慮一個典型的財務分析任務:比較一家公司兩年年報中的指標。每份報告約300-500頁,再加上分析師報告、SEC檔案等,總字元數可達數百萬。當直接將文件傳送給模型時,要麼輸入超出模型上下文視窗限制導致請求失敗,要麼輸入雖適合但模型難以關注長輸入中間的資訊,即“中間迷失”問題。這些失敗模式皆因上下文視窗大小是硬限制,僅靠提示工程無法解決。需要一種將文件大小與模型上下文視窗解耦的方法。

RLM:將上下文視為環境

RLM 由 Zhang 等人在 arXiv:2512.24601 中提出,徹底改變了這一思路。RLM 不將整個文件塞入模型上下文視窗,而是將輸入視為模型可透過程式設計方式互動的外部環境。模型僅接收查詢和可用環境的描述,然後編寫程式碼來迭代搜尋、切片和分析文件。當需要對特定部分進行語義理解時,模型將該分析委託給子LLM呼叫,結果保留在工作記憶體中(Python變數),而非佔用上下文視窗空間。這形成了一個遞迴結構:根LLM透過程式碼編排分析,按需呼叫子LLM執行語義任務,而全文從未進入模型上下文視窗。

架構

下圖展示瞭如何使用 Amazon Bedrock AgentCore Code Interpreter 作為執行環境來實現 RLM。架構包含三個元件:

  • 根LLM代理:基於 Strands Agents SDK 構建,接收使用者查詢並決定執行什麼程式碼。
  • Code Interpreter 會話:以 PUBLIC 網路模式執行,文件作為 Python 變數預載入。
  • llm_query() 函式:注入沙箱,直接從 Code Interpreter 內部呼叫 Amazon Bedrock,子LLM結果保留在 Python 變數中,不會流回根LLM的上下文視窗。

Amazon Bedrock AgentCore Code Interpreter 的 PUBLIC 網路模式允許沙箱進行對外 API 呼叫,持久化會話狀態使得變數和中間結果在多次程式碼執行間累積,為模型提供貫穿整個分析的工作記憶體。

實現步驟

前提條件:擁有 AWS 賬戶及 Amazon Bedrock 基礎模型訪問許可權;Python 3.10+;配置 AWS CLI;熟悉 Python 和 Boto3;配置 PUBLIC 網路模式的 Bedrock AgentCore Code Interpreter;相關 IAM 許可權。

步驟1:啟動 Code Interpreter 會話並載入文件 建立 Bedrock AgentCore Code Interpreter 會話,將文件寫入沙箱:

import boto3
client = boto3.client('bedrock-agentcore', region_name='us-east-1')
response = client.start_code_interpreter_session(
    codeInterpreterIdentifier=code_interpreter_id,
    name="rlm-session",
    sessionTimeoutSeconds=3600
)
session_id = response["sessionId"]
client.invoke_code_interpreter(
    codeInterpreterIdentifier=code_interpreter_id,
    sessionId=session_id,
    name="writeFiles",
    arguments={"content": [{"path": "_context.txt", "text": document}]}
)

步驟2:在沙箱內初始化文件並定義 llm_query() 輔助函式

with open('_context.txt', 'r') as f:
    context = f.read()

def llm_query(prompt: str) -> str:
    response = bedrock_client.invoke_model(
        modelId=sub_model_id,
        body=json.dumps({
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 4096,
            "messages": [{"role": "user", "content": prompt}]
        })
    )
    result = json.loads(response['body'].read())
    return result['content'][0]['text']

步驟3:建立 Strands Agent 並執行查詢 使用 Strands Agents SDK 建立代理,配備 execute_python 工具,然後提交問題。代理將迭代編寫並執行 Python 程式碼,探索文件,提取相關部分,並在需要時呼叫 llm_query()。

評估結果

我們在 LongBench v2 的金融多文件問答子集上進行了評估,包含15個多選題,每個問題需分析多份財務報告,上下文長度達約200萬字元。對比了三種方法:Base(直接傳送文件,200K token視窗)、Long Context(使用Claude的100萬token擴充套件視窗)和 RLM。

關鍵結果:

  • RLM 消除了上下文長度失敗:Base 成功率為46.7%,Long Context 為93.3%,而 RLM 在所有配置下均達到100%成功率。
  • RLM 提升了多數模型的準確率:對於 Claude Sonnet 4.6 和 Opus 4.6,RLM 將準確率從60.0%和66.7%提升至73.3%和80.0%;Claude Haiku 4.5 從33.3%提升至66.7%。但 Claude Sonnet 4.5 無提升(均為66.7%),表明 RLM 效果依賴於根模型分解任務的能力。
  • 子LLM選擇影響有限:使用 Haiku 4.5 作為子LLM與使用相同模型作為根和子LLM相比,準確率無顯著差異。

此外,在程式碼倉庫理解子集(50個問題)上的測試表明,RLM 同樣適用於程式碼庫導航和函式依賴解析等任務。

結論

遞迴語言模型透過將文件視為外部環境並利用程式設計式互動,成功突破了上下文視窗的限制。結合 Amazon Bedrock AgentCore Code Interpreter 的持久化沙箱和子LLM呼叫能力,RLM 能夠以100%成功率處理任意長度的文件,同時提升準確率。這一方法為大規模文件分析、程式碼庫理解等場景提供了可行的解決方案。