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.
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?
Conventional RLHF trains a reward model to score outputs, then uses PPO to maximize that score. C-RLFT takes a simpler, more elegant path.
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.
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.
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.
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+.
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.
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.
| 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 |
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.
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 |
# 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 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.
GPT4 Correct User: {user_message}<|end_of_turn|>GPT4 Correct Assistant:
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.
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)
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.")
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.
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.
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.
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.
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.
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.
ollama run openchatOpenChat 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 |
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.
| 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 |