Initial SQL-only 1C adapter baseline
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
from common import read_json, search_lexical_index
|
||||
from rag_profiles import resolve_rag_profile
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
DEFAULT_INDEX = ROOT / "plugins" / "1c" / "datasets" / "prepared" / "rag_index.json"
|
||||
|
||||
|
||||
def print_result(result: dict, index: int) -> None:
|
||||
document = result["document"]
|
||||
content = (document.get("content") or "").strip().replace("\n", " ")
|
||||
if len(content) > 500:
|
||||
content = content[:497].rstrip() + "..."
|
||||
|
||||
print(f"{index}. score={result['score']:.4f}")
|
||||
print(f" source={document.get('source_path')} chunk={document.get('chunk_index')}")
|
||||
print(f" title={document.get('title')}")
|
||||
if (document.get("metadata") or {}).get("heading"):
|
||||
print(f" heading={(document.get('metadata') or {}).get('heading')}")
|
||||
print(f" content={content}")
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(description="Search the local 1C RAG lexical index.")
|
||||
parser.add_argument("query")
|
||||
parser.add_argument("--index", type=Path, default=DEFAULT_INDEX)
|
||||
parser.add_argument("--profile", default="auto")
|
||||
parser.add_argument("--limit", type=int)
|
||||
parser.add_argument("--candidate-limit", type=int)
|
||||
parser.add_argument("--dedupe-by-document", action="store_true")
|
||||
parser.add_argument("--min-score", type=float)
|
||||
parser.add_argument("--source-type", action="append", dest="source_types")
|
||||
parser.add_argument("--json", action="store_true")
|
||||
args = parser.parse_args()
|
||||
|
||||
index = read_json(args.index)
|
||||
profile = resolve_rag_profile(args.profile, args.query)
|
||||
source_types = args.source_types if args.source_types is not None else profile["source_types"]
|
||||
results = search_lexical_index(
|
||||
index,
|
||||
query=args.query,
|
||||
limit=args.limit or int(profile["limit"]),
|
||||
candidate_limit=args.candidate_limit or int(profile["candidate_limit"]),
|
||||
dedupe_by_document=args.dedupe_by_document or bool(profile["dedupe_by_document"]),
|
||||
min_score=float(args.min_score if args.min_score is not None else profile["min_score"]),
|
||||
source_types=source_types,
|
||||
)
|
||||
|
||||
if args.json:
|
||||
print(json.dumps(results, ensure_ascii=False, indent=2))
|
||||
elif results:
|
||||
for position, result in enumerate(results, start=1):
|
||||
print_result(result, position)
|
||||
else:
|
||||
print("No matches.")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user