โ† Back to articles
Detailed Usage

Building a RAG Knowledge Base with Free Embedding APIs

Building a RAG Knowledge Base with Free Embedding APIs

Retrieval-Augmented Generation (RAG) is the most practical AI application pattern today โ€” letting LLMs "reference" your private knowledge base rather than hallucinating answers. This tutorial walks you through building a complete RAG system from scratch using free APIs.

RAG Architecture Overview

User Query โ†’ Embed Query โ†’ Vector DB Search โ†’ Retrieve Relevant Chunks โ†’ Assemble Prompt โ†’ LLM Generates Answer

Core components:

Component Purpose Free Option
Embedding Model Vectorize documents and queries OpenAI text-embedding-3-small / BGE-m3
Vector Database Store and search vectors Chroma (OSS) / LanceDB
LLM Generate final answer Gemini 1.5 Flash / DeepSeek / Groq
Document Loader Parse PDF/Web/Markdown LangChain / LlamaIndex

Step 1: Environment Setup

pip install chromadb openai langchain langchain-community

Access multiple embedding and LLM models through APIShare with a single token:

import os
os.environ["OPENAI_API_KEY"] = "your-apishare-token"
os.environ["OPENAI_BASE_URL"] = "https://apishare.cc/v1"

Step 2: Load and Split Documents

from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

loader = TextLoader("./knowledge_base.txt")
documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", ".", "?", "!", " ", ""]
)
chunks = text_splitter.split_documents(documents)
print(f"Split into {len(chunks)} chunks")

Step 3: Embed and Store in Chroma

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

embedding = OpenAIEmbeddings(
    model="text-embedding-3-small",
    dimensions=512
)

vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embedding,
    persist_directory="./chroma_db"
)
print(f"Vector DB created with {len(chunks)} records")

For better Chinese performance, switch to BGE-m3:

embedding = OpenAIEmbeddings(
    model="BAAI/bge-m3",
    openai_api_base="https://apishare.cc/v1",
    dimensions=1024
)

Step 4: Build the Retriever

retriever = vectorstore.as_retriever(
    search_type="mmr",
    search_kwargs={"k": 5}
)

query = "What embedding models does APIShare support?"
results = retriever.invoke(query)
for i, doc in enumerate(results):
    print(f"--- Result {i+1} ---")
    print(doc.page_content[:200])

Step 5: Assemble Prompt and Call 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 = ChatOpenAI(
    model="gemini-2.0-flash",
    temperature=0.3
)

template = """You are a knowledgeable assistant. Answer based on the reference materials below.
If you cannot find the answer in the references, say so honestly.

Reference Materials:
{context}

User Question: {question}

Answer:"""

prompt = ChatPromptTemplate.from_template(template)

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("What embedding models does APIShare support?")
print(answer)

Step 6: Advanced Optimization

Combine keyword (BM25) and vector retrieval for precision + semantics:

from langchain.retrievers import BM25Retriever, EnsembleRetriever

bm25_retriever = BM25Retriever.from_documents(chunks, k=3)
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, vector_retriever],
    weights=[0.5, 0.5]
)

6.2 Re-ranking

Re-rank retrieved documents with a stronger model for better Top-3 precision:

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 Multi-turn Conversation

Add chat history for follow-up question support:

chat_history = []

def rag_with_history(query):
    context_docs = retriever.invoke(query)
    context = format_docs(context_docs)

    messages = [
        {"role": "system", "content": f"Reference: {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

Project Structure

my-rag/
โ”œโ”€โ”€ knowledge_base.txt      # Your knowledge base
โ”œโ”€โ”€ chroma_db/              # Persisted vector DB
โ”œโ”€โ”€ rag_engine.py           # Core RAG logic
โ”œโ”€โ”€ ingest.py               # Document loading & embedding
โ””โ”€โ”€ query.py                # Interactive query

Cost Analysis

Component Free Tier Best For
OpenAI Embedding APIShare shared pool Dev/test, small KB
BGE-m3 1,000 calls/day Chinese scenarios, medium scale
Chroma Fully free & open-source Any scale
Gemini 1.5 Flash 1,500 calls/day Daily RAG Q&A
DeepSeek 500 calls/day Complex reasoning

Running a RAG system with 100 queries/day at zero cost is entirely feasible.

Conclusion

This tutorial demonstrated the complete RAG pipeline: document loading, splitting, embedding, Chroma storage, retrieval, and LLM generation. Through APIShare's unified endpoint, you can freely switch between embedding models and LLMs within a single SDK, building production-grade RAG applications at zero cost.

Next steps:

  • Try multimodal RAG (images + text)
  • Integrate more data sources (PDF, web, databases)
  • Use Agent frameworks for autonomous retrieval decisions

๐Ÿš€ Get Started: One-Click Free API Access

Want to call all the free models above with a single API key, no need to sign up for each provider? Apishare.cc provides a unified API Key โ€” one key, 100+ models, free models at zero cost.

๐Ÿ‘‰ Register on Apishare.cc โ†’ Get your unified API Key

๐Ÿ“Š Want to see more free model rankings? Check out the Sep 2026 Free LLM API Rankings โ†’


About the Free API Aggregator

The models covered in this guide are all served through the APIShare free API aggregator, which gives you one key for the whole catalog.

More in this category

Free AI Content Moderation API Guide 2026: Llama Guard 3 vs Perspective vs OpenAIFree OCR and Document Parsing API in PracticeIntegrating Free APIs into Your Local IDEConnecting Free Models to OpenCode in PracticeApplying for an OpenRouter API Key and Understanding Pricing

Ready to use free LLM APIs?

APIShare aggregates free AI APIs worldwide โ€” sign up and get bonus credits.