Corin1998 commited on
Commit
9fb6287
·
verified ·
1 Parent(s): be1258a

Update irpr/deps.py

Browse files
Files changed (1) hide show
  1. irpr/deps.py +20 -67
irpr/deps.py CHANGED
@@ -5,16 +5,24 @@ from typing import List, Dict, Optional
5
  import numpy as np
6
  from irpr.config import settings
7
 
8
- # 書き込み先確保
9
- for d in [
10
- os.environ.get("HF_HOME", "/data/.hf-home"),
11
- os.environ.get("TRANSFORMERS_CACHE", "/data/.hf-cache"),
12
- os.environ.get("SENTENCE_TRANSFORMERS_HOME", "/data/.hf-cache"),
13
- os.environ.get("HUGGINGFACE_HUB_CACHE", "/data/.hf-cache"),
14
- settings.DATA_DIR,
15
- settings.CHROMA_PATH,
16
- ]:
17
- if d: os.makedirs(d, exist_ok=True)
 
 
 
 
 
 
 
 
18
 
19
  # 遅延ロード
20
  _EMB = None
@@ -27,7 +35,7 @@ def _get_embedder():
27
  global _EMB, _EMB_DIM
28
  if _EMB is None:
29
  from sentence_transformers import SentenceTransformer
30
- _EMB = SentenceTransformer(settings.EMB_MODEL, cache_folder=os.environ.get("HF_HOME", "/data/.hf-cache"))
31
  _EMB_DIM = _EMB.get_sentence_embedding_dimension()
32
  return _EMB
33
 
@@ -54,59 +62,4 @@ def add_to_index(records: List[Dict]):
54
  for r in records:
55
  doc_id = r.get("doc_id") or "doc"
56
  chunk_id = r.get("chunk_id") or ""
57
- rid = f"{doc_id}:{chunk_id}" if chunk_id else doc_id
58
- ids.append(rid)
59
- metas.append({
60
- "source_url": r.get("source_url"),
61
- "title": r.get("title"),
62
- "doc_id": doc_id,
63
- "chunk_id": chunk_id,
64
- })
65
- col.add(ids=ids, documents=texts, embeddings=embs, metadatas=metas)
66
-
67
- def search(query: str, top_k=8) -> List[Dict]:
68
- col = _get_chroma()
69
- q_emb = embed_texts([query])
70
- res = col.query(query_embeddings=q_emb, n_results=top_k, include=["documents","metadatas","distances","ids"])
71
- docs = res.get("documents", [[]])[0]
72
- metas = res.get("metadatas", [[]])[0]
73
- dists = res.get("distances", [[]])[0]
74
- out: List[Dict] = []
75
- for text, meta, dist in zip(docs, metas, dists):
76
- score = 1.0 - float(dist)/2.0 if dist is not None else None
77
- out.append({
78
- "text": text,
79
- "source_url": (meta or {}).get("source_url"),
80
- "title": (meta or {}).get("title"),
81
- "doc_id": (meta or {}).get("doc_id"),
82
- "chunk_id": (meta or {}).get("chunk_id"),
83
- "score": score,
84
- })
85
- return out
86
-
87
- # ==== 生成(任意) ====
88
- def _get_gen_pipeline():
89
- """GEN_MODEL が空なら LLM 無効の合図として例外を投げる"""
90
- if not settings.GEN_MODEL:
91
- raise RuntimeError("GEN_MODEL is empty (LLM disabled).")
92
- global _GEN, _TOK
93
- if _GEN is None:
94
- from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
95
- import torch
96
- name = settings.GEN_MODEL
97
- _TOK = AutoTokenizer.from_pretrained(name, cache_dir=os.environ.get("HF_HOME", "/data/.hf-cache"))
98
- _MODEL = AutoModelForCausalLM.from_pretrained(
99
- name,
100
- cache_dir=os.environ.get("HF_HOME", "/data/.hf-cache"),
101
- torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
102
- device_map="auto",
103
- low_cpu_mem_usage=True,
104
- )
105
- _GEN = pipeline("text-generation", model=_MODEL, tokenizer=_TOK)
106
- return _GEN, _TOK
107
-
108
- def generate_chat(messages: List[Dict], max_new_tokens=600, temperature=0.2) -> str:
109
- gen, tok = _get_gen_pipeline()
110
- prompt = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
111
- out = gen(prompt, do_sample=(temperature>0.0), temperature=temperature, max_new_tokens=max_new_tokens)[0]["generated_text"]
112
- return out[len(prompt):].strip()
 
5
  import numpy as np
6
  from irpr.config import settings
7
 
8
+ # ===== 書き込み可能な場所にキャッシュを集約 =====
9
+ BASE = settings.DATA_DIR or "./var"
10
+ DEFAULT_CACHE = os.path.join(BASE, ".hf-cache")
11
+ DEFAULT_HOME = os.path.join(BASE, ".hf-home")
12
+
13
+ # 既に設定が無ければ、ここで安全なデフォルトに設定
14
+ os.environ.setdefault("HF_HOME", DEFAULT_HOME)
15
+ os.environ.setdefault("TRANSFORMERS_CACHE", DEFAULT_CACHE)
16
+ os.environ.setdefault("SENTENCE_TRANSFORMERS_HOME", DEFAULT_CACHE)
17
+ os.environ.setdefault("HUGGINGFACE_HUB_CACHE", DEFAULT_CACHE)
18
+
19
+ for d in [os.environ["HF_HOME"], os.environ["TRANSFORMERS_CACHE"],
20
+ os.environ["SENTENCE_TRANSFORMERS_HOME"], os.environ["HUGGINGFACE_HUB_CACHE"],
21
+ BASE, settings.CHROMA_PATH]:
22
+ try:
23
+ os.makedirs(d, exist_ok=True)
24
+ except Exception:
25
+ pass # フォルダ作成に失敗しても致命ではない
26
 
27
  # 遅延ロード
28
  _EMB = None
 
35
  global _EMB, _EMB_DIM
36
  if _EMB is None:
37
  from sentence_transformers import SentenceTransformer
38
+ _EMB = SentenceTransformer(settings.EMB_MODEL, cache_folder=os.environ.get("HF_HOME", DEFAULT_CACHE))
39
  _EMB_DIM = _EMB.get_sentence_embedding_dimension()
40
  return _EMB
41
 
 
62
  for r in records:
63
  doc_id = r.get("doc_id") or "doc"
64
  chunk_id = r.get("chunk_id") or ""
65
+ rid = f"{doc_id}:{chunk_id}