AgDex
🏗 Architecture Guide April 2026 ⭐ Most Asked

RAG vs Fine-tuning vs AI Agents

Which LLM architecture should you choose in 2026? A practical decision guide with costs, tradeoffs, and real-world examples.

📅 April 26, 2026 ⏱ 10 min read 🖊 AgDex Editorial

1. TL;DR — Quick Decision Table

Your SituationBest Approach
Need answers from private docs/DB✅ RAG
Need real-time / live data✅ RAG or Agents
Need custom tone / style / format✅ Fine-tuning
Need domain-specific vocabulary✅ Fine-tuning
Need to take actions (web, APIs, tools)✅ Agents
Need multi-step reasoning / planning✅ Agents
Budget is tight✅ RAG (cheapest)
Speed is critical (<500ms)✅ Fine-tuning
Complex enterprise workflows✅ Agents + RAG

The real answer for most production systems in 2026: you combine all three. But let's understand each one first.

2. RAG — Retrieval-Augmented Generation

🔵 RAG in One Sentence

Retrieve relevant context from your knowledge base at query time, inject it into the prompt, let the LLM answer using that context.

How it works

  1. Ingest: Chunk your documents → embed them → store in a vector DB
  2. Query: Embed the user's question → find top-K similar chunks → retrieve
  3. Generate: Feed retrieved chunks + question to LLM → get grounded answer

Minimal RAG with LangChain

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA

# 1. Ingest documents
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(your_docs)

# 2. Embed and store
embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")

# 3. Query
llm = ChatOpenAI(model="deepseek-chat",
                 base_url="https://api.deepseek.com",
                 api_key="your-key")
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectordb.as_retriever(search_kwargs={"k": 4})
)
answer = qa_chain.invoke({"query": "What is our refund policy?"})
print(answer["result"])

RAG: Pros & Cons

✅ Pros❌ Cons
No model training requiredRetrieval quality matters a lot
Knowledge stays up-to-dateLatency from retrieval step (+100-500ms)
Cheap — no GPU neededContext window limits how much you can inject
Citable sources ("according to doc X...")Fails on questions needing whole-document reasoning
Easy to update knowledgeChunking strategy heavily affects quality

Best for: Customer support bots, internal knowledge bases, document Q&A, code search, legal/medical document retrieval.

3. Fine-tuning — Teaching the Model

🟣 Fine-tuning in One Sentence

Update a pre-trained model's weights on your domain-specific data so it internalizes your patterns, tone, and knowledge.

When fine-tuning makes sense

  • You need a very specific output format (e.g., always return JSON, always follow a template)
  • You need a custom tone that prompting alone can't reliably enforce
  • You have a narrow, well-defined task with thousands of examples
  • You need maximum speed — fine-tuned smaller models beat large prompted models on latency
  • You want to reduce prompt length (the model already knows the context)

Fine-tuning with OpenAI API

import json
from openai import OpenAI

client = OpenAI(api_key="your-openai-key")

# 1. Prepare training data (JSONL format)
# Each line: {"messages": [{"role":"system","content":"..."}, 
#              {"role":"user","content":"..."}, 
#              {"role":"assistant","content":"..."}]}

# 2. Upload training file
with open("training_data.jsonl", "rb") as f:
    file_obj = client.files.create(file=f, purpose="fine-tune")

# 3. Create fine-tuning job
job = client.fine_tuning.jobs.create(
    training_file=file_obj.id,
    model="gpt-4o-mini",  # or gpt-3.5-turbo
    hyperparameters={"n_epochs": 3}
)
print(f"Job ID: {job.id}")

# 4. Monitor (poll until status == "succeeded")
# job = client.fine_tuning.jobs.retrieve(job.id)
# Use job.fine_tuned_model once complete

# 5. Use fine-tuned model
response = client.chat.completions.create(
    model="ft:gpt-4o-mini:your-org:your-model:abc123",
    messages=[{"role": "user", "content": "Classify: 'I hate this product'"}]
)
print(response.choices[0].message.content)  # → negative

Fine-tuning: Pros & Cons

✅ Pros❌ Cons
Fastest inference (smaller model)Expensive to train ($10s–$1000s)
Best for consistent format/toneStatic — stale after training cutoff
Shorter prompts = lower API costNeeds high-quality labeled data (hundreds–thousands)
Can outperform larger base models on narrow tasksDoesn't generalize beyond training distribution

Best for: Classification, named entity recognition, format normalization, brand-voice generation, SQL generation, specialized coding tasks.

4. AI Agents — The LLM that Acts

🟢 AI Agents in One Sentence

Give the LLM tools (web search, code execution, APIs, file read/write) and let it reason, plan, and take multi-step actions to complete a goal.

Core agent loop (ReAct pattern)

from openai import OpenAI
import json, subprocess

client = OpenAI(api_key="your-deepseek-key", base_url="https://api.deepseek.com")

tools = [
    {"type": "function", "function": {
        "name": "run_python",
        "description": "Execute Python code and return stdout",
        "parameters": {"type": "object", "properties": {
            "code": {"type": "string", "description": "Python code to run"}
        }, "required": ["code"]}
    }},
    {"type": "function", "function": {
        "name": "web_search",
        "description": "Search the web for current information",
        "parameters": {"type": "object", "properties": {
            "query": {"type": "string"}
        }, "required": ["query"]}
    }}
]

def execute_tool(name, args):
    if name == "run_python":
        result = subprocess.run(["python", "-c", args["code"]],
                                capture_output=True, text=True, timeout=10)
        return result.stdout or result.stderr
    elif name == "web_search":
        return f"[Search results for: {args['query']}]"  # replace with real search

def agent_loop(goal, max_turns=10):
    messages = [{"role": "user", "content": goal}]
    for _ in range(max_turns):
        resp = client.chat.completions.create(
            model="deepseek-chat", messages=messages,
            tools=tools, tool_choice="auto"
        )
        msg = resp.choices[0].message
        messages.append(msg)
        if not msg.tool_calls:
            return msg.content  # done
        for tc in msg.tool_calls:
            args = json.loads(tc.function.arguments)
            result = execute_tool(tc.function.name, args)
            messages.append({"role": "tool", "tool_call_id": tc.id, "content": result})
    return "Max turns reached"

print(agent_loop("Find the top 3 AI agent frameworks by GitHub stars and create a comparison table"))

Agents: Pros & Cons

✅ Pros❌ Cons
Can take real-world actionsHighest latency (multi-step)
Handles complex multi-step reasoningMost expensive (many LLM calls)
Can access live data via toolsCan fail or loop unexpectedly
Flexible — works on open-ended tasksHarder to debug and monitor
No training requiredNon-deterministic output

Best for: Research assistants, coding agents, workflow automation, data analysis, browser automation, long-horizon planning tasks.

5. Full Comparison: Cost, Speed, Complexity

DimensionRAGFine-tuningAgents
Setup costLow ($0–$50)High ($50–$5,000+)Medium ($0 + API)
Inference costLow–MediumLow (smaller model)High (many calls)
LatencyMedium (retrieval + LLM)Fast (small model)Slow (multi-step)
Data neededDocuments onlyLabeled examples (100s–1000s)None
Handles live data✅ (update index)❌ (static)✅ (via tools)
ExplainabilityHigh (cite sources)MediumMedium (tool trace)
Best model sizesAnySmall–Medium (7B–70B)Large (70B+)
Complexity to build⭐⭐⭐⭐⭐⭐⭐⭐⭐
Complexity to maintain⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

6. Decision Tree — Which to Use?

START: What does your app need?
├── Does it need to ACT? (click, write, call APIs)
└── YES → AI AGENTS
├── Does it need info from your private docs?
└── YES → RAG
├── Does it need very specific style/format?
└── YES + have labeled data → FINE-TUNING
├── Does it need real-time web data?
└── YES → AGENTS (with search tool)
├── Need to answer from 100K+ document corpus?
└── YES → RAG + vector DB
└── Need consistent structured output at low cost?
└── YES → FINE-TUNING small model
RULE OF THUMB:
Start with RAG (cheapest, fastest to build)
Add agents when you need actions or autonomy
Add fine-tuning only when RAG/prompting can't get the format right

7. The Real Answer: Combine All Three

Most production LLM applications in 2026 use a combination. Here's how a real enterprise AI assistant works:

Example: Enterprise Customer Support Bot
  • Fine-tuned model → routes and classifies intent (fast, cheap, consistent)
  • RAG → retrieves the right knowledge base articles, order history, product docs
  • Agent → takes actions: creates a ticket, issues a refund, checks order status via API
# Combined architecture pattern

from openai import OpenAI

client = OpenAI(api_key="your-deepseek-key", base_url="https://api.deepseek.com")

def handle_customer_query(user_message: str, customer_id: str):
    
    # Step 1: Fine-tuned classifier (fast, cheap gpt-4o-mini)
    intent = classify_intent(user_message)  # → "refund" | "product_question" | "complaint"
    
    # Step 2: RAG — retrieve relevant context
    if intent in ["product_question", "complaint"]:
        context_docs = retriever.invoke(user_message)  # vector search
        context = "\n".join([d.page_content for d in context_docs])
    else:
        context = ""
    
    # Step 3: Agent — answer + take action if needed
    system = f"""You are a helpful customer support agent.
Customer ID: {customer_id}
{f'Relevant docs:{chr(10)}{context}' if context else ''}"""
    
    messages = [
        {"role": "system", "content": system},
        {"role": "user", "content": user_message}
    ]
    
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages,
        tools=support_tools,  # check_order, issue_refund, create_ticket
        tool_choice="auto"
    )
    
    return handle_response(response, messages)  # execute tools if needed

8. Best Tools for Each Approach in 2026

🔵 RAG Stack

ComponentTop Picks
Vector DBPinecone, Qdrant, Chroma, Weaviate, pgvector
EmbeddingsOpenAI text-embedding-3-small, Voyage AI, Cohere
OrchestrationLangChain, LlamaIndex, Haystack
ObservabilityLangSmith, Langfuse, Helicone

🟣 Fine-tuning Stack

ComponentTop Picks
Cloud fine-tuningOpenAI (gpt-4o-mini), Together AI, Anyscale
Open-source trainingUnsloth, LLaMA-Factory, Axolotl
EvaluationRAGAS, DeepEval, Promptfoo
Experiment trackingW&B Weave, MLflow, Comet ML

🟢 Agent Stack

ComponentTop Picks
FrameworksLangGraph, CrewAI, AutoGen, Google ADK, PydanticAI
Tool integrationComposio, Toolhouse, MCP servers
MemoryMem0, Zep, Letta
ObservabilityLangSmith, AgentOps, Arize Phoenix
HostingE2B (sandboxed code), Modal, Railway

Explore all 420+ tools in each category at AgDex.ai — the comprehensive AI agent tools directory.

💡 2026 starter stack recommendation:
  1. LLM: DeepSeek V4 (deepseek-chat) — best price-performance
  2. RAG: LlamaIndex + Qdrant Cloud (free tier for prototypes)
  3. Agents: LangGraph (most control) or CrewAI (easiest multi-agent)
  4. Observability: Langfuse (open-source, free self-host)
  5. Fine-tune later only if format/latency becomes a bottleneck
AdSense bottom Related
🏗 Guía de arquitectura Abril 2026 ⭐ Lo más preguntado

RAG vs Ajuste fino (Fine-tuning) vs Agentes de IA

¿Qué arquitectura de LLM debería elegir en 2026? Una guía de decisión práctica con costos, compensaciones y ejemplos del mundo real.

📅 26 de abril de 2026 ⏱ 10 min de lectura 🖊 Editorial de AgDex

1. TL;DR — Tabla de decisión rápida

Su situaciónEl mejor enfoque
Necesita respuestas de documentos/BD privados✅ RAG
Necesita datos en tiempo real / en vivo✅ RAG o Agentes
Necesita tono / estilo / formato personalizados✅ Ajuste fino
Necesita vocabulario específico del dominio✅ Ajuste fino
Necesita tomar acciones (web, API, herramientas)✅ Agentes
Necesita razonamiento / planificación de varios pasos✅ Agentes
El presupuesto es ajustado✅ RAG (el más barato)
La velocidad es crítica (<500ms)✅ Ajuste fino
Flujos de trabajo empresariales complejos✅ Agentes + RAG

La respuesta real para la mayoría de los sistemas de producción en 2026: se combinan los tres. Pero primero entendamos cada uno.

2. RAG — Generación Aumentada por Recuperación

🔵 RAG en una frase

Recupere contexto relevante de su base de conocimientos en el momento de la consulta, inyéctelo en la solicitud y permita que el LLM responda utilizando ese contexto.

Cómo funciona

  1. Ingesta: Fragmentar sus documentos → embeberlos → almacenar en una BD vectorial
  2. Consulta: Embeber la pregunta del usuario → encontrar los K fragmentos similares principales → recuperar
  3. Generación: Alimentar los fragmentos recuperados + pregunta al LLM → obtener respuesta fundamentada

RAG mínimo con LangChain

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA

# 1. Ingestar documentos
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(your_docs)

# 2. Embeber y almacenar
embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")

# 3. Consultar
llm = ChatOpenAI(model="deepseek-chat",
                 base_url="https://api.deepseek.com",
                 api_key="your-key")
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectordb.as_retriever(search_kwargs={"k": 4})
)
answer = qa_chain.invoke({"query": "What is our refund policy?"})
print(answer["result"])

RAG: pros y contras

✅ Pros❌ Contras
No requiere entrenamiento de modelosLa calidad de la recuperación importa mucho
El conocimiento se mantiene actualizadoLatencia del paso de recuperación (+100-500 ms)
Económico: no requiere GPULa ventana de contexto limita cuánto se puede inyectar
Fuentes citables ("según el doc X...")Falla en preguntas que necesitan razonamiento de todo el documento
Fácil de actualizar el conocimientoLa estrategia de fragmentación afecta en gran medida la calidad

Ideal para: Bots de atención al cliente, bases de conocimientos internas, preguntas y respuestas sobre documentos, búsqueda de código, recuperación de documentos legales/médicos.

3. Ajuste fino — Enseñando al modelo

🟣 Ajuste fino en una frase

Actualice los pesos de un modelo preentrenado con sus datos específicos del dominio para que internalice sus patrones, tono y conocimiento.

Cuándo tiene sentido el ajuste fino

  • Necesita un formato de salida muy específico (por ejemplo, devolver siempre JSON, seguir siempre una plantilla)
  • Necesita un tono personalizado que el diseño de prompts por sí solo no pueda imponer de manera confiable
  • Tiene una tarea estrecha y bien definida con miles de ejemplos
  • Necesita la máxima velocidad: los modelos más pequeños ajustados superan en latencia a los modelos grandes con prompts
  • Desea reducir la longitud del prompt (el modelo ya conoce el contexto)

Ajuste fino con OpenAI API

import json
from openai import OpenAI

client = OpenAI(api_key="your-openai-key")

# 1. Preparar datos de entrenamiento (formato JSONL)
# Cada línea: {"messages": [{"role":"system","content":"..."}, 
#              {"role":"user","content":"..."}, 
#              {"role":"assistant","content":"..."}]}

# 2. Subir archivo de entrenamiento
with open("training_data.jsonl", "rb") as f:
    file_obj = client.files.create(file=f, purpose="fine-tune")

# 3. Crear trabajo de ajuste fino
job = client.fine_tuning.jobs.create(
    training_file=file_obj.id,
    model="gpt-4o-mini",  # o gpt-3.5-turbo
    hyperparameters={"n_epochs": 3}
)
print(f"Job ID: {job.id}")

# 4. Monitorear (hacer sondeo hasta que el estado sea "succeeded")
# job = client.fine_tuning.jobs.retrieve(job.id)
# Use job.fine_tuned_model una vez completado

# 5. Usar modelo ajustado
response = client.chat.completions.create(
    model="ft:gpt-4o-mini:your-org:your-model:abc123",
    messages=[{"role": "user", "content": "Classify: 'I hate this product'"}]
)
print(response.choices[0].message.content)  # → negative

Ajuste fino: pros y contras

✅ Pros❌ Contras
Inferencia más rápida (modelo más pequeño)Costoso de entrenar (decenas a miles de dólares)
El mejor para formato/tono consistentesEstático: desactualizado después del límite de entrenamiento
Prompts más cortos = menor costo de APINecesita datos etiquetados de alta calidad (cientos a miles)
Puede superar a modelos base más grandes en tareas estrechasNo se generaliza más allá de la distribución de entrenamiento

Ideal para: Clasificación, reconocimiento de entidades nombradas, normalización de formatos, generación de voz de marca, generación de SQL, tareas de codificación especializadas.

4. Agentes de IA — El LLM que actúa

🟢 Agentes de IA en una frase

Proporcione al LLM herramientas (búsqueda web, ejecución de código, API, lectura/escritura de archivos) y permítale razonar, planificar y tomar medidas de múltiples pasos para completar un objetivo.

Bucle central del agente (patrón ReAct)

from openai import OpenAI
import json, subprocess

client = OpenAI(api_key="your-deepseek-key", base_url="https://api.deepseek.com")

tools = [
    {"type": "function", "function": {
        "name": "run_python",
        "description": "Execute Python code and return stdout",
        "parameters": {"type": "object", "properties": {
            "code": {"type": "string", "description": "Python code to run"}
        }, "required": ["code"]}
    }},
    {"type": "function", "function": {
        "name": "web_search",
        "description": "Search the web for current information",
        "parameters": {"type": "object", "properties": {
            "query": {"type": "string"}
        }, "required": ["query"]}
    }}
]

def execute_tool(name, args):
    if name == "run_python":
        result = subprocess.run(["python", "-c", args["code"]],
                                capture_output=True, text=True, timeout=10)
        return result.stdout or result.stderr
    elif name == "web_search":
        return f"[Search results for: {args['query']}]"  # reemplazar con búsqueda real

def agent_loop(goal, max_turns=10):
    messages = [{"role": "user", "content": goal}]
    for _ in range(max_turns):
        resp = client.chat.completions.create(
            model="deepseek-chat", messages=messages,
            tools=tools, tool_choice="auto"
        )
        msg = resp.choices[0].message
        messages.append(msg)
        if not msg.tool_calls:
            return msg.content  # listo
        for tc in msg.tool_calls:
            args = json.loads(tc.function.arguments)
            result = execute_tool(tc.function.name, args)
            messages.append({"role": "tool", "tool_call_id": tc.id, "content": result})
    return "Max turns reached"

print(agent_loop("Find the top 3 AI agent frameworks by GitHub stars and create a comparison table"))

Agentes: pros y contras

✅ Pros❌ Contras
Puede tomar acciones del mundo realLa latencia más alta (múltiples pasos)
Maneja razonamiento complejo de múltiples pasosEl más costoso (muchas llamadas al LLM)
Puede acceder a datos en vivo a través de herramientasPuede fallar o entrar en bucle inesperadamente
Flexible: funciona en tareas abiertasMás difícil de depurar y monitorear
No requiere entrenamientoSalida no determinista

Ideal para: Asistentes de investigación, agentes de codificación, automatización de flujos de trabajo, análisis de datos, automatización del navegador, tareas de planificación a largo plazo.

5. Comparación completa: costo, velocidad, complejidad

DimensiónRAGAjuste finoAgentes
Costo de configuraciónBajo ($0–$50)Alto ($50–$5,000+)Medio ($0 + API)
Costo de inferenciaBajo–MedioBajo (modelo más pequeño)Alto (muchas llamadas)
LatenciaMedio (recuperación + LLM)Rápido (modelo pequeño)Lento (múltiples pasos)
Datos necesariosDocumentos solamenteEjemplos etiquetados (100s–1000s)Ninguno
Maneja datos en vivo✅ (actualizar índice)❌ (estático)✅ (vía herramientas)
ExplicabilidadAlto (cita fuentes)MedioMedio (traza de herramienta)
Mejores tamaños de modeloCualquieraPequeño–Medio (7B–70B)Grande (70B+)
Complejidad para construir⭐⭐⭐⭐⭐⭐⭐⭐⭐
Complejidad para mantener⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

6. Árbol de decisión — ¿Cuál utilizar?

INICIO: ¿Qué necesita su aplicación?
├── ¿Necesita ACTUAR? (hacer clic, escribir, llamar a las API)
└── SÍ → AGENTES DE IA
├── ¿Necesita información de sus documentos privados?
└── SÍ → RAG
├── ¿Necesita un estilo/formato muy específico?
└── SÍ + tiene datos etiquetados → AJUSTE FINO
├── ¿Necesita datos web en tiempo real?
└── SÍ → AGENTES (con herramienta de búsqueda)
├── ¿Necesita responder desde un corpus de más de 100 000 documentos?
└── SÍ → RAG + BD vectorial
└── ¿Necesita una salida estructurada consistente a bajo costo?
└── SÍ → AJUSTE FINO de modelo pequeño
REGLA GENERAL:
Comience con RAG (más barato, más rápido de construir)
Agregue agentes cuando necesite acciones o autonomía
Agregue ajuste fino solo cuando RAG/prompting no puedan obtener el formato correcto

7. La respuesta real: combine los tres

La mayoría de las aplicaciones de LLM en producción en 2026 utilizan una combinación. Así es como funciona un asistente de IA empresarial real:

Ejemplo: Bot de soporte al cliente empresarial
  • Modelo ajustado → enruta y clasifica la intención (rápido, barato, consistente)
  • RAG → recupera los artículos correctos de la base de conocimientos, el historial de pedidos y los documentos del producto
  • Agente → toma acciones: crea un ticket, emite un reembolso, verifica el estado del pedido a través de la API
# Patrón de arquitectura combinada

from openai import OpenAI

client = OpenAI(api_key="your-deepseek-key", base_url="https://api.deepseek.com")

def handle_customer_query(user_message: str, customer_id: str):
    
    # Paso 1: Clasificador ajustado (gpt-4o-mini rápido y económico)
    intent = classify_intent(user_message)  # → "refund" | "product_question" | "complaint"
    
    # Paso 2: RAG — recuperar contexto relevante
    if intent in ["product_question", "complaint"]:
        context_docs = retriever.invoke(user_message)  # búsqueda vectorial
        context = "\n".join([d.page_content for d in context_docs])
    else:
        context = ""
    
    # Paso 3: Agente — responder + tomar medidas si es necesario
    system = f"""You are a helpful customer support agent.
Customer ID: {customer_id}
{f'Relevant docs:{chr(10)}{context}' if context else ''}"""
    
    messages = [
        {"role": "system", "content": system},
        {"role": "user", "content": user_message}
    ]
    
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages,
        tools=support_tools,  # check_order, issue_refund, create_ticket
        tool_choice="auto"
    )
    
    return handle_response(response, messages)  # ejecutar herramientas si es necesario

8. Las mejores herramientas para cada enfoque en 2026

🔵 Pila RAG

ComponentePrincipales elecciones
BD VectorialPinecone, Qdrant, Chroma, Weaviate, pgvector
EmbeddingsOpenAI text-embedding-3-small, Voyage AI, Cohere
OrquestaciónLangChain, LlamaIndex, Haystack
ObservabilidadLangSmith, Langfuse, Helicone

🟣 Pila de ajuste fino

ComponentePrincipales elecciones
Ajuste fino en la nubeOpenAI (gpt-4o-mini), Together AI, Anyscale
Entrenamiento de código abiertoUnsloth, LLaMA-Factory, Axolotl
EvaluaciónRAGAS, DeepEval, Promptfoo
Seguimiento de experimentosW&B Weave, MLflow, Comet ML

🟢 Pila de agentes

ComponentePrincipales elecciones
Marcos de trabajoLangGraph, CrewAI, AutoGen, Google ADK, PydanticAI
Integración de herramientasComposio, Toolhouse, MCP servers
MemoriaMem0, Zep, Letta
ObservabilidadLangSmith, AgentOps, Arize Phoenix
AlojamientoE2B (código aislado), Modal, Railway

Explore las más de 420 herramientas en cada categoría en AgDex.ai, el directorio completo de herramientas de agentes de IA.

💡 Recomendación de pila inicial para 2026:
  1. LLM: DeepSeek V4 (deepseek-chat): la mejor relación calidad-precio
  2. RAG: LlamaIndex + Qdrant Cloud (nivel gratuito para prototipos)
  3. Agentes: LangGraph (mayor control) o CrewAI (multiagente más sencillo)
  4. Observabilidad: Langfuse (código abierto, autohospedaje gratuito)
  5. Realice el ajuste fino más tarde solo si el formato o la latencia se convierten en un cuello de botella
🏗 Architektur-Leitfaden April 2026 ⭐ Am häufigsten gefragt

RAG vs. Fine-tuning vs. KI-Agenten

Welche LLM-Architektur sollten Sie 2026 wählen? Ein praktischer Entscheidungsleitfaden mit Kosten, Kompromissen und realen Beispielen.

📅 26. April 2026 ⏱ 10 Min. Lesezeit 🖊 AgDex-Redaktion

1. TL;DR — Quick Decision Table

Ihre SituationBester Ansatz
Benötigt Antworten aus privaten Dokumenten/Datenbanken✅ RAG
Benötigt Echtzeit- / Live-Daten✅ RAG oder Agenten
Benötigt benutzerdefinierten Ton / Stil / Format✅ Fine-tuning
Benötigt domänenspezifisches Vokabular✅ Fine-tuning
Muss Aktionen ausführen (Web, APIs, Tools)✅ Agenten
Benötigt mehrstufige Argumentation / Planung✅ Agenten
Budget ist knapp✅ RAG (am günstigsten)
Geschwindigkeit ist entscheidend (<500ms)✅ Fine-tuning
Komplexe Enterprise-Workflows✅ Agenten + RAG

Die tatsächliche Antwort für die meisten Produktionssysteme im Jahr 2026: Sie kombinieren alle drei. Aber verstehen wir zuerst jeden einzelnen Ansatz.

2. RAG — Retrieval-Augmented Generation

🔵 RAG in einem Satz

Rufen Sie bei der Abfrage relevanten Kontext aus Ihrer Wissensdatenbank ab, fügen Sie ihn in den Prompt ein und lassen Sie das LLM die Frage anhand dieses Kontexts beantworten.

Wie es funktioniert

  1. Aufbereiten: Dokumente aufteilen (Chunking) → Vektorisieren (Embedding) → in einer Vektordatenbank speichern
  2. Abfragen: Die Frage des Benutzers vektorisieren → die am ehesten übereinstimmenden Chunks finden → abrufen
  3. Generieren: Abgerufenen Chunks + Frage an das LLM übergeben → fundierte Antwort erhalten

Einfaches RAG mit LangChain

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA

# 1. Dokumente einlesen
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(your_docs)

# 2. Embeddings erstellen und speichern
embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")

# 3. Abfragen
llm = ChatOpenAI(model="deepseek-chat",
                 base_url="https://api.deepseek.com",
                 api_key="your-key")
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectordb.as_retriever(search_kwargs={"k": 4})
)
answer = qa_chain.invoke({"query": "What is our refund policy?"})
print(answer["result"])

RAG: Vor- und Nachteile

✅ Vorteile❌ Nachteile
Kein Modelltraining erforderlichDie Abrufqualität ist entscheidend
Wissen bleibt aktuellLatenz durch den Abrufschnitt (+100-500 ms)
Günstig — keine GPU erforderlichDas Kontextfenster begrenzt die injizierbare Datenmenge
Zitierfähige Quellen ("laut Dokument X...")Scheitert bei Fragen, die eine Argumentation über das gesamte Dokument erfordern
Einfache Aktualisierung des WissensDie Chunking-Strategie beeinflusst die Qualität erheblich

Bestens geeignet für: Kundensupport-Bots, interne Wissensdatenbanken, Dokumenten-Q&A, Codesuche, Abruf rechtlicher/medizinischer Dokumente.

3. Fine-tuning — Dem Modell etwas beibringen

🟣 Fine-tuning in einem Satz

Aktualisieren Sie die Gewichtungen eines vortrainierten Modells mit Ihren domänenspezifischen Daten, sodass es Ihre Muster, Tonalitäten und Kenntnisse verinnerlicht.

Wann Fine-tuning sinnvoll ist

  • Sie benötigen ein sehr spezifisches Ausgabeformat (z. B. immer JSON zurückgeben, immer einer Vorlage folgen)
  • Sie benötigen eine individuelle Tonalität, die durch reines Prompting nicht zuverlässig erzwungen werden kann
  • Sie haben eine eng begrenzte, klar definierte Aufgabe mit Tausenden von Beispielen
  • Sie benötigen maximale Geschwindigkeit – feinabgestimmte kleinere Modelle übertreffen große, auf Prompts basierende Modelle bei der Latenz
  • Sie möchten die Prompt-Länge reduzieren (das Modell kennt den Kontext bereits)

Fine-tuning mit OpenAI API

import json
from openai import OpenAI

client = OpenAI(api_key="your-openai-key")

# 1. Trainingsdaten vorbereiten (JSONL-Format)
# Jede Zeile: {"messages": [{"role":"system","content":"..."}, 
#              {"role":"user","content":"..."}, 
#              {"role":"assistant","content":"..."}]}

# 2. Trainingsdatei hochladen
with open("training_data.jsonl", "rb") as f:
    file_obj = client.files.create(file=f, purpose="fine-tune")

# 3. Fine-tuning-Job erstellen
job = client.fine_tuning.jobs.create(
    training_file=file_obj.id,
    model="gpt-4o-mini",  # oder gpt-3.5-turbo
    hyperparameters={"n_epochs": 3}
)
print(f"Job ID: {job.id}")

# 4. Überwachen (Abrufen, bis der Status "succeeded" ist)
# job = client.fine_tuning.jobs.retrieve(job.id)
# Verwenden Sie job.fine_tuned_model nach Fertigstellung

# 5. Fine-tuned Modell verwenden
response = client.chat.completions.create(
    model="ft:gpt-4o-mini:your-org:your-model:abc123",
    messages=[{"role": "user", "content": "Classify: 'I hate this product'"}]
)
print(response.choices[0].message.content)  # → negative

Fine-tuning: Vor- und Nachteile

✅ Vorteile❌ Nachteile
Schnellste Inferenz (kleineres Modell)Teuer in der Ausbildung (Zehner bis Tausende von Dollar)
Optimal für konsistente Formate/TonalitätenStatisch – veraltet nach dem Trainings-Stichtag
Kürzere Prompts = geringere API-KostenBenötigt qualitativ hochwertige, gelabelte Daten (Hunderte bis Tausende)
Kann größere Basismodelle bei eng begrenzten Aufgaben übertreffenGeneralisiert nicht über die Trainingsverteilung hinaus

Bestens geeignet für: Klassifizierung, Erkennung benannter Entitäten, Formatnormalisierung, Generierung von Markenstimmen, SQL-Generierung, spezialisierte Programmieraufgaben.

4. KI-Agenten — Das LLM, das handelt

🟢 KI-Agenten in einem Satz

Geben Sie dem LLM Werkzeuge (Websuche, Codeausführung, APIs, Lesen/Schreiben von Dateien) und lassen Sie es argumentieren, planen und mehrstufige Aktionen ausführen, um ein Ziel zu erreichen.

Agentenschleife (ReAct-Muster)

from openai import OpenAI
import json, subprocess

client = OpenAI(api_key="your-deepseek-key", base_url="https://api.deepseek.com")

tools = [
    {"type": "function", "function": {
        "name": "run_python",
        "description": "Execute Python code and return stdout",
        "parameters": {"type": "object", "properties": {
            "code": {"type": "string", "description": "Python code to run"}
        }, "required": ["code"]}
    }},
    {"type": "function", "function": {
        "name": "web_search",
        "description": "Search the web for current information",
        "parameters": {"type": "object", "properties": {
            "query": {"type": "string"}
        }, "required": ["query"]}
    }}
]

def execute_tool(name, args):
    if name == "run_python":
        result = subprocess.run(["python", "-c", args["code"]],
                                capture_output=True, text=True, timeout=10)
        return result.stdout or result.stderr
    elif name == "web_search":
        return f"[Search results for: {args['query']}]"  # durch echte Suche ersetzen

def agent_loop(goal, max_turns=10):
    messages = [{"role": "user", "content": goal}]
    for _ in range(max_turns):
        resp = client.chat.completions.create(
            model="deepseek-chat", messages=messages,
            tools=tools, tool_choice="auto"
        )
        msg = resp.choices[0].message
        messages.append(msg)
        if not msg.tool_calls:
            return msg.content  # fertig
        for tc in msg.tool_calls:
            args = json.loads(tc.function.arguments)
            result = execute_tool(tc.function.name, args)
            messages.append({"role": "tool", "tool_call_id": tc.id, "content": result})
    return "Max turns reached"

print(agent_loop("Find the top 3 AI agent frameworks by GitHub stars and create a comparison table"))

Agenten: Vor- und Nachteile

✅ Vorteile❌ Nachteile
Kann reale Aktionen ausführenHöchste Latenz (mehrstufig)
Bewältigt komplexe, mehrstufige ArgumentationAm teuersten (viele LLM-Aufrufe)
Kann über Tools auf Live-Daten zugreifenKann unerwartet fehlschlagen oder in Schleifen geraten
Flexibel – funktioniert bei offenen AufgabenSchwieriger zu debuggen und zu überwachen
Kein Training erforderlichNicht-deterministische Ausgabe

Bestens geeignet für: Rechercheassistenten, Codierungsagenten, Workflow-Automatisierung, Datenanalyse, Browser-Automatisierung, weitreichende Planungsaufgaben.

5. Vollständiger Vergleich: Kosten, Geschwindigkeit, Komplexität

DimensionRAGFine-tuningAgenten
EinrichtungskostenNiedrig ($0–$50)Hoch ($50–$5,000+)Mittel ($0 + API)
InferenzkostenNiedrig–MittelNiedrig (kleineres Modell)Hoch (viele Aufrufe)
LatenzMittel (Abruf + LLM)Schnell (kleines Modell)Langsam (mehrstufig)
Benötigte DatenNur DokumenteGelabelte Beispiele (100er–1000er)Keine
Unterstützt Live-Daten✅ (Index aktualisieren)❌ (statisch)✅ (über Tools)
ErklärbarkeitHoch (Quellen zitieren)MittelMittel (Tool-Trace)
Beste ModellgrößenBeliebigKlein–Mittel (7B–70B)Groß (70B+)
Entwicklungsaufwand⭐⭐⭐⭐⭐⭐⭐⭐⭐
Wartungsaufwand⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

6. Entscheidungsbaum — Was soll verwendet werden?

START: Was benötigt Ihre App?
├── Muss sie HANDELN? (klicken, schreiben, APIs aufrufen)
└── JA → KI-AGENTEN
├── Benötigt sie Infos aus Ihren privaten Dokumenten?
└── JA → RAG
├── Benötigt sie ein sehr spezifisches Format/Stil?
└── JA + gelabelte Daten vorhanden → FINE-TUNING
├── Benötigt sie Echtzeit-Webdaten?
└── JA → AGENTEN (mit Suchwerkzeug)
├── Müssen Antworten aus einem Korpus von >100k Dokumenten generiert werden?
└── JA → RAG + Vektor-DB
└── Benötigen Sie konsistente strukturierte Ausgaben bei geringen Kosten?
└── JA → FINE-TUNING eines kleinen Modells
FAUSTREGEL:
Starten Sie mit RAG (am günstigsten, am schnellsten zu bauen)
Fügen Sie Agenten hinzu, wenn Sie Aktionen oder Autonomie benötigen
Nutzen Sie Fine-tuning nur, wenn RAG/Prompting das Format nicht richtig hinbekommen

7. Die tatsächliche Antwort: Kombinieren Sie alle drei

Die meisten LLM-Anwendungen in der Produktion nutzen im Jahr 2026 eine Kombination. So funktioniert ein echter KI-Assistent für Unternehmen:

Beispiel: Kundensupport-Bot für Unternehmen
  • Feinabgestimmtes Modell → leitet Anfragen weiter und klassifiziert die Absicht (schnell, günstig, konsistent)
  • RAG → ruft die passenden Wissensdatenbankartikel, Bestellhistorien und Produktdokumente ab
  • Agent → führt Aktionen aus: erstellt ein Ticket, veranlasst eine Rückerstattung, prüft den Bestellstatus per API
# Kombiniertes Architekturmuster

from openai import OpenAI

client = OpenAI(api_key="your-deepseek-key", base_url="https://api.deepseek.com")

def handle_customer_query(user_message: str, customer_id: str):
    
    # Schritt 1: Fine-tuned Klassifikator (schnelles, günstiges gpt-4o-mini)
    intent = classify_intent(user_message)  # → "refund" | "product_question" | "complaint"
    
    # Schritt 2: RAG — relevanten Kontext abrufen
    if intent in ["product_question", "complaint"]:
        context_docs = retriever.invoke(user_message)  # Vektorsuche
        context = "\n".join([d.page_content for d in context_docs])
    else:
        context = ""
    
    # Schritt 3: Agent — antworten + Aktion ausführen, falls erforderlich
    system = f"""You are a helpful customer support agent.
Customer ID: {customer_id}
{f'Relevant docs:{chr(10)}{context}' if context else ''}"""
    
    messages = [
        {"role": "system", "content": system},
        {"role": "user", "content": user_message}
    ]
    
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages,
        tools=support_tools,  # check_order, issue_refund, create_ticket
        tool_choice="auto"
    )
    
    return handle_response(response, messages)  # Werkzeuge ausführen, falls erforderlich

8. Die besten Tools für jeden Ansatz im Jahr 2026

🔵 RAG-Stack

KomponenteTop-Favoriten
Vektor-DBPinecone, Qdrant, Chroma, Weaviate, pgvector
EmbeddingsOpenAI text-embedding-3-small, Voyage AI, Cohere
OrchestrierungLangChain, LlamaIndex, Haystack
ObservabilityLangSmith, Langfuse, Helicone

🟣 Fine-tuning-Stack

KomponenteTop-Favoriten
Cloud-FeinabstimmungOpenAI (gpt-4o-mini), Together AI, Anyscale
Open-Source-TrainingUnsloth, LLaMA-Factory, Axolotl
EvaluierungRAGAS, DeepEval, Promptfoo
Experiment-TrackingW&B Weave, MLflow, Comet ML

🟢 Agenten-Stack

KomponenteTop-Favoriten
FrameworksLangGraph, CrewAI, AutoGen, Google ADK, PydanticAI
Tool-IntegrationComposio, Toolhouse, MCP-Server
SpeicherMem0, Zep, Letta
ObservabilityLangSmith, AgentOps, Arize Phoenix
HostingE2B (sandboxed Code), Modal, Railway

Entdecken Sie alle über 420 Tools in jeder Kategorie auf AgDex.ai – dem umfassenden Verzeichnis für KI-Agenten-Tools.

💡 Empfehlung für den Starter-Stack 2026:
  1. LLM: DeepSeek V4 (deepseek-chat) – bestes Preis-Leistungs-Verhältnis
  2. RAG: LlamaIndex + Qdrant Cloud (kostenlose Stufe für Prototypen)
  3. Agenten: LangGraph (maximale Kontrolle) oder CrewAI (einfachste Multi-Agenten-Orchestrierung)
  4. Observability: Langfuse (Open Source, kostenloses Selbst-Hosting)
  5. Fine-tuning erst später in Erwägung ziehen, wenn Format/Latenz zum Flaschenhals werden
🏗 アーキテクチャガイド 2026年4月 ⭐ 最も多い質問

RAG vs ファインチューニング vs KIエージェント

2026年にどのLLMアーキテクチャを選択すべきか?コスト、トレードオフ、実際の事例を交えた実用的な意思決定ガイド。

📅 2026年4月26日 ⏱ 読了時間 10分 🖊 AgDex編集部

1. TL;DR — クイック意思決定表

開発環境・要望最適なアプローチ
社外秘ドキュメントやDBから回答を得る必要がある✅ RAG
リアルタイムデータ / ライブデータが必要✅ RAG または エージェント
独自のトーン / スタイル / フォーマットが必要✅ ファインチューニング
ドメイン固有の専門用語が必要✅ ファインチューニング
(Web、API、ツールなどの)アクションを実行する必要がある✅ エージェント
複数ステップの推論や計画が必要✅ エージェント
予算が限られている✅ RAG (最も安価)
速度が最優先される (<500ms)✅ ファインチューニング
複雑なエンタープライズワークフロー✅ エージェント + RAG

2026年の本番システムにおける現実的な答え:3つすべてを組み合わせる。ただし、まずはそれぞれのアプローチを理解しましょう。

2. RAG — 検索拡張生成

🔵 RAGを1行で説明すると

クエリ実行時にナレッジベースから関連するコンテキストを検索し、それをプロンプトに挿入して、LLMがそのコンテキストに基づいて回答するようにします。

仕組み

  1. 取り込み: ドキュメントの分割 → ベクトル化 → ベクトルDBへの保存
  2. クエリ: ユーザーの質問のベクトル化 → 類似する上位K個のチャンクの検索 → 取得
  3. 生成: 検索されたチャンク + 質問をLLMに入力 → 根拠に基づいた回答の取得

LangChainを使用した最小限のRAG実装

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA

# 1. ドキュメントの取り込み
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(your_docs)

# 2. 埋め込みと保存
embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")

# 3. クエリ
llm = ChatOpenAI(model="deepseek-chat",
                 base_url="https://api.deepseek.com",
                 api_key="your-key")
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectordb.as_retriever(search_kwargs={"k": 4})
)
answer = qa_chain.invoke({"query": "What is our refund policy?"})
print(answer["result"])

RAG:長所と短所

  • 知識が常に最新に保たれる
  • ✅ 長所❌ 短所
    モデルのトレーニングが不要検索の品質に大きく依存する
    検索ステップによる遅延が発生する(+100-500ms)
    安価 — GPUが不要コンテキストウィンドウの制限により、挿入できる情報量に限界がある
    引用元を明示できる(「ドキュメントXによると...」)ドキュメント全体にわたる推論が必要な質問には対応できない
    知識の更新が容易チャンク分割の戦略が品質に大きく影響する

    最適な用途: カスタマーサポートボット、社内ナレッジベース、ドキュメントのQ&A、コード検索、法的/医療的ドキュメントの検索。

    3. ファインチューニング — モデルへの学習

    🟣 ファインチューニングを1行で説明すると

    事前学習済みモデルの重みをドメイン固有のデータで更新し、パターン、トーン、知識をモデルに内部化させます。

    ファインチューニングが有効な場合

    • 非常に具体的な出力フォーマットが必要な場合(例:常にJSONを返す、常に特定のテンプレートに従う)
    • プロンプトだけでは強制しきれない、独自のトーンやスタイルを確立したい場合
    • 数千件のサンプルが存在する、明確に定義された限定的なタスクを処理する場合
    • 処理速度(低レイテンシ)が求められる場合 — ファインチューニングされた小型モデルは、プロンプト制御された大型モデルよりも応答速度で勝ります
    • プロンプトの長さを削減したい場合(モデルがすでに前提知識を持っているため)

    OpenAI APIを使用したファインチューニング

    import json
    from openai import OpenAI
    
    client = OpenAI(api_key="your-openai-key")
    
    # 1. トレーニングデータの準備 (JSONL形式)
    # 各行: {"messages": [{"role":"system","content":"..."}, 
    #              {"role":"user","content":"..."}, 
    #              {"role":"assistant","content":"..."}]}
    
    # 2. トレーニングファイルのアップロード
    with open("training_data.jsonl", "rb") as f:
        file_obj = client.files.create(file=f, purpose="fine-tune")
    
    # 3. ファインチューニングジョブの作成
    job = client.fine_tuning.jobs.create(
        training_file=file_obj.id,
        model="gpt-4o-mini",  # または gpt-3.5-turbo
        hyperparameters={"n_epochs": 3}
    )
    print(f"Job ID: {job.id}")
    
    # 4. 監視 (ステータスが "succeeded" になるまでポーリング)
    # job = client.fine_tuning.jobs.retrieve(job.id)
    # 完了後は job.fine_tuned_model を使用
    
    # 5. ファインチューニング済みモデルの使用
    response = client.chat.completions.create(
        model="ft:gpt-4o-mini:your-org:your-model:abc123",
        messages=[{"role": "user", "content": "Classify: 'I hate this product'"}]
    )
    print(response.choices[0].message.content)  # → negative

    ファインチューニング:長所と短所

    ✅ 長所❌ 短所
    推論速度が最も速い(モデルサイズが小さいため)学習コストが高額(数十ドル〜数千ドル)
    一貫したフォーマットやトーンの維持に最適静的 — 学習データのカットオフ以降の情報は持たない
    プロンプトの短縮によりAPIコストを削減できる高品質なアノテーション付きデータ(数百〜数千件)が必要
    特定の狭いタスクにおいて、より巨大なベースモデルを凌駕することがある学習データの分布外のタスクには一般化できない

    最適な用途: 分類、固有表現抽出、フォーマットの正規化、ブランドボイスによる文章生成、SQL生成、専門的なコーディングタスク。

    4. KIエージェント — アクションを実行するLLM

    🟢 KIエージェントを1行で説明すると

    LLMにツール(Web検索、コード実行、各種API、ファイルの読み書きなど)を提供し、自律的に思考、計画、および複数ステップのアクションを実行させて目標を達成します。

    代表的なエージェントループ(ReActパターン)

    from openai import OpenAI
    import json, subprocess
    
    client = OpenAI(api_key="your-deepseek-key", base_url="https://api.deepseek.com")
    
    tools = [
        {"type": "function", "function": {
            "name": "run_python",
            "description": "Execute Python code and return stdout",
            "parameters": {"type": "object", "properties": {
                "code": {"type": "string", "description": "Python code to run"}
            }, "required": ["code"]}
        }},
        {"type": "function", "function": {
            "name": "web_search",
            "description": "Search the web for current information",
            "parameters": {"type": "object", "properties": {
                "query": {"type": "string"}
            }, "required": ["query"]}
        }}
    ]
    
    def execute_tool(name, args):
        if name == "run_python":
            result = subprocess.run(["python", "-c", args["code"]],
                                    capture_output=True, text=True, timeout=10)
            return result.stdout or result.stderr
        elif name == "web_search":
            return f"[Search results for: {args['query']}]"  # 実際の検索に置き換える
    
    def agent_loop(goal, max_turns=10):
        messages = [{"role": "user", "content": goal}]
        for _ in range(max_turns):
            resp = client.chat.completions.create(
                model="deepseek-chat", messages=messages,
                tools=tools, tool_choice="auto"
            )
            msg = resp.choices[0].message
            messages.append(msg)
            if not msg.tool_calls:
                return msg.content  # 完了
            for tc in msg.tool_calls:
                args = json.loads(tc.function.arguments)
                result = execute_tool(tc.function.name, args)
                messages.append({"role": "tool", "tool_call_id": tc.id, "content": result})
        return "Max turns reached"
    
    print(agent_loop("Find the top 3 AI agent frameworks by GitHub stars and create a comparison table"))

    エージェント:長所と短所

    ✅ 長所❌ 短所
    現実世界のアクション(処理)を実行できるレイテンシが最も高い(複数ステップの処理が必要なため)
    複雑なマルチステップの推論に対応コストが最も高い(多数のLLM呼び出しが発生するため)
    ツールを介してリアルタイムのデータにアクセス可能予期せぬ失敗や無限ループに陥る可能性がある
    柔軟性が高い — オープンエンドなタスクに対応デバッグと監視(モニタリング)が困難
    モデルの学習が不要出力が非決定的(実行ごとに変わる可能性がある)

    最適な用途: リサーチアシスタント、コーディングエージェント、ワークフローの自動化、データ分析、ブラウザ操作の自動化、長期的な計画が必要なタスク。

    5. 詳細比較:コスト、速度、複雑さ

    評価項目RAGファインチューニングエージェント
    初期構築コスト低 ($0〜$50)高 ($50〜$5,000以上)中 ($0 + API費用)
    推論コスト低〜中低(比較的小さなモデルで動作)高(何回もLLMを呼び出すため)
    レイテンシ(速度)中(検索 + LLM生成)高速(小型モデル)低速(マルチステップ処理)
    必要なデータ量対象ドキュメントのみアノテーションデータ (数百〜数千件)不要
    リアルタイム対応✅(インデックスの更新)❌(学習時のデータで固定)✅(ツール経由で取得)
    説明可能性高い(情報源の引用)中程度中程度(ツールのトレース履歴)
    最適なモデルサイズ全サイズに対応小〜中型モデル (7B〜70B)大型モデル (70B以上)
    開発の複雑さ⭐⭐⭐⭐⭐⭐⭐⭐⭐
    運用の複雑さ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

    6. それぞれの使いどころ (意思決定ツリー)

    開始: アプリケーションに必要な要件は?
    ├── アクション(クリック、書き込み、API呼び出しなど)を実行する必要があるか?
    └── はい → KIエージェント
    ├── 社外秘の独自ドキュメントから情報を得る必要があるか?
    └── はい → RAG
    ├── 非常に具体的なスタイルやフォーマットが必要か?
    └── はい + アノテーションデータがある → ファインチューニング
    ├── リアルタイムのWeb上のデータが必要か?
    └── はい → エージェント (検索ツール付き)
    ├── 10万件以上の大規模なドキュメントから回答する必要があるか?
    └── はい → RAG + ベクトルDB
    └── 低コストで一貫した構造化出力を得る必要があるか?
    └── はい → 小型モデルのファインチューニング
    基本的な指針(ルール・オブ・サム):
    まずはRAGから開始する(最も安価で、構築が早いため)
    アクションや自律性が必要になった段階でエージェントを追加する
    RAGやプロンプト調整だけではフォーマットを制御しきれない場合のみ、ファインチューニングを追加する

    7. 結論:3つのアプローチを組み合わせる

    2026年現在、多くの本番環境のLLMアプリケーションはこれらを組み合わせて使用しています。以下は、エンタープライズ向けの実際のAIアシスタントの動作例です:

    事例:エンタープライズ向けカスタマーサポートボット
    • ファインチューニング済みモデル → 問い合わせのルーティングと意図の分類を実行(高速、安価、一貫性がある)
    • RAG → 適切なナレッジベースの記事、購入履歴、製品マニュアルを検索・取得
    • エージェント → アクションの実行:チケットの作成、返金処理、API経由の注文ステータス確認
    # 複合アーキテクチャパターン
    
    from openai import OpenAI
    
    client = OpenAI(api_key="your-deepseek-key", base_url="https://api.deepseek.com")
    
    def handle_customer_query(user_message: str, customer_id: str):
        
        # ステップ 1: ファインチューニング済み分類器 (高速かつ低コストな gpt-4o-mini)
        intent = classify_intent(user_message)  # → "refund" | "product_question" | "complaint"
        
        # ステップ 2: RAG — 関連コンテキストの検索
        if intent in ["product_question", "complaint"]:
            context_docs = retriever.invoke(user_message)  # ベクトル検索
            context = "\n".join([d.page_content for d in context_docs])
        else:
            context = ""
        
        # ステップ 3: エージェント — 回答 + 必要に応じてアクションを実行
        system = f"""You are a helpful customer support agent.
    Customer ID: {customer_id}
    {f'Relevant docs:{chr(10)}{context}' if context else ''}"""
        
        messages = [
            {"role": "system", "content": system},
            {"role": "user", "content": user_message}
        ]
        
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=messages,
            tools=support_tools,  # check_order, issue_refund, create_ticket
            tool_choice="auto"
        )
        
        return handle_response(response, messages)  # 必要に応じてツールを実行

    8. 2026年アプローチ別主要ツール

    🔵 RAGスタック

    コンポーネント主要ツール
    ベクトルDBPinecone, Qdrant, Chroma, Weaviate, pgvector
    エンベッディングOpenAI text-embedding-3-small, Voyage AI, Cohere
    オーケストレーションLangChain, LlamaIndex, Haystack
    可観測性LangSmith, Langfuse, Helicone

    🟣 ファインチューニングスタック

    コンポーネント主要ツール
    クラウドチューニングOpenAI (gpt-4o-mini), Together AI, Anyscale
    オープンソース学習Unsloth, LLaMA-Factory, Axolotl
    評価RAGAS, DeepEval, Promptfoo
    実験管理W&B Weave, MLflow, Comet ML

    🟢 エージェントスタック

    コンポーネント主要ツール
    フレームワークLangGraph, CrewAI, AutoGen, Google ADK, PydanticAI
    ツール連携Composio, Toolhouse, MCP servers
    メモリMem0, Zep, Letta
    可観測性LangSmith, AgentOps, Arize Phoenix
    ホスティングE2B (サンドボックスコード実行), Modal, Railway

    各カテゴリの420以上のすべてのツールは、包括的なKIエージェントツールディレクトリであるAgDex.aiでインデックスされています。

    💡 2026年おすすめスタータースタック:
    1. LLM: DeepSeek V4 (deepseek-chat) — コストパフォーマンスが最も優秀
    2. RAG: LlamaIndex + Qdrant Cloud (プロトタイプ向けの無料枠あり)
    3. エージェント: LangGraph (最も詳細な制御が可能) または CrewAI (最も簡単なマルチエージェント構築)
    4. 可観測性: Langfuse (オープンソース、無料のセルフホストに対応)
    5. ファインチューニングは後から: フォーマット制御や応答速度が真のボトルネックになってから検討する