| 模塊 | 選型 | 關鍵指標 | 開源/官網 |
|---|---|---|---|
| 文檔解析 | LangChain | 支持 PDF、HTML、Markdown | https://python.langchain.com |
| 向量庫 | Weaviate ?? | 平均檢索 P99 22 ms | https://weaviate.io |
| 大模型 | Azure OpenAI GPT-4o | 首 token 延遲 350 ms | https://azure.microsoft.com/products/ai-services/openai-service |
| API 框架 | FastAPI ? | QPS 1k+ | https://fastapi.tiangolo.com |
| 監控 | Prometheus ?? + Grafana | 告警延遲 15 s | https://prometheus.io |
| 維度 | 描述 |
|---|---|
| 用戶 | ADP 內部學員、講師、助教 |
| 場景 | Web 端、企業微信機器人、IDE 插件 |
| SLA | P95 問答延遲 ≤ 500 ms |
| 知識源 | 課程手冊 38 份、實驗手冊 12 份、歷屆 FAQ 5k 條 |
課程編號: ADP-303
章節: Lab3 Kubernetes 網絡
內容: 使用 Calico 作為 CNI,默認 IPPool 為 192.168.0.0/16...

from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = DirectoryLoader("data/", glob="**/*.pdf")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = splitter.split_documents(docs)
import weaviate
client = weaviate.Client("http://localhost:8080")
with client.batch as batch:
for c in chunks:
batch.add_data_object(
data_object={"text": c.page_content},
class_name="ADPKnowledge"
)
| 參數 | 值 |
|---|---|
| Embedding 模型 | text-embedding-3-small |
| 維度 | 1536 |
| 索引類型 | HNSW |
| ef_construction | 128 |
from fastapi import FastAPI
from pydantic import BaseModel
import weaviate, openai, os
app = FastAPI()
client = weaviate.Client("http://localhost:8080")
openai.api_key = os.getenv("AZURE_OPENAI_KEY")
class Query(BaseModel):
q: str
@app.post("/ask")
def ask(query: Query):
near_text = {"concepts": [query.q]}
res = client.query.get("ADPKnowledge", ["text"])\
.with_near_text(near_text)\
.with_limit(5)\
.do()
context = " ".join([r["text"] for r in res["data"]["Get"]["ADPKnowledge"]])
prompt = f"根據以下內容回答:{context}\n問題:{query.q}"
gpt_resp = openai.ChatCompletion.create(
engine="gpt-4o",
messages=[{"role": "user", "content": prompt}],
max_tokens=256,
temperature=0.1
)
return {"answer": gpt_resp.choices[0].message.content}
| 并發 | 平均延遲 | P95 延遲 | 錯誤率 |
|---|---|---|---|
| 10 | 190 ms | 260 ms | 0 % |
| 50 | 310 ms | 420 ms | 0 % |
| 100 | 480 ms | 560 ms | 0.2 % |
結論:單副本即可滿足 SLA,后續可水平擴展。
| 指標 | 數值 | 備注 |
|---|---|---|
| 問答總量 | 12,873 | 來源:Prometheus |
| 命中率 | 89.4 % | 人工抽檢 200 條 |
| 用戶滿意度 | 4.6 / 5 | 企業微信投票 1,024 份 |
| 成本 | 0.003 美元/次 | Azure 賬單 |
| 措施 | 說明 |
|---|---|
| 內容過濾 | Azure Content Safety API 雙層過濾 |
| 權限隔離 | Weaviate API Key + 子網 ACL |
| 審計日志 | 全鏈路 Request ID,保留 30 天 |
用戶提問:
“Pod 無法跨節點通信,但同節點正常,如何排查?”
RAG 回答:
calico/node Pod 日志是否有 BGP not ready CALICO_IPV4POOL_IPIP=Always結果:用戶 3 分鐘定位到防火墻策略問題,實驗提前 40 分鐘完成。
name: deploy-rag-api
on:
push:
branches: [main]
jobs:
docker-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/build-push-action@v5
with:
tags: ghcr.io/adp-it/rag-api:latest
| 擴展點 | 說明 | 示例 |
|---|---|---|
| 多租戶 | Weaviate 類名加前綴 | TenantA_ADPKnowledge |
| 多語言 | 引入 zh_core_web_sm |
Spacy 中文分詞 |
| 實時更新 | Kafka + Debezium CDC | 課程手冊更新秒級同步 |
| 維度 | 傳統 FAQ | RAG 方案 |
|---|---|---|
| 更新周期 | 1~2 周 | 分鐘級 |
| 命中率 | 45 % | 89 % |
| 擴展性 | 人工維護 | 自動切片 |
| 多輪對話 | 不支持 | 支持 |
通過 RAG 低延遲架構,我們在 2 天內將 ADP IT 課程的零散知識轉化為可對話、可擴展、可觀測的問答 API;在保證安全合規的同時,把平均響應時間控制在 500 ms 以內,用戶體驗和運維成本實現雙贏。未來可繼續接入更多企業知識庫,打造統一的企業級 AI 助手底座。