切换语言

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 上哪个视觉模型支持图像输入?');

要点

  • 检索 — 关键词重叠是简单基线;需要语义检索时可接入向量库。
  • 生成 — 将检索结果写入 system 消息,约束模型仅依据引用内容作答。
  • 模型 — 使用 模型目录 中的 ID;本示例用 deepseek-ai/DeepSeek-V4-Pro 生成回答。
  • 延伸 — 分块、混合检索、引用标注与评测;LangChain 模式见 LangChain

最后更新于

本页目录

RAG 流水线 · Bitdeer AI