File size: 2,509 Bytes
13c0411
 
 
 
 
 
 
 
 
 
 
c19d9d0
 
13c0411
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""Mini-banc d'évaluation manuelle de l'agent Q&A.

Pose une série de questions types et imprime les réponses + les outils appelés.
Utile pour mesurer rapidement la qualité du grounding sur différents modèles.

Usage :
    python -m jdm_agent.apps.qa_eval
    python -m jdm_agent.apps.qa_eval --provider ollama --model llama3.2:3b
"""
from __future__ import annotations

from jdm_agent.apps import _console  # noqa: F401 — force stdout UTF-8 (Windows)

import argparse
import time
from typing import Optional

from jdm_agent.client import JDMClient
from jdm_agent.tools.jdm_agent import ask, build_jdm_agent
from jdm_agent.tools.llm_factory import get_llm


QUESTIONS: list[str] = [
    "Qu'est-ce qu'un chat ?",
    "Donne-moi 5 synonymes de voiture.",
    "Quelle est la couleur typique du sang d'après JeuxDeMots ?",
    "Le mot 'avocat' a-t-il plusieurs sens ? Quels sont-ils ?",
    "Quel est le rapport entre 'chat' et 'internet' ?",
    "Cite 3 contraires de 'grand'.",
    "Quels sont les composants typiques d'une voiture ?",
    "Quels sont les hyponymes de 'fruit' ?",
    "Quelle est la conséquence typique d'un orage ?",
    "Une baleine est-elle un poisson ?",
]


def main() -> int:
    p = argparse.ArgumentParser(description="Banc d'évaluation Q&A JDM.")
    p.add_argument("--provider", default=None)
    p.add_argument("--model", default=None)
    p.add_argument("--limit", type=int, default=0, help="N premières questions (0 = toutes).")
    p.add_argument("--show-tools", action="store_true")
    args = p.parse_args()

    client = JDMClient()
    llm = get_llm(provider=args.provider, model=args.model)
    agent = build_jdm_agent(client=client, llm=llm)

    qs = QUESTIONS if args.limit <= 0 else QUESTIONS[: args.limit]
    for i, q in enumerate(qs, 1):
        print(f"\n{'=' * 70}\nQ{i}. {q}\n{'-' * 70}")
        t0 = time.time()
        try:
            out = ask(agent, q)
        except Exception as e:
            print(f"[erreur] {e}")
            continue
        dt = time.time() - t0
        print(out["answer"])
        if args.show_tools:
            print(f"\n[{len(out['tool_calls'])} appels d'outils, {dt:.1f}s]")
            for tc in out["tool_calls"]:
                args_str = ", ".join(f"{k}={v!r}" for k, v in (tc.get("args") or {}).items())
                print(f"  • {tc['name']}({args_str})")
        else:
            print(f"\n[{dt:.1f}s]")

    client.close()
    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())