Score / core /llm_quant.py
Corin1998's picture
Create llm_quant.py
5b57f13 verified
# core/llm_quant.py
from __future__ import annotations
from typing import Dict, Any, Optional
import json
from .openai_client import get_client, TEXT_MODEL
_SYSTEM = """あなたは中立な金融アナリストです。与えられたテキストから
(1) 業界/市場のCAGR(%)、(2) 市場規模(円換算が望ましいが不明ならnull)、
(3) 主力商品/サービス数、(4) そのうち成長中の数
を抽出してください。数値は半角。根拠が複数ある場合は最も信頼できる1つを採用し、出所の短い引用も返してください。
必ず次のJSONだけを返すこと。"""
_SCHEMA = """
{
"market": {"cagr_pct": null, "size_jpy": null, "evidence": []},
"products": {"count": null, "growing_count": null, "notes": null}
}
"""
def extract_market_product_signals(text: str, company_hint: str="") -> Dict[str, Any]:
if not text or len(text.strip()) == 0:
return {"market":{"cagr_pct":None,"size_jpy":None,"evidence":[]},
"products":{"count":None,"growing_count":None,"notes":None}}
client = get_client()
prompt = f"""{_SCHEMA}
【会社名の参考】{company_hint or '(記載なし)'}
【解析対象テキスト(抜粋可)】
{text[:16000]}"""
resp = client.chat.completions.create(
model=TEXT_MODEL,
messages=[
{"role":"system","content":_SYSTEM},
{"role":"user","content":prompt},
],
response_format={"type":"json_object"},
temperature=0.1,
)
try:
return json.loads(resp.choices[0].message.content)
except Exception:
return {"market":{"cagr_pct":None,"size_jpy":None,"evidence":[]},
"products":{"count":None,"growing_count":None,"notes":None}}