| from flask import Flask, render_template, request |
| from functools import lru_cache |
| import math |
| import os |
| from dotenv import load_dotenv |
|
|
| from colbert.infra import Run, RunConfig, ColBERTConfig |
| from colbert import Searcher |
|
|
| load_dotenv() |
|
|
| INDEX_NAME = os.getenv("INDEX_NAME") |
| INDEX_ROOT = os.getenv("INDEX_ROOT") |
| app = Flask(__name__) |
|
|
| dataset_name = "multiqa_text" |
|
|
| searcher = Searcher(index=os.path.join(os.environ.get("RAGQA_COLBERT_INDEX_ROOT", ""), dataset_name, "indexes", f"{dataset_name}.nbits=2")) |
|
|
| counter = {"api" : 0} |
|
|
| @lru_cache(maxsize=1000000) |
| def api_search_query(query, k): |
| |
| if k == None: k = 100 |
| k = int(k) |
| pids, ranks, scores = searcher.search(query, k=100) |
| pids, ranks, scores = pids[:k], ranks[:k], scores[:k] |
| passages = [searcher.collection[pid] for pid in pids] |
| probs = [math.exp(score) for score in scores] |
| probs = [prob / sum(probs) for prob in probs] |
| topk = [] |
| for pid, rank, score, prob in zip(pids, ranks, scores, probs): |
| text = searcher.collection[pid] |
| d = {'text': text, 'pid': pid, 'rank': rank, 'score': score, 'prob': prob} |
| topk.append(d) |
| topk = list(sorted(topk, key=lambda p: (-1 * p['score'], p['pid']))) |
| return {"query" : query, "topk": topk} |
|
|
| @app.route("/api/search", methods=["GET"]) |
| def api_search(): |
| if request.method == "GET": |
| counter["api"] += 1 |
| print("API request count:", counter["api"]) |
| return api_search_query(request.args.get("query"), request.args.get("k")) |
| else: |
| return ('', 405) |
|
|
| if __name__ == "__main__": |
| app.run("0.0.0.0", 8895) |
|
|