File size: 5,062 Bytes
95f7828
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# Message customization logic
from dataclasses import dataclass
from typing import Any, TypeVar

from langchain.output_parsers import OutputFixingParser
from langchain.output_parsers.prompts import NAIVE_FIX_PROMPT
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableSerializable

from .config import settings
from .model import gpt4o

T = TypeVar("T")


extraction_messages = [
    (
        "system",
        """あなたは企業情報の分析に優れた専門家です。  
        与えられた情報を元に、可能な限り詳細で有益な企業概要を**日本語**で作成してください。  

        ### **概要に含めるべき内容:**
        1. **会社名とアイデンティティ**  
           - 会社名、設立背景、歴史、特徴など。  
           - もし背景情報が不足している場合、**可能な推測(例: 業界や関連事業の一般的な傾向)** を交えながら説明する。  

        2. **コアビジネスとミッション**  
           - 事業内容、主要サービス、企業の使命や目標。  
           - もしミッションが明確でない場合、事業内容から推測できる可能性のある方向性を述べる。  

        3. **主要プロジェクトやイニシアティブ**  
           - 企業が取り組んでいる重要なプロジェクトや技術。  
           - **具体的な情報がない場合でも、企業の業界における一般的な取り組みを補足し、可能な活動内容を示唆する。**  

        4. **業界と市場での地位**  
           - 企業が属する業界、市場での競争環境、主な競合企業。  
           - **業界情報を活用して、可能な市場ポジションを考察する。**  

        ### **重要なルール**
        - **与えられた情報を最大限活用し、不完全な場合もできる限り推測を交えて説明する。**
        - **決して情報を捏造せず、信頼できる情報源が不足している場合は、その旨を明示する。**
        - **単なる「情報が不足しています」という回答ではなく、読者が次に取るべき調査ステップを提案する。**
        """
    ),
    (
        "human",
        """以下の企業情報を分析し、可能な限り詳細な企業概要を **日本語** で作成してください。  

        **提供された企業情報:**  
        {scraped_message}  

        **要求事項:**  
        - 企業の業界、事業内容、競争環境を考慮した **具体的な説明** を記述すること。  
        - 情報が不足している場合でも、 **業界の一般的な知識を活用し、可能な考察を加えること**。  
        - もし詳細情報が不足している場合は、 **読者が追加情報を得るための推奨アクション(例: 公式サイトの確認、ニュースリリースのチェック)** を明示すること。  
        """
    )
]



generation_messages = [
    (
        "system",
        """You are an expert in writing **personalized, compelling, and persuasive sales messages** in Japanese.

        Your task is to craft a customized message based on the company's business summary and the provided generic message.

        ### **Guidelines:**
        1. **Personalize the message** using the company's industry, goals, and key projects.
        2. **Make a strong connection** between the company's mission and the value proposition in the generic message.
        3. **Keep the core intent** of the generic message intact while making it highly relevant.
        4. **Ensure the message flows naturally** and does not feel robotic or forced.
        5. **If the company summary lacks details**, return the generic message **without forced personalization**.
        """
    ),
    (
        "human",
        """Generate a well-structured and persuasive sales message in **Japanese** based on the following details:

        **Company Summary:**
        {summary_output}

        **Generic Message:**
        {generic_message}

        ### **Instructions:**
        - Begin with: **"貴社は [business field/service] に従事しており、"**  
        - Clearly highlight how the company's **projects and goals** align with the proposed solution.
        - Use a **smooth, engaging, and persuasive tone** without making it sound artificial.
        - If the summary lacks sufficient details, simply **return the generic message as it is** without attempting to force customization.
        """
    )
]



def build_output_fixing_parser(
    *, parser: Any, llm: Any = gpt4o
) -> OutputFixingParser[Any]:
    """Build output fixing parser with retry capability"""
    retry_chain: RunnableSerializable[dict[str, Any], str] = NAIVE_FIX_PROMPT | llm | StrOutputParser()
    return OutputFixingParser(
        parser=parser,
        retry_chain=retry_chain,
        max_retries=settings.LANGCHAIN_RETRY_LIMIT,
    )