|
|
|
|
|
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}} |
|
|
|