手把手教程:使用 Oxlo.ai Embeddings 向量化文档库,cosine similarity 取 Top-K,最终用 Oxlo.ai LLM 生成答案;全程基于 OpenAI SDK 兼容接口,无需自建向量数据库。
我们需要构建一个最小化的检索增强生成(RAG)管道:使用 Oxlo.ai 的 Embeddings 对文档语料库进行向量化,通过余弦相似度检索最匹配的结果,然后使用 Oxlo.ai 的 LLM 生成有据可查的回答。这个模式适用于为内部文档、支持知识库或产品目录添加语义搜索的场景,无需额外部署独立的向量数据库。
需要 Python 3.10 或更高版本。
需要一个来自 https://portal.oxlo.ai 的 Oxlo.ai API Key。
安装 OpenAI SDK 和 numpy:pip install openai numpy python-dotenv。
我将 API Key 放在 .env 文件中,避免硬编码。客户端配置与 OpenAI SDK 完全相同,只需将端点指向 Oxlo.ai。
# .env
# OXLO_API_KEY=your_key_here
import os
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(
base_url="https://api.oxlo.ai/v1",
api_key=os.getenv("OXLO_API_KEY")
)
本示例使用几句关于 Oxlo.ai 的描述。在生产环境中,这里可以替换成你的 Wiki、帮助中心或研究论文。
CORPUS = [
"Oxlo.ai offers flat per-request pricing for LLM inference. Unlike token-based providers, cost does not scale with input length.",
"The platform hosts 45+ models including Llama 3.3 70B, Qwen 3 32B, DeepSeek R1, and Kimi K2.6.",
"Oxlo.ai is fully OpenAI SDK compatible. You can switch your base URL and API key to start using it.",
"Embeddings available on Oxlo.ai include BGE-Large and E5-Large for vector search applications.",
"Oxlo.ai provides vision models such as Gemma 3 27B and Kimi VL A3B, plus image generation through Flux.1 and Stable Diffusion 3.5.",
]
我使用 Oxlo.ai Embeddings 类别中的 bge-large 模型。通过同一个 OpenAI 兼容的客户端调用 Embeddings 端点。
import numpy as np
def get_embedding(text):
text = text.replace("\n", " ")
resp = client.embeddings.create(
model="bge-large",
input=[text],
)
return np.array(resp.data[0].embedding, dtype=np.float32)
corpus_embeddings = np.vstack([get_embedding(doc) for doc in CORPUS])
print(f"Embedded {len(CORPUS)} documents into shape {corpus_embeddings.shape}")
这是一个纯 numpy 实现。它接收查询向量,计算与语料库的余弦相似度,返回 top-k 个片段。
def retrieve(query, top_k=2):
q_emb = get_embedding(query)
# Cosine similarity
norms = np.linalg.norm(corpus_embeddings, axis=1) * np.linalg.norm(q_emb)
similarities = corpus_embeddings.dot(q_emb) / norms
top_idx = np.argsort(similarities)[::-1][:top_k]
return [CORPUS[i] for i in top_idx], similarities[top_idx].tolist()
系统提示词指示模型严格依据检索到的上下文回答,避免幻觉。我会在运行时将检索到的文档注入 {context} 占位符。
SYSTEM_PROMPT = """You are a precise information retrieval assistant.
Answer the user's question using ONLY the provided context below.
If the context does not contain enough information, say you do not know.
Do not make up facts. Cite the relevant sentence in your answer.
Context:
{context}
"""
这个函数编排两个阶段:检索、格式化提示词,然后通过 Oxlo.ai 调用 llama-3.3-70b。由于 Oxlo.ai 采用按次计费模式,检索片段带来的长上下文窗口不会像按 Token 计费那样推高成本。
def answer(query):
docs, scores = retrieve(query, top_k=2)
context = "\n".join(f"- {d}" for d in docs)
prompt = SYSTEM_PROMPT.format(context=context)
response = client.chat.completions.create(
model="llama-3.3-70b",
messages=[
{"role": "system", "content": prompt},
{"role": "user", "content": query},
],
temperature=0.1,
)
return {
"query": query,
"retrieved": docs,
"scores": scores,
"answer": response.choices[0].message.content,
}
以下是驱动脚本及输出结果。
if __name__ == "__main__":
result = answer("What pricing model does Oxlo.ai use?")
print("Query:", result["query"])
print("Retrieved:")
for d, s in zip(result["retrieved"], result["scores"]):
print(f" [{s:.3f}] {d}")
print("Answer:", result["answer"])
Query: What pricing model does Oxlo.ai use?
Retrieved:
[0.912] Oxlo.ai offers flat per-request pricing for LLM inference. Unlike token-based providers, cost does not scale with input length.
[0.745] The platform hosts 45+ models including Llama 3.3 70B, Qwen 3 32B, DeepSeek R1, and Kimi K2.6.
Answer: Oxlo.ai uses a flat per-request pricing model for LLM inference. Unlike token-based providers, the cost does not scale with input length.
当文档规模超过几千条时,可以将内存中的 numpy 索引替换为真正的向量数据库,如 Qdrant 或 Pinecone。你还可以尝试利用 Oxlo.ai 按次计费的定价方式做重排序或多跳检索工作流,在这些场景下长上下文不会增加成本。详情参见 https://oxlo.ai/pricing。