File size: 1,762 Bytes
5b57f13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 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}}