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%成功率處理任意長度的文檔,同時提升準確率。這一方法為大規模文檔分析、代碼庫理解等場景提供了可行的解決方案。