| """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 |
|
|
| 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()) |
|
|