Veblen34's picture
Upload folder using huggingface_hub
cd6775d verified
Raw
History Blame Contribute Delete
2.17 kB
from flask import Flask, render_template, request, jsonify
from functools import lru_cache
import math
import os
from dotenv import load_dotenv
os.environ['CUDA_VISIBLE_DEVICES'] = "1"
from colbert.infra import Run, RunConfig, ColBERTConfig
from colbert import Searcher
import torch
import base64
import io
app = Flask(__name__)
dataset_name = "webq"
searcher = Searcher(index=f"/data1/liuyaoyang/Papers/icml2025/multi_rag/RAG/Search-in-the-Chain/ColBERT/experiments/{dataset_name}/indexes/{dataset_name}.nbits=2")
def api_search_query(query, mask, k=100):
pids, ranks, scores = searcher.search_with_mask(query, mask, k=100)
# pids, ranks, scores = searcher.search(query, k=100)
pids, ranks, scores = pids[:100], ranks[:100], scores[:100]
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 {
"topk": topk,
}
@app.route('/api/search', methods=['POST'])
def handle_search():
# 获取JSON数据
data = request.get_json()
# 校验必要参数
if not data or 'query' not in data or 'mask' not in data:
return jsonify({"error": "Missing 'query' or 'mask' parameter"}), 400
try:
# 解析参数
query = data['query']
mask_b64 = data['mask']
k = data.get('k', 100) # 默认值100
# Base64解码并加载张量
mask_bytes = base64.b64decode(mask_b64)
buffer = io.BytesIO(mask_bytes)
mask_tensor = torch.load(buffer)
# print(mask_tensor)
# 执行处理函数
result = api_search_query(query, mask_tensor, k)
return jsonify(result)
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run("0.0.0.0", 8110)