Skip to content

Commit ed9d6c2

Browse files
refactoring
1 parent b552870 commit ed9d6c2

File tree

5 files changed

+146
-2
lines changed

5 files changed

+146
-2
lines changed

C2L.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# LLM i limit kontekstu: Dlaczego JSON to ślepa uliczka i jak Code2Logic zmienia zasady gry
2+
3+
**Autor: Tom Sapletta**
4+
5+
Jeśli kiedykolwiek próbowałeś "nakarmić" model językowy (LLM) całym repozytorium kodu, by poprosić go o refaktoryzację, znalezienie błędu czy wygenerowanie dokumentacji, na pewno zderzyłeś się ze ścianą. Ścianą tą jest limit okna kontekstowego oraz zjawisko znane jako *lost in the middle* – model zapomina lub ignoruje informacje znajdujące się w środku długiego promptu.
6+
7+
Cześć, jestem Tom Sapletta i od dłuższego czasu pracuję nad tym, jak zoptymalizować komunikację między kodem źródłowym a sztuczną inteligencją. Tak właśnie narodził się projekt **Code2Logic**.
8+
9+
## Dlaczego powstał Code2Logic?
10+
11+
Kiedy LLM analizuje nasz kod, nie potrzebuje wszystkich średników, nawiasów, wcięć ani nadmiarowej struktury danych. Tradycyjne podejście polega na serializacji struktury projektu do formatu JSON. Niestety, JSON jest dla LLM-ów "głośny".
12+
13+
Spójrzmy na to zjawisko wizualnie:
14+
15+
```text
16+
+-----------------------------------+ +-----------------------+
17+
| Tradycyjny JSON (Duży szum) | | Format TOON (Czysto) |
18+
|-----------------------------------| |-----------------------|
19+
| { | | classes: |
20+
| "User": { | | User |
21+
| "methods": [ | | - get_email() |
22+
| { | | - set_email(e) |
23+
| "name": "get_email", | | |
24+
| "type": "string" | | |
25+
| } | | |
26+
| ] | | |
27+
| } | | |
28+
| } | | |
29+
+-----------------------------------+ +-----------------------+
30+
```
31+
32+
W formacie JSON większość tokenów, za które płacimy (i które marnują "uwagę" modelu), to nawiasy klamrowe, cudzysłowy i powtarzające się klucze. Code2Logic powstał po to, aby wyekstrahować **czystą logikę** z kodu i przekazać ją do modelu w maksymalnie skompresowanych formatach, takich jak nasz autorski **TOON** czy **LogicML**.
33+
34+
Poniższy diagram obrazuje, jak Code2Logic zmienia architekturę przepływu danych:
35+
36+
```mermaid
37+
graph TD
38+
A[Repozytorium Kodu] -->|Parsowanie<br/>Code2Logic| B(Abstrakcyjna Reprezentacja)
39+
B --> C{Wybór Formatu}
40+
41+
C -->|Tradycyjny| D[JSON / XML]
42+
D -->|Zapychanie kontekstu| E(LLM traci skupienie)
43+
E -->|Gorsza jakość| F[Zła odpowiedź / Błędy]
44+
45+
C -->|Zoptymalizowany| G[TOON / LogicML]
46+
G ==>|Maksymalna kompresja tokenów| H((LLM skupia się<br/>na architekturze))
47+
H ==>|Wysoka precyzja| I[Doskonały Kod / Refaktoring]
48+
49+
style G fill:#2ecc71,stroke:#333,stroke-width:2px,color:white
50+
style H fill:#3498db,stroke:#333,stroke-width:2px,color:white
51+
style D fill:#e74c3c,stroke:#333,stroke-width:2px,color:white
52+
```
53+
54+
## Fascynujące rezultaty benchmarków
55+
56+
Zbudowałem w pełni zautomatyzowane środowisko testowe, które sprawdza, jak LLM (np. `google/gemini-3-flash-preview`) radzi sobie z rekonstrukcją kodu na podstawie różnych specyfikacji. Otrzymane wyniki przerosły moje oczekiwania i jednoznacznie pokazały, że format ma znaczenie.
57+
58+
Oto co odkryliśmy w trakcie naszych najnowszych benchmarków na próbie 20 plików:
59+
60+
### 1. Kolosalna różnica w rozmiarze i tokenach
61+
Zrzut struktury tego samego projektu waży:
62+
* **JSON:** ~918 KB (~235 000 tokenów)
63+
* **TOON:** ~170 KB (~43 000 tokenów)
64+
65+
Zredukowaliśmy objętość ponad 5-krotnie! Oznacza to, że do kontekstu modelu jesteśmy w stanie zmieścić 5 razy większy projekt, płacąc ułamek oryginalnej ceny.
66+
67+
### 2. LLM lepiej rozumie skompresowaną wiedzę
68+
Mogłoby się wydawać, że JSON, jako standard branżowy, będzie najbardziej zrozumiały dla maszyny. Prawda jest jednak inna. Brak redundancji w formacie TOON sprawia, że LLM znacznie rzadziej się "gubi".
69+
70+
Wyniki z naszego *Project Benchmark* (Zdolność LLM do odtworzenia poprawnego strukturalnie i semantycznie kodu na bazie specyfikacji):
71+
72+
```mermaid
73+
xychart-beta
74+
title "Jakość Reprodukcji Projektu przez LLM (Wynik w %)"
75+
x-axis ["TOON", "YAML", "Markdown", "LogicML", "JSON", "CSV", "Gherkin"]
76+
y-axis "Zgodność rekonstrukcji (%)" 40 --> 90
77+
bar [82.7, 79.2, 76.2, 76.0, 73.5, 67.8, 48.0]
78+
```
79+
80+
Format **TOON uzyskał imponujące 82.7%**, zostawiając JSON (73.5%) daleko w tyle. Jeszcze ciekawszy jest **LogicML**, który zużywa średnio zaledwie 245 tokenów na plik (10-krotnie mniej niż JSON!), a nadal utrzymuje wynik powyżej 76%.
81+
82+
## Wnioski i wyzwania na przyszłość
83+
84+
Dane z benchmarków pokazały nam drogę, ale obnażyły też obszary do natychmiastowej poprawy:
85+
86+
1. **Przejście z heurystyk (Regex) na AST (Abstract Syntax Tree):**
87+
Obecny benchmark świetnie radzi sobie z Pythonem, ale traci skuteczność przy ocenie rekonstrukcji w JavaScripcie, Javie czy Rust (często oceniając wygenerowane struktury na 0%). Wdrożenie parserów opartych na AST sprawi, że metryki będą w 100% niezależne od języka, a ewaluacja struktury (klasy, funkcje) nie będzie mylona z różnicami w formatowaniu tekstu.
88+
89+
2. **Głębsza reprodukcja logiki funkcji:**
90+
O ile ogólna architektura klas odtwarza się na poziomie ~82%, o tyle rekonstrukcja wewnętrznej logiki ukrytej *w ciałach funkcji* nadal oscyluje wokół 38.5%. Rozwiązaniem, które właśnie testujemy, jest równoległe dołączanie pliku `project.functions.toon`, który w kompresowanym formacie wstrzykuje informacje o przepływie danych wewnątrz metod.
91+
92+
## Podsumowanie
93+
94+
Przekładanie całego repozytorium do formatu JSON, by porozmawiać z LLM-em o architekturze, to ślepa uliczka zjadająca budżet i precyzję. **Code2Logic** udowadnia, że kluczem do lepszych wyników AI nie zawsze jest większy lub droższy model – częściej jest nim po prostu podanie mu wiedzy w lepszym, "czystszym" formacie bez zbędnego szumu.
95+
96+
Dalszy rozwój projektu to pełna abstrakcja języków poprzez AST i poprawa ewaluacji behawioralnej. Przed nami jeszcze sporo pracy, ale już teraz TOON i LogicML mogą uratować Wasze portfele i nerwy.
97+
98+
---
99+
*Jeśli interesuje Cię, jak optymalizować pracę sztucznej inteligencji z kodem,
100+
sprawdź [repozytorium projektu Code2Logic](http://github.com/wronai/code2logic) na GitHubie!*

Makefile

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ status: ## Show library status
325325
BENCH_SAMPLES := tests/samples
326326
BENCH_OUTPUT := examples/output
327327
BENCH_LIMIT := 20
328-
BENCH_FORMATS := yaml toon logicml json markdown csv gherkin
328+
BENCH_FORMATS := yaml toon logicml json markdown csv gherkin function.toon
329329

330330
# Set BENCH_USE_LLM=1 to run benchmarks with a configured LLM provider
331331
# (e.g. OpenRouter) instead of offline template mode.
@@ -336,7 +336,7 @@ else
336336
BENCH_NO_LLM_FLAG := --no-llm
337337
endif
338338

339-
benchmark: benchmark-format benchmark-function benchmark-token benchmark-project benchmark-toon benchmark-compare ## Run all benchmarks (no LLM)
339+
benchmark: benchmark-format benchmark-function-logic benchmark-function benchmark-token benchmark-project benchmark-toon benchmark-compare ## Run all benchmarks (no LLM)
340340
@echo ""
341341
@echo "$(GREEN)All benchmarks completed!$(NC)"
342342
@echo "Results in $(BENCH_OUTPUT)/"
@@ -360,6 +360,17 @@ benchmark-format: ## Benchmark format reproduction (yaml/toon/logicml/json)
360360
--limit $(BENCH_LIMIT) --verbose \
361361
--output $(BENCH_OUTPUT)/benchmark_format.json
362362

363+
benchmark-function-logic: ## Benchmark function-logic TOON reproduction as a standalone format
364+
@echo "$(BLUE)━━━ Function-Logic Format Benchmark ━━━$(NC)"
365+
@mkdir -p $(BENCH_OUTPUT)
366+
@printf '%s\n' "$(PYTHON) examples/15_unified_benchmark.py $(BENCH_NO_LLM_FLAG) --type format --folder $(BENCH_SAMPLES)/ --formats function.toon --limit $(BENCH_LIMIT) --verbose --output $(BENCH_OUTPUT)/benchmark_function_logic.json" >> $(BENCH_OUTPUT)/BENCHMARK_COMMANDS.sh
367+
$(PYTHON) examples/15_unified_benchmark.py \
368+
$(BENCH_NO_LLM_FLAG) --type format \
369+
--folder $(BENCH_SAMPLES)/ \
370+
--formats function.toon \
371+
--limit $(BENCH_LIMIT) --verbose \
372+
--output $(BENCH_OUTPUT)/benchmark_function_logic.json
373+
363374
benchmark-function: ## Benchmark function-level reproduction
364375
@echo "$(BLUE)━━━ Function Benchmark ━━━$(NC)"
365376
@printf '%s\n' "$(PYTHON) examples/15_unified_benchmark.py $(BENCH_NO_LLM_FLAG) --type function --file $(BENCH_SAMPLES)/sample_functions.py --limit 10 --verbose --output $(BENCH_OUTPUT)/benchmark_function.json" >> $(BENCH_OUTPUT)/BENCHMARK_COMMANDS.sh

code2logic/benchmarks/common.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pathlib import Path
66

77
from ..generators import CSVGenerator, JSONGenerator, YAMLGenerator
8+
from ..function_logic import FunctionLogicGenerator
89
from ..gherkin import GherkinGenerator
910
from ..logicml import LogicMLGenerator
1011
from ..markdown_format import MarkdownHybridGenerator
@@ -32,6 +33,15 @@ def generate_spec(project: ProjectInfo, fmt: str) -> str:
3233
if fmt == "gherkin":
3334
gen = GherkinGenerator()
3435
return gen.generate(project)
36+
if fmt == "function.toon":
37+
gen = FunctionLogicGenerator()
38+
return gen.generate_toon(
39+
project,
40+
detail="full",
41+
no_repeat_name=True,
42+
no_repeat_details=True,
43+
include_does=True,
44+
)
3545
if fmt == "csv":
3646
gen = CSVGenerator()
3747
return gen.generate(project, detail="full")
@@ -206,6 +216,17 @@ def get_token_reproduction_prompt(spec: str, fmt: str, file_name: str, language:
206216
- 'decorators: @staticmethod|@cache' = multiple decorators
207217
208218
CRITICAL: Use imports[], function_docs, and exact signatures to reproduce code accurately.""",
219+
220+
"function.toon": """Parse function-logic TOON carefully (function/method index):
221+
222+
STRUCTURE:
223+
- 'modules[N]{path,lang,items}:' module index
224+
- 'function_details:' per-module tables
225+
226+
CRITICAL:
227+
- Use the tabular rows (line,name,sig,does,decorators,calls,raises)
228+
- Reconstruct the full module code even if class bodies are not explicitly described
229+
- Preserve exact function signatures from 'sig'""",
209230
}
210231

211232
max_spec = 5000

examples/benchmark_report.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ def main() -> None:
8484

8585
artifacts: List[Artifact] = [
8686
Artifact("Format benchmark", out_dir / "benchmark_format.json", "Format comparison across multiple files"),
87+
Artifact(
88+
"Function-logic format benchmark",
89+
out_dir / "benchmark_function_logic.json",
90+
"Standalone format benchmark for function-logic TOON (function.toon)",
91+
),
8792
Artifact("Token benchmark", out_dir / "benchmark_token.json", "Token efficiency comparison"),
8893
Artifact("Project benchmark", out_dir / "benchmark_project.json", "Project-level benchmark"),
8994
Artifact("Function benchmark", out_dir / "benchmark_function.json", "Function-level benchmark"),
@@ -104,6 +109,7 @@ def main() -> None:
104109
]
105110

106111
fmt = _load_json(out_dir / "benchmark_format.json")
112+
flog = _load_json(out_dir / "benchmark_function_logic.json")
107113
tok = _load_json(out_dir / "benchmark_token.json")
108114
proj = _load_json(out_dir / "benchmark_project.json")
109115
fun = _load_json(out_dir / "benchmark_function.json")
@@ -126,6 +132,11 @@ def main() -> None:
126132
if fmt:
127133
n, avg, syn, run = _calc_file_summary(fmt)
128134
lines.append(f"| Format | {n} files | {avg:.1f}% | {syn:.0f}% | {run:.0f}% | {fmt.get('best_format','')} ({fmt.get('best_score',0):.1f}%) |")
135+
if flog:
136+
n, avg, syn, run = _calc_file_summary(flog)
137+
lines.append(
138+
f"| Function-logic format | {n} files | {avg:.1f}% | {syn:.0f}% | {run:.0f}% | {flog.get('best_format','')} ({flog.get('best_score',0):.1f}%) |"
139+
)
129140
if tok:
130141
n, avg, syn, run = _calc_file_summary(tok)
131142
lines.append(f"| Token | {n} files | {avg:.1f}% | {syn:.0f}% | {run:.0f}% | {tok.get('best_format','')} ({tok.get('best_score',0):.1f}%) |")

examples/benchmark_summary.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def main():
3030

3131
files = {
3232
"Format": os.path.join(out, "benchmark_format.json"),
33+
"FuncLogic": os.path.join(out, "benchmark_function_logic.json"),
3334
"Token": os.path.join(out, "benchmark_token.json"),
3435
"Project": os.path.join(out, "benchmark_project.json"),
3536
"Function": os.path.join(out, "benchmark_function.json"),

0 commit comments

Comments
 (0)