COLORS.chat network
colorschat.com · YouTube colors.chat · Order now terminal.glass · Deploy
🔵 Tsinghua University

OpenChat 3.5: GPT-3.5 Quality
with 300× Less Training Data

In November 2023, OpenChat 3.5 posted an MT-Bench score of 7.81 — matching GPT-3.5 Turbo — using just 6,000 training examples and a novel fine-tuning method called C-RLFT. No RLHF. No massive dataset. Just smarter data selection.

🏫 Creator: Tsinghua University (THUNLP)
🧱 Base: Mistral 7B v0.1
📅 Released: November 2023
⚖️ License: Apache 2.0
🪟 Context: 8K tokens
💾 Min RAM (INT4): 5–6GB
7.81
MT-Bench Score
6K
Training Examples
64.3%
MMLU Score
55%
HumanEval
8K
Context Window
C-RLFT
Training Method

The Story Behind the Numbers

When OpenChat 3.5 dropped its benchmark results in November 2023, the local AI community did a double-take. An MT-Bench score of 7.81 put it above Llama 2 70B Chat (6.27), above WizardLM 70B (7.71), and level with GPT-3.5 Turbo (7.94 at the time) — on a 7 billion parameter model trained on a dataset smaller than what most research labs call a "small" fine-tune.

The Tsinghua NLP group's key insight was that conventional RLHF treats all training examples the same: collect human feedback, train a reward model, use PPO to update the policy. Expensive, unstable, and prone to reward hacking. Their alternative — Conditioned Reinforcement Learning from Feedback Training (C-RLFT) — asks a different question: what if you could tell the model, at training time, which examples came from high-quality sources and which didn't?

🔬 How C-RLFT Works (Plain English)

Conventional RLHF trains a reward model to score outputs, then uses PPO to maximize that score. C-RLFT takes a simpler, more elegant path.

1
Collect mixed-quality data

Gather instruction-response pairs from multiple sources — some from GPT-4 (high quality), some from GPT-3.5 (medium), some from weaker models or humans (variable). Label each pair with its source.

2
Condition on quality signal

Instead of a separate reward model, inject a quality token directly into the prompt during training. High-quality examples get a "good" condition token; lower-quality get a different token.

3
Inference: always condition on "best"

At inference time, always use the "high quality" condition token. The model learned which response style is associated with that token and generates accordingly — no reward model, no PPO, no instability.

4
Result: data efficiency

Because you're not training a reward model separately, you need far fewer examples. The quality signal is embedded in the conditioning, not learned from millions of comparison pairs. 6,000 examples suffices where conventional RLHF might need 100,000+.

🔵
Why this matters for local AI

C-RLFT's efficiency means the approach is reproducible at smaller compute scales. Labs and individuals without access to massive GPU clusters can produce competitive fine-tunes. This is part of why the local AI ecosystem has improved so rapidly — the algorithmic techniques to get more from less data are maturing fast.

The 300× Data Efficiency Claim — In Detail

Conventional RLHF Fine-Tune

~2M
training examples (typical large RLHF run)
Requires: reward model training, PPO optimization loop, careful hyperparameter tuning, large GPU cluster, weeks of compute.

OpenChat C-RLFT

6K
training examples (GPT-4 distillation subset)
Requires: single fine-tuning run, standard SFT infrastructure, hours of compute on modest GPU. MT-Bench result: comparable.

To be precise about the comparison: OpenChat's 6,000 examples are specifically GPT-4-generated instruction-response pairs selected for quality. The 2M figure for conventional RLHF is a rough estimate across the full pipeline. The real comparison isn't purely about volume — it's about the elimination of the reward model training step, which is where most of the data and compute in RLHF gets consumed.

Benchmark Performance

Model MT-Bench MMLU HumanEval Context Params
GPT-4o 9.1/10 88.7% 90.2% 128K Unknown
GPT-3.5 Turbo 7.94/10 70.0% 72.5% 16K Unknown
OpenChat 3.5 (7B) 7.81/10 64.3% 55.0% 8K 7B
Llama 3.1 8B Instruct 8.2/10 73.0% 62.0% 128K 8B
Nous Hermes 2 7B 7.7/10 63.8% 47.0% 32K 7B
Zephyr 7B β 7.3/10 61.4% 42.0% 32K 7B
Mistral 7B Instruct v0.1 6.84/10 60.1% 30.5% 8K 7B
Llama 2 70B Chat 6.27/10 68.9% 32.0% 4K 70B
⚠️
MT-Bench is where OpenChat shines — MMLU tells a different story

OpenChat's 7.81 MT-Bench is legitimately impressive for a 7B model and reflects excellent instruction-following and multi-turn coherence. However, its MMLU score (64.3%) lags behind Llama 3.1 8B (73%) and GPT-3.5 (70%) — meaning raw knowledge recall and factual accuracy aren't proportionally as strong. For tasks that require broad knowledge depth rather than conversational quality, this gap matters.

Capability Profile

Instruction following
Excellent
Multi-turn coherence
Excellent
Code generation
Good
General Q&A / Factual
Good
Creative writing
Good
Math / reasoning
Average
Long document analysis
Limited
Setup simplicity
Best-in-class

The 8K Context Tradeoff

OpenChat 3.5's largest practical limitation is its 8,192-token context window. While this is double the original Mistral 7B's default, it falls short of the 32K offered by Nous Hermes 2 and Zephyr, or the 128K in Llama 3.1 8B.

In practice, 8K tokens handles roughly 6,000 words — enough for most chat interactions, short document summaries, and moderate-length code reviews. It becomes limiting when you need to feed in full contracts, entire codebases, or lengthy research papers as context.

Document Type Typical Length Fits in 8K? Notes
Typical chat session (20 turns) ~2,000 tokens Yes ✓ Comfortable
Short article / blog post ~1,500 tokens Yes ✓ Easy
Research paper (abstract + body) ~6,000 tokens Tight ⚠ May need to truncate references
Short software module (~200 lines) ~2,500 tokens Yes ✓ Good for code review
Standard business contract (10 pages) ~5,000 tokens Tight ⚠ Works if you exclude boilerplate
Full legal agreement (30+ pages) ~15,000 tokens No ✗ Use Nous Hermes 2 Yi 34B (200K) instead

Deployment

bash — Ollama
# Pull and run OpenChat 3.5
ollama run openchat

# Verify the model loaded
ollama list

# Run with custom context size
ollama run openchat --verbose

OpenChat Prompt Format

OpenChat uses a custom prompt format distinct from ChatML. Ollama handles this automatically, but if you're using the model directly via the GGUF or calling the REST API, you need to format prompts correctly.

OpenChat 3.5 Prompt Format
GPT4 Correct User: {user_message}<|end_of_turn|>GPT4 Correct Assistant:
💡
Why "GPT4 Correct" in the prompt?

The C-RLFT conditioning token in OpenChat is implemented as a special role name in the prompt. GPT4 Correct User signals "high quality" to the model — it was trained to associate this label with GPT-4-sourced, high-quality responses. Using the wrong role name (like a plain User:) degrades output quality measurably. Ollama handles this mapping for you automatically.

Python Integration via Ollama

python openchat_client.py
from openai import OpenAI

# Ollama exposes an OpenAI-compatible endpoint
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",  # required but unused
)

def ask(question: str, system: str = "") -> str:
    messages = []
    if system:
        messages.append({"role": "system", "content": system})
    messages.append({"role": "user", "content": question})

    response = client.chat.completions.create(
        model="openchat",
        messages=messages,
        temperature=0.7,
        max_tokens=2048,
    )
    return response.choices[0].message.content

# Example usage
result = ask(
    question="Explain the CAP theorem and its practical implications.",
    system="You are a distributed systems expert. Be precise and technical."
)
print(result)

Streaming Responses

python — streaming stream.py
import requests, json, sys

def stream_chat(prompt: str) -> None:
    payload = {
        "model": "openchat",
        "messages": [{"role": "user", "content": prompt}],
        "stream": True,
    }
    with requests.post(
        "http://localhost:11434/api/chat",
        json=payload, stream=True
    ) as r:
        for line in r.iter_lines():
            if line:
                chunk = json.loads(line)
                if "message" in chunk:
                    sys.stdout.write(chunk["message"]["content"])
                    sys.stdout.flush()
    print()  # newline after stream ends

stream_chat("Write a brief overview of transformer architecture.")

Best Use Cases

💬

Conversational AI Assistants

OpenChat's strongest benchmark is MT-Bench — multi-turn conversation quality. For chatbot interfaces, customer support drafting, or interactive Q&A, it punches well above its 7B weight.

⚡

Low-Latency Applications

At 7B parameters with INT4 quantization, OpenChat delivers 20–40 tokens/sec on consumer GPUs — fast enough for real-time response streaming in production applications.

🖥️

Moderate Code Assistance

HumanEval at 55% makes it a reasonable coding assistant for standard tasks — function completion, debugging help, explaining code. For complex multi-file projects, see WizardCoder or Llama 3.1 8B.

🎓

Educational Applications

Clean, coherent explanations with good instruction-following make OpenChat an effective tutoring assistant. Its C-RLFT training on GPT-4 outputs means it inherited GPT-4's explanatory style.

🔌

Drop-in GPT-3.5 Replacement

For internal tooling built around the OpenAI API, OpenChat via Ollama's OpenAI-compatible endpoint is the cleanest local replacement. MT-Bench scores suggest you'd barely notice the difference on most everyday tasks.

🧪

Research Baseline

C-RLFT's novel training approach makes OpenChat 3.5 a useful research baseline for studying data-efficient fine-tuning. The training methodology is openly documented in the paper.

Honest Assessment

✓ Real Strengths

  • Best MT-Bench score in the 7B class at time of release
  • Exceptionally clean instruction following across turn types
  • Apache 2.0 — full commercial use permitted
  • One of the simplest Ollama deployments: ollama run openchat
  • OpenAI-compatible API via Ollama — minimal migration effort
  • C-RLFT methodology is novel and well-documented in academia
  • Good coding performance for 7B (HumanEval 55%)
  • Fast inference: 20–40 t/s on RTX 3080-class hardware

✗ Real Limitations

  • 8K context window — short vs. Nous Hermes 2 (32K) or Llama 3.1 (128K)
  • MMLU at 64.3% — lags GPT-3.5 (70%) on factual knowledge
  • Llama 3.1 8B Instruct now outperforms it on most benchmarks
  • Less maintained than models backed by major labs
  • No official multi-modal support
  • Weaker on long-form math and complex reasoning chains

OpenChat 3.5 vs. Llama 3.1 8B: An Honest Comparison

OpenChat 3.5 was released in November 2023. Llama 3.1 8B Instruct came out in July 2024 and outperforms it on most benchmarks. This is the honest trade-off:

Dimension OpenChat 3.5 Llama 3.1 8B Instruct Winner
MT-Bench 7.81/10 8.2/10 Llama 3.1
MMLU 64.3% 73.0% Llama 3.1
HumanEval 55.0% 62.0% Llama 3.1
Context window 8K 128K Llama 3.1 (by far)
License Apache 2.0 Llama 3.1 Community OpenChat (freer)
Setup simplicity 1 command 1 command Tie
Alignment (refusal rate) Relaxed Moderate Depends on use case
Community ecosystem Moderate Very large Llama 3.1
💡
When to still choose OpenChat over Llama 3.1 8B

If you need Apache 2.0 licensing (Llama 3.1's Community License has restrictions above 700M monthly users), need a very simple deployment baseline, or are building on existing OpenChat tooling — OpenChat 3.5 is still a solid choice. Its C-RLFT training also produces slightly different response characteristics that some users prefer for conversational tasks. But if you're starting fresh and have no licensing constraint, Llama 3.1 8B is the stronger model.

When to Choose Something Else

Your Priority Better Choice Reason
Long document analysis Nous Hermes 2 Yi 34B 200K context vs. OpenChat's 8K
Best overall 7–8B performance Llama 3.1 8B Instruct Outperforms across MMLU, MT-Bench, and HumanEval
Deep reasoning / step-by-step Orca 2 Microsoft's progressive teaching specifically improves reasoning chains
Unconstrained output Dolphin 2.9 OpenChat retains moderate alignment; Dolphin removes it
Coding focus WizardLM / WizardCoder Specialized code training yields better HumanEval scores
CPU-only server (no GPU) Neural Chat 7B Intel AVX-512 optimization gives better CPU throughput