AIREITER

AstaBrief 8B:使用 vLLM 在本機部署私有 RAG

最近更新: 2026-10-02 19:11:39

AstaBrief 8B 並不是檢索器,而是把研究問題與提供給它的科學文獻摘錄,整理成附帶引用的報告。這個界線正是私有部署的關鍵:將生成模型放在防火牆後方,文件解析與搜尋全程留在內部,只把經過排序、帶有穩定來源 ID 的證據交給模型。

AstaBrief 8B 實際需要哪些輸入

AstaBrief 8B 是 Ai2 推出的 80 億參數文字生成模型,以 Qwen3-8B 為基礎,採用 Apache 2.0 授權。官方模型卡將它的輸入定義為研究問題與檢索得到的科學文獻摘錄,而不是讓模型自行搜尋答案。模型卡也提醒,若修改微調時使用的提示或互動格式,可能導致表現下降或輸出不穩定。

本指南使用最終的 allenai/AstaBrief_8B checkpoint。模型卡範例裡的名稱是 allenai/AstaBrief_8B_SFT,那是監督式微調階段的前一個版本。下載 checkpoint 時,應把這個名稱差異視為需要核對的文件細節,不要直接假設兩個模型可以互換。

Ai2 的公開 ScholarQA 儲存庫很適合用來理解參考架構:檢索、選擇性重新排序、論文層級彙整、引文擷取與報告生成,都是彼此分離的元件。即使私有實作以內部索引取代 Semantic Scholar,也應保留這種分層方式。

建立可重現的本機架構

一條私有流程應明確拆成六個階段:

  1. 匯入:解析 PDF、對掃描頁面執行 OCR,並保留文件 ID、標題、頁碼、章節與字元偏移量。
  2. 分塊:將文字切成適中大小的段落,同時保留頁面邊界與標題資訊。
  3. 檢索:在術語、識別碼或精確片語很重要時,結合詞彙搜尋與嵌入檢索。
  4. 重新排序:使用完整問題為第一階段候選結果評分,只保留一小組證據。
  5. 組裝:指派不可變更的引用 ID,並按照 AstaBrief 預期的參考資料結構格式化摘錄。
  6. 生成:把組裝完成的提示送到本機 vLLM 端點。

真正重要的設計選擇不是某個特定向量資料庫,而是證據契約:送進模型的每段文字都必須帶有穩定 ID,讓應用程式能將它對應回文件與頁面。

讓引用 ID 維持穩定

請使用 DOC_014_P07_A 這類 ID,而不是陣列位置。檢索設定一改,陣列位置就可能變動;文件、頁碼與段落範圍組成的 ID 則能持續追溯。

把對應關係儲存在提示之外:

{
  "DOC_014_P07_A": {
    "document": "internal_protocol.pdf",
    "page": 7,
    "section": "Methods",
    "char_start": 18420,
    "char_end": 19210
  }
}

提示中的摘錄旁也要顯示相同 ID。生成完成後,拒絕或標記不在本次輸入 ID 集合中的引用。這無法證明引用段落真的支持每一項主張,但至少能擋下最基本的引用捏造。

先決定檢索深度,再組裝上下文

不要把所有符合條件的 chunk 一股腦塞進上下文。第一階段先擴大檢索範圍以提高召回率,再重新排序,最後只打包能放進模型提示預算、且與問題直接相關的段落。若合併同一頁的相鄰 chunk 能保留完整論述,可以進行合併;但如果最終報告需要精確到頁面的追溯能力,就應保留不同 ID。

Ai2 ScholarQA 儲存庫描述了一組參考設定:先檢索 256 個候選結果,重新排序後保留 50 個論文層級結果。這些數值屬於該公開流程,不是 AstaBrief 的通用要求。面對較小的私有文件集,應從更小的範圍開始,檢查遺漏的證據,再根據實際問題調整檢索與上下文限制。

使用 vLLM 提供 AstaBrief 8B

官方資料沒有針對所有 dtype、上下文長度與並行程度公布單一 VRAM 需求。建議先在足以載入未量化 checkpoint 的硬體上開始,再考慮降低並行數或上下文長度,之後才評估量化版本;不要未經測試就假設量化不會影響引用行為。

在符合 CUDA 與 PyTorch 堆疊的乾淨環境中安裝 vLLM,接著使用最終 checkpoint 啟動 OpenAI 相容伺服器:

pip install -U vllm openai

vllm serve allenai/AstaBrief_8B \
  --host 127.0.0.1 \
  --port 8000 \
  --dtype auto \
  --max-model-len 16000

--max-model-len 設定的是操作上限,不代表每個請求都應包含 16,000 個 token;模型卡指出訓練最大長度為 16,000 token,而範例生成時使用的是 max_tokens=4096。

確認本機端點正常運作

curl http://127.0.0.1:8000/v1/models

接著使用與微調資料相同風格的提示呼叫模型。官方範例使用溫度 0.7、top-p 0.95、最多生成 4,096 個 token,並以 tokenizer 的 EOS token 作為停止條件。

from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8000/v1",
    api_key="local-only",
)

response = client.chat.completions.create(
    model="allenai/AstaBrief_8B",
    temperature=0.7,
    top_p=0.95,
    max_tokens=4096,
    messages=[
        {"role": "user", "content": assembled_prompt},
    ],
)

print(response.choices[0].message.content)

私有伺服器應綁定 loopback 或內部介面,將驗證與 TLS 放在閘道層,並封鎖公開流量。模型在本機執行,不代表日誌、暫存 PDF 或追蹤資料就自然具備私密性。

建立私有檢索請求

以下骨架刻意不綁定特定索引實作。真正關鍵的是經過排序的證據清單、不可變更的 ID,以及清楚的提示邊界。

from dataclasses import dataclass
from openai import OpenAI

@dataclass
class Evidence:
    ref_id: str
    text: str
    title: str
    page: int


def build_prompt(question: str, evidence: list[Evidence]) -> str:
    references = "\n\n".join(
        f"[{item.ref_id}] {item.title} (page {item.page})\n{item.text}"
        for item in evidence
    )
    return f"""Research question:
{question}

Retrieved references:
{references}

Write a cited research report answering the question. Use only the supplied
references for factual support. Attach the supplied reference IDs to claims.
If the references do not establish a point, say that the evidence is
insufficient instead of inventing a source.
"""


def answer(question: str, evidence: list[Evidence]) -> str:
    client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="local-only")
    prompt = build_prompt(question, evidence)
    result = client.chat.completions.create(
        model="allenai/AstaBrief_8B",
        temperature=0.7,
        top_p=0.95,
        max_tokens=4096,
        messages=[{"role": "user", "content": prompt}],
    )
    return result.choices[0].message.content

正式環境請使用官方 AstaBrief 提示範本,並在保留參考 ID 的前提下插入檢索到的摘錄。上面的精簡指令只是示範如何串接 vLLM,不能取代微調時採用的格式。

私有索引可以使用 BM25、稠密檢索或混合式檢索。請讓中繼資料一路保留到每個階段。缺少文件 ID 與頁碼的段落,即使生成文字看起來合理,也不足以支撐一份經得起檢驗的研究報告。

正式上線前加入引用與隱私閘門

AstaBrief 在 ScholarQA-CS2 上公布的結果,可以作為背景參考,但不能視為對你自己文件集的保證。在模型卡的 100 題測試集上,AstaBrief 8B 的引用精確率為 90.5、引用召回率為 78.2,答案精確率則為 89.0。引用召回率低於引用精確率,這是一個很實際的提醒:報告可能準確引用了提供的資料,卻仍然漏掉相關證據。

可以設計包含四項檢查的閘門:

  1. 引用有效性:每個生成的引用 ID 都必須存在於本次請求的允許清單中。
  2. 中繼資料解析:每個 ID 都必須能對應到文件、頁碼與已儲存的文字範圍。
  3. 證據支持:由審查者或獨立驗證器確認該段落是否真的支持鄰近的主張。
  4. 檢索召回率:維護一組標註過的小型問題集,其中包含預期文件與頁碼,並在調整分塊、嵌入或重新排序後重新測量遺漏情況。

除非政策明確允許外部服務,否則應讓模型伺服器、索引、物件儲存、日誌與監控都位於同一個信任邊界內。對敏感文件停用請求本文記錄,能遮蔽追蹤資料中的查詢就盡量遮蔽,並明確定義上傳 PDF 與生成報告的保存期限。

不要把 Ai2 公布的 51.1 秒 Fast-mode 數字直接拿來當作本機基準。那個數字描述的是端到端的 Asta 流程,而自行託管的部署會改變 GPU、檢索系統、批次處理、提示長度與網路路徑。請分別測量檢索、重新排序、首 token 延遲、生成時間與完整請求時間。

按層排查部署問題

症狀可能所在層第一個檢查項目
伺服器能載入,但輸出引用品質很差提示或證據契約比對官方格式,並確認參考 ID 是否穩定
引用指向不存在的內容應用程式驗證拒絕不在請求允許清單中的 ID
找不到相關論文檢索在更換模型前,先評估分塊、混合搜尋與重新排序器的召回率
請求發生記憶體不足服務提供或上下文打包降低並行請求數、輸出預算或打包後的上下文,再重新評估量化
本機延遲異常偏高整條流程分別計時檢索、重新排序、排隊與生成
私有資料出現在日誌中營運檢查閘道、vLLM、追蹤、快取與物件儲存的保存設定

按照這種分層方式診斷,可以避免把檢索遺漏誤判成模型故障,也能避免用塞入更多文件的方式,去掩蓋提示格式不相容的問題。

如果你需要專門用於本機報告生成的模型,也願意自行負責檢索品質、來源映射與驗證,AstaBrief 8B 是合適的選擇。vLLM 解決的是模型服務問題,但不會替你提供文件搜尋、引用溯源或隱私控制。

參考資料