用免费 Embedding API 构建 RAG 知识库
Retrieval-Augmented Generation(RAG)是当下最实用的 AI 应用模式——让 LLM 在回答时"参考"你的私有知识库,而不是凭空编造。本文手把手教你用免费 API 从零搭建一个完整 RAG 系统。
RAG 架构速览
用户提问 → 向量化查询 → 向量数据库检索 → 召回相关文档片段 → 拼接 Prompt → LLM 生成回答
核心组件:
| 组件 | 用途 | 免费选择 |
|---|---|---|
| Embedding 模型 | 向量化文档和查询 | OpenAI text-embedding-3-small / BGE-m3 |
| 向量数据库 | 存储和检索向量 | Chroma(开源)/ LanceDB |
| LLM | 生成最终回答 | Gemini 1.5 Flash / DeepSeek / Groq |
| 文档加载器 | 解析 PDF/网页/Markdown | LangChain / LlamaIndex |
第一步:环境准备
pip install chromadb openai langchain langchain-community
通过 APIShare 统一接入,只需一个 token 就能调用多种 Embedding 和 LLM:
import os
os.environ["OPENAI_API_KEY"] = "your-apishare-token"
os.environ["OPENAI_BASE_URL"] = "https://apishare.cc/v1"
第二步:加载并切分文档
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载你的知识库文档
loader = TextLoader("./knowledge_base.txt")
documents = loader.load()
# 切分为 500 字符的块,重叠 50 字符
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?", " ", ""]
)
chunks = text_splitter.split_documents(documents)
print(f"共切分 {len(chunks)} 个文档块")
第三步:向量化并存入 Chroma
用免费 Embedding API 将文档块转为向量:
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# 使用 OpenAI 兼容的 Embedding API
embedding = OpenAIEmbeddings(
model="text-embedding-3-small",
dimensions=512 # 降维节省存储
)
# 向量化并存入 Chroma
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embedding,
persist_directory="./chroma_db"
)
print(f"向量数据库已创建,共 {len(chunks)} 条记录")
如果追求更好的中文效果,可以切换为 BGE-m3:
# 使用 Hugging Face 的 BGE-m3(通过 APIShare 统一路由)
embedding = OpenAIEmbeddings(
model="BAAI/bge-m3",
openai_api_base="https://apishare.cc/v1",
dimensions=1024
)
第四步:构建检索器
retriever = vectorstore.as_retriever(
search_type="mmr", # 最大边际相关性,兼顾相关性和多样性
search_kwargs={"k": 5} # 返回 Top 5 最相关文档块
)
# 测试检索
query = "APIShare 支持哪些 Embedding 模型?"
results = retriever.invoke(query)
for i, doc in enumerate(results):
print(f"--- 结果 {i+1} ---")
print(doc.page_content[:200])
第五步:拼接 Prompt 并调用 LLM
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# 使用免费 LLM
llm = ChatOpenAI(
model="gemini-2.0-flash", # 或 deepseek-chat、groq/llama-3.1-8b
temperature=0.3
)
# 构建 RAG Prompt 模板
template = """你是一个知识助手。请根据以下参考资料回答用户问题。
如果无法从参考资料中找到答案,请如实说明。
参考资料:
{context}
用户问题:{question}
回答:"""
prompt = ChatPromptTemplate.from_template(template)
# 组装 RAG Chain
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 提问!
answer = rag_chain.invoke("APIShare 支持哪些 Embedding 模型?")
print(answer)
第六步:进阶优化
6.1 混合检索(Hybrid Search)
结合关键词检索(BM25)和向量检索,兼顾精确匹配和语义召回:
from langchain.retrievers import BM25Retriever, EnsembleRetriever
# 关键词检索器
bm25_retriever = BM25Retriever.from_documents(chunks, k=3)
# 向量检索器
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# 混合检索,权重 50/50
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.5, 0.5]
)
6.2 重排序(Re-ranking)
对召回的文档用更强的模型重新排序,提升 Top 3 精度:
# 使用 BGE-reranker 或 Cohere Rerank 免费层
from langchain.retrievers import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
compressor = CohereRerank(model="rerank-english-v3.0", top_n=3)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=retriever
)
6.3 多轮对话支持
加入历史消息上下文,让 RAG 支持追问:
from langchain_core.messages import HumanMessage, AIMessage
chat_history = []
def rag_with_history(query):
# 检索历史感知的上下文
context_docs = retriever.invoke(query)
context = format_docs(context_docs)
messages = [
{"role": "system", "content": f"参考资料:{context}"},
*chat_history[-6:],
{"role": "user", "content": query}
]
response = llm.invoke(messages)
chat_history.append({"role": "user", "content": query})
chat_history.append({"role": "assistant", "content": response.content})
return response.content
# 第一轮
print(rag_with_history("APIShare 的免费额度是多少?"))
# 第二轮(依赖上文)
print(rag_with_history("那它支持哪些模型?"))
完整项目结构
my-rag/
├── knowledge_base.txt # 你的知识库文档
├── chroma_db/ # 向量数据库持久化目录
├── rag_engine.py # RAG 核心逻辑
├── ingest.py # 文档加载与向量化
└── query.py # 交互式查询
成本分析
| 组件 | 免费额度 | 适用场景 |
|---|---|---|
| OpenAI Embedding | APIShare 共享池 | 开发测试,小规模知识库 |
| BGE-m3 | 1000次/天 | 中文场景,中等规模 |
| Chroma | 完全免费开源 | 任意规模 |
| Gemini 1.5 Flash | 1500次/天 | 日常 RAG 问答 |
| DeepSeek | 500次/天 | 复杂推理问答 |
零成本运行一个日均 100 次查询的 RAG 系统完全可行。
总结
本文完整演示了用免费 API 搭建 RAG 系统的全流程:文档加载 → 切分 → Embedding 向量化 → Chroma 存储 → 检索 → LLM 生成。通过 APIShare 统一入口,你可以在一个 SDK 内自由切换 Embedding 模型和 LLM,零成本构建生产级 RAG 应用。
下一步建议:
- 尝试多模态 RAG(图片 + 文字)
- 接入更多数据源(PDF、网页、数据库)
- 使用 Agent 框架实现自主决策检索
🚀 立即开始:免费 API 一键调用
想要无需逐一注册、统一鉴权调用以上全部免费模型?Apishare.cc 提供统一 API Key,一个 Key 调用 100+ 模型,免费模型零成本直连。
👉 立即注册 Apishare.cc → 获取你的统一 API Key
📊 想看更多免费模型排行?查看 2026年9月 免费 LLM API 综合实力榜单 →
免费 API 聚合平台说明
本文涉及的模型均由 APIShare 免费 API 聚合平台 统一接入,一份 Key 调用全站模型。
- 完整模型目录:APIShare 免费 API 目录
- 注册即送免费额度:注册领取 API Key