query_client.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #!/usr/bin/env python3
  2. """
  3. Päringukliendi näide Weaviate'i baasile
  4. """
  5. import sys
  6. import os
  7. import json
  8. from datetime import datetime
  9. # Lisa src kaust Pythoni teele
  10. sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))
  11. from src.query_engine import QueryEngine
  12. def print_result(result: dict):
  13. """Prindi tulemus ilusalt"""
  14. print("\n" + "="*80)
  15. print(f"PÄRING: {result.get('query', '')}")
  16. print(f"TÜÜP: {result.get('search_type', '')} | LEITI: {result.get('articles_found', 0)} artiklit")
  17. print(f"USALDUSVÄÄRSUS: {result.get('confidence', 0):.2%}")
  18. print("="*80)
  19. # Vastus
  20. print("\n📝 VASTUS:")
  21. print(result.get('answer', ''))
  22. # Allikad
  23. sources = result.get('sources', [])
  24. if sources:
  25. print(f"\n📚 ALLIKAD ({len(sources)}):")
  26. for i, source in enumerate(sources, 1):
  27. print(f"\n{i}. {source.get('title', '')}")
  28. print(f" Autorid: {', '.join(source.get('authors', []))}")
  29. print(f" Aasta: {source.get('year', '')} | Žurnaal: {source.get('journal', '')}")
  30. print(f" Relevantsus: {source.get('relevance_score', 5)}/10")
  31. print(f" Skoor: {source.get('score', 0):.3f}")
  32. if source.get('summary'):
  33. print(f" Kokkuvõte: {source.get('summary')}")
  34. print("\n" + "="*80)
  35. print(f"Kuupäev: {result.get('timestamp', '')}")
  36. def interactive_mode():
  37. """Interaktiivne režiim"""
  38. print("🤖 TRANSFORDIARTIKLITE PÄRINGUMOOTOR")
  39. print("="*60)
  40. print("Kasuta järgmisi käske:")
  41. print(" ? - Abi")
  42. print(" q - Välju")
  43. print(" t [päring] - Tehniline vastus")
  44. print(" l [päring] - Lühike vastus")
  45. print(" d [päring] - Detailne vastus (vaikimisi)")
  46. print(" s [päring] - Semantiline otsing")
  47. print(" k [päring] - Võtmesõnade otsing")
  48. print(" h [päring] - Hübriidotsing (vaikimisi)")
  49. print("="*60)
  50. engine = QueryEngine()
  51. while True:
  52. try:
  53. user_input = input("\n> ").strip()
  54. if not user_input:
  55. continue
  56. if user_input.lower() in ['q', 'quit', 'exit']:
  57. print("Head aega!")
  58. break
  59. if user_input == '?':
  60. print("""
  61. Käsud:
  62. t [päring] - Tehniline vastus (spetsialistidele)
  63. l [päring] - Lühike vastus (kokkuvõte)
  64. d [päring] - Detailne vastus (põhjalik analüüs)
  65. s [päring] - Semantiline otsing (mõttesisu)
  66. k [päring] - Võtmesõnade otsing (tekstipõhine)
  67. h [päring] - Hübriidotsing (mõlemad)
  68. Näited:
  69. t kuidas parandada teede ohutust
  70. l elektriautod linnaliikluses
  71. d jalgrataste ja autode jagatud teed
  72. """)
  73. continue
  74. # Parse command
  75. parts = user_input.split(' ', 1)
  76. if len(parts) < 2:
  77. print("❌ Vigane käsk. Kasuta: [käsk] [päring]")
  78. continue
  79. command, query = parts[0].lower(), parts[1]
  80. # Determine parameters
  81. if command == 't':
  82. context_type = "technical"
  83. search_type = "hybrid"
  84. elif command == 'l':
  85. context_type = "concise"
  86. search_type = "hybrid"
  87. elif command == 'd':
  88. context_type = "detailed"
  89. search_type = "hybrid"
  90. elif command == 's':
  91. context_type = "detailed"
  92. search_type = "semantic"
  93. elif command == 'k':
  94. context_type = "detailed"
  95. search_type = "keyword"
  96. elif command == 'h':
  97. context_type = "detailed"
  98. search_type = "hybrid"
  99. else:
  100. print(f"❌ Tundmatu käsk: {command}")
  101. continue
  102. print(f"🔍 Otsin: '{query}'...")
  103. result = engine.ask(query, search_type=search_type, context_type=context_type)
  104. print_result(result)
  105. except KeyboardInterrupt:
  106. print("\n\nVäljun...")
  107. break
  108. except Exception as e:
  109. print(f"❌ Viga: {str(e)}")
  110. engine.close()
  111. def batch_mode(queries_file: str):
  112. """Pakettrežiim - päringud failist"""
  113. try:
  114. with open(queries_file, 'r', encoding='utf-8') as f:
  115. queries = [line.strip() for line in f if line.strip()]
  116. except FileNotFoundError:
  117. print(f"❌ Faili {queries_file} ei leitud")
  118. return
  119. engine = QueryEngine()
  120. results = []
  121. print(f"⏳ Töötlen {len(queries)} päringut...")
  122. for i, query in enumerate(queries, 1):
  123. print(f" {i}/{len(queries)}: '{query}'")
  124. try:
  125. result = engine.ask(query)
  126. results.append(result)
  127. # Salvesta iga tulemus eraldi faili
  128. timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
  129. filename = f"tmp/query_result_{timestamp}_{i}.json"
  130. with open(filename, 'w', encoding='utf-8') as f:
  131. json.dump(result, f, ensure_ascii=False, indent=2)
  132. print(f" ✓ Salvestatud {filename}")
  133. except Exception as e:
  134. print(f" ✗ Viga: {str(e)}")
  135. results.append({
  136. "query": query,
  137. "error": str(e),
  138. "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  139. })
  140. engine.close()
  141. # Salvesta kõik tulemused ühte faili
  142. summary_file = f"tmp/query_summary_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
  143. with open(summary_file, 'w', encoding='utf-8') as f:
  144. json.dump(results, f, ensure_ascii=False, indent=2)
  145. print(f"\n✅ Valmis! Tulemused salvestatud faili: {summary_file}")
  146. def single_query(query: str, search_type: str = "hybrid", context_type: str = "detailed"):
  147. """Üksik päring"""
  148. engine = QueryEngine()
  149. print(f"🔍 Päring: {query}")
  150. result = engine.ask(query, search_type=search_type, context_type=context_type)
  151. print_result(result)
  152. engine.close()
  153. # Salvesta tulemus
  154. timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
  155. filename = f"tmp/query_{timestamp}.json"
  156. with open(filename, 'w', encoding='utf-8') as f:
  157. json.dump(result, f, ensure_ascii=False, indent=2)
  158. print(f"📄 Tulemus salvestatud faili: {filename}")
  159. if __name__ == "__main__":
  160. import argparse
  161. parser = argparse.ArgumentParser(description="Transpordiartiklite päringumootor")
  162. parser.add_argument("--query", "-q", help="Üksik päring")
  163. parser.add_argument("--file", "-f", help="Päringute fail (üks päring real)")
  164. parser.add_argument("--type", "-t", choices=["semantic", "keyword", "hybrid"],
  165. default="hybrid", help="Otsingu tüüp")
  166. parser.add_argument("--context", "-c", choices=["detailed", "concise", "technical"],
  167. default="detailed", help="Vastuse tüüp")
  168. parser.add_argument("--interactive", "-i", action="store_true",
  169. help="Interaktiivne režiim")
  170. args = parser.parse_args()
  171. if args.interactive:
  172. interactive_mode()
  173. elif args.file:
  174. batch_mode(args.file)
  175. elif args.query:
  176. single_query(args.query, args.type, args.context)
  177. else:
  178. # Vaikimisi interaktiivne režiim
  179. interactive_mode()