结论先行
很多团队想做企业知识库,卡在"要分别接 embedding 模型和大模型、还要管多家 Key"。如果你的目标是先把 RAG 跑通,用聚合 API(一个 Key + 一个 base_url 调通 LLM 和 embedding)是最省心的起点。本文用 TokenPortal 的 OpenAI 兼容接口,给你一份可直接改的最小实现。
一、RAG 链路到底长什么样
RAG(检索增强生成)把"查资料"和"写答案"分开,链路是六步:
- 文档加载:PDF / Word / Markdown / 网页
- 切片(chunk):把长文档切成有语义边界的小块
- 向量化(embedding):每块变成一个向量
- 入库:向量存进向量库(本文用内存 numpy,生产换 FAISS / Milvus)
- 检索:用户提问也变成向量,召回最相似的 k 块
- 重排 + 生成:把召回内容拼进提示词,交给大模型生成答案
准确率不是"接上就有",它取决于切片质量、召回是否命中、以及是否做重排。下面给最小可运行版,重排先省略,后面说怎么加。
二、环境准备
pip install openai numpy
TokenPortal 提供 OpenAI 兼容接口,base_url 和 Key 在控制台获取:
BASE_URL = "https://api.tokenportal.ai/v1" # 控制台获取的网关地址
API_KEY = "YOUR_TOKENPORTAL_KEY" # 控制台获取的 Key
LLM 和 embedding 都从同一个网关出,不用维护两套鉴权。
三、最小实现(Python)
1)切片
def split_text(text, size=400, overlap=80):
chunks, start = [], 0
while start < len(text):
chunks.append(text[start:start + size])
start += size - overlap
return chunks
2)向量化与检索
from openai import OpenAI
import numpy as np
client = OpenAI(base_url=BASE_URL, api_key=API_KEY)
# embedding 模型:在控制台复制你的模型 ID;也可用本地开源 embedding 模型,
# 输出同为向量,不影响后续检索
EMB_MODEL = "替换为你的 embedding 模型 ID"
def embed(texts):
resp = client.embeddings.create(model=EMB_MODEL, input=texts)
return [d.embedding for d in resp.data]
def cosine(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
chunks = split_text(open("手册.txt", encoding="utf-8").read())
vecs = np.array(embed(chunks))
def search(query, k=3):
q = np.array(embed([query])[0])
sims = [cosine(q, v) for v in vecs]
idx = np.argsort(sims)[-k:][::-1]
return [chunks[i] for i in idx]
3)问答
LLM = "deepseek-v4-pro" # 在控制台切换任意已接入模型
def ask(query):
context = "\n---\n".join(search(query))
prompt = f"基于以下资料回答问题,资料没有就回答不知道:\n{context}\n\n问题:{query}"
r = client.chat.completions.create(
model=LLM, messages=[{"role": "user", "content": prompt}])
return r.choices[0].message.content
跑通后 ask("退货政策怎么写?") 就能基于你的文档作答。
四、效果与边界
行业里已有公开案例:某银行将内部知识库接入 RAG 后,问答准确率从约 60% 提升到近 90%;律所用 RAG 审合同,效率提升数倍。但注意:这些是"用对方法"的结果。要让你的知识库达到类似效果,至少做好三件事——切片别太大也别太碎、检索做 top-k 召回后加一层重排(rerank)、定期更新文档向量。重排模型同样可以走同一个聚合网关调用。
五、成本和可观测
RAG 每次问答都消耗 embedding tokens + 生成 tokens,量一大就知道"钱花在哪"。下一期我们聊怎么给 Token 装一个"电表"。如果你不想分别对接多家、又想要统一的使用量统计,可以试试一个接口打通主流模型的方案。
想直接上手,来我主页查看一个接口打通主流模型的方案。

299

被折叠的 条评论
为什么被折叠?



