RAG 流水线
使用关键词检索与对话补全的最小检索增强生成示例。
本示例维护一个内存中的知识库,用简单的关键词重叠检索相关片段,再通过对话补全基于上下文回答用户问题。
生产环境可替换为向量库与分块流水线。接口说明见 创建对话补全 与 模型目录。
Python 实现
import os
import re
from openai import OpenAI
client = OpenAI(
base_url="https://api-inference.bitdeer.ai/v1",
api_key=os.environ.get("BITDEER_API_KEY", "YOUR_API_KEY"),
)
DOCUMENTS = [
"Bitdeer AI 提供 OpenAI 兼容的 POST /v1/chat/completions。",
"自部署文本模型包括 deepseek-ai/DeepSeek-V4-Pro 与 Qwen/Qwen3.5-397B-A17B。",
"视觉输入通过 messages 中的 image_url 使用支持视觉的模型 ID。",
"完整自部署模型 ID 见模型目录。",
]
def tokenize(text: str) -> set[str]:
return {w for w in re.findall(r"[a-zA-Z0-9]+", text.lower()) if len(w) > 2}
def retrieve(query: str, top_k: int = 3) -> str:
q = tokenize(query)
scored = []
for i, doc in enumerate(DOCUMENTS):
overlap = len(q & tokenize(doc))
if overlap:
scored.append((overlap, i))
scored.sort(reverse=True)
chosen = [DOCUMENTS[i] for _, i in scored[:top_k]]
return "\n\n".join(chosen) if chosen else DOCUMENTS[0]
def answer(query: str) -> str:
context = retrieve(query)
completion = client.chat.completions.create(
model="deepseek-ai/DeepSeek-V4-Pro",
messages=[
{
"role": "system",
"content": (
"你是支持助手。仅根据下列上下文回答;"
"若上下文没有答案,请说明不知道。\n\n"
f"上下文:\n{context}"
),
},
{"role": "user", "content": query},
],
max_tokens=512,
)
return completion.choices[0].message.content or ""
if __name__ == "__main__":
q = "Bitdeer AI 上哪个视觉模型支持图像输入?"
print(answer(q))JavaScript 实现
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.BITDEER_API_KEY!,
baseURL: 'https://api-inference.bitdeer.ai/v1',
});
const DOCUMENTS = [
'Bitdeer AI 提供 OpenAI 兼容的 POST /v1/chat/completions。',
'自部署文本模型包括 deepseek-ai/DeepSeek-V4-Pro 与 Qwen/Qwen3.5-397B-A17B。',
'视觉输入通过 messages 中的 image_url 使用支持视觉的模型 ID。',
'完整自部署模型 ID 见模型目录。',
];
function tokenize(text: string) {
return new Set(
(text.toLowerCase().match(/[a-z0-9]+/g) ?? []).filter((w) => w.length > 2),
);
}
function retrieve(query: string, topK = 3) {
const q = tokenize(query);
const scored = DOCUMENTS.map((doc, i) => {
const d = tokenize(doc);
const overlap = [...q].filter((w) => d.has(w)).length;
return { overlap, i };
})
.filter((x) => x.overlap > 0)
.sort((a, b) => b.overlap - a.overlap)
.slice(0, topK);
const chosen = scored.map((x) => DOCUMENTS[x.i]);
return chosen.length ? chosen.join('\n\n') : DOCUMENTS[0];
}
export async function answer(query: string) {
const context = retrieve(query);
const completion = await client.chat.completions.create({
model: 'deepseek-ai/DeepSeek-V4-Pro',
messages: [
{
role: 'system',
content:
'你是支持助手。仅根据下列上下文回答;若上下文没有答案,请说明不知道。\n\n' +
`上下文:\n${context}`,
},
{ role: 'user', content: query },
],
max_tokens: 512,
});
return completion.choices[0]?.message?.content ?? '';
}
// await answer('Bitdeer AI 上哪个视觉模型支持图像输入?');要点
最后更新于