Metadata-Version: 2.1
Name: ConversationAgent
Version: 0.4.7
Summary: ConversationAgent
Home-page: https://github.com/Chunshan-Theta/ConversationAgent
Author: Theta
License: UNKNOWN
Description: ## 說明
        不需資料庫之對話腳本代理。
        
        ## agent
        `agent`可以透過Json來產生對話核心，為此我們有一個接口可以使用
        ```
        from ConversationAgent.LibStage import gen_agent
        from ConversationAgent import to_bot
        ```
        - 透過"ConversationAgent.LibStage.gen_agent"方法來建置機器人
        - 透過"ConversationAgent.to_bot"方式與機器人溝通
            - 該方法需要三個參數
                - agent代理物件: gen_agent 產生
                - text: 使用者輸入內容，字串內容
                - data: 過場資訊，預設使用`{}`空字典，第二次與之後溝通應該戴上 `to_bot` 回傳的資料。
            - 該方法會回傳機器人回應與過場資訊，下次溝通保留該過場資訊在進行溝通。
            
        ### Quick start
        ```
        from ConversationAgent.LibStage import gen_agent
        import ConversationAgent
        bot = {
            "__MAIN_STAGES__": [
                {
                    "stage_type": "__QA_STAGE__",
                    "qa_threshold": 1,
                    "__STAGE_NAME__": "__開始階段__",
                    "__SYS_QUESTION__": {
                        "__SYS_WELCOME__": "歡迎句",
                        "__SYS_REFUSE__": "拒絕句",
                        "__SYS_COMPLETE__": "完成句"
                    },
                    "corpus": {
                        "早安": "1",
                        "午安": "2",
                        "晚安": "3"
                    },
                    "__SAVED_NAME__": {
                        QAStage.__QA_RESPOND__: "QA_r1",
                        QAStage.__QA_RESPOND_THRESHOLD__: "QA_th",
                        QAStage.__QA_RESPOND_QUESTION__: "QA_q1",
                        QAStage.__QA_RESPOND_SCORE__: "QA_s1",
                        QAStage.__RUNNING_CORPUS__: "QA_c1",
                    },
                    "__DISABLE_WELCOME__": False
                }
            ]
        }
        print(f"\n" * 5)
        
        agent = gen_agent(bot)
        data = {}
        reply_text, data = ConversationAgent.to_bot(agent, "哈囉", data)
        print(f"reply_text: {reply_text}， ")
        reply_text, data = ConversationAgent.to_bot(agent, "哈囉", data)
        print(f"reply_text: {reply_text}， ")
        reply_text, data = ConversationAgent.to_bot(agent, "早安", data)
        print(f"reply_text: {reply_text}， ")
        ```
        
        ## Stage 種類
        ### RE_STAGE
        
        RE_STAGE 採用`stage_type`為`__RE_STAGE__`，是用於最基礎的對話階段，由兩個主要結構構成：
        1. `__SYS_QUESTION__`: 用來設定該階段的回應句，回應句有三種類型
           * 歡迎句: 第一次到該階段時，機器人會回應該句子。(可依需求關閉功能，`DISSABLE_WELCOME`設為`True`就關閉，預設為`False`。)
           * 拒絕句: 當沒有滿足抓取到所有`is_fits`部分所要求的變數時，機器人會回應該句子。
           * 完成句: 以上都完成時，機器人會回應該句子。(可透過`%%`包裹變數名稱，並以`空格`前後相隔後，調用該變數。)
        
        2. is_fits: 透過`正規表達式(regular expression)`從使用者的輸入句子來抓取變數，該變數會儲存起來提供給`完成句`和 `SWITCH_STAGE`使用。
        
        選用設定:
        1. `__STAGE_NAME__`: 這是選用設定。 可以設定每個stage的獨特名稱，名稱不可重複。
        2. `__SYS_WELCOME__`、`__SYS_REFUSE__`、`__SYS_COMPLETE__`的回應句可以設定成文字陣列，若設為陣列則會隨機取用。
        ```
        {
            "stage_type": "__RE_STAGE__",
            "__STAGE_NAME__": "__開始階段__",
            "__SYS_QUESTION__": {
                "__SYS_WELCOME__": "歡迎句",
                "__SYS_REFUSE__": "拒絕句",
                "__SYS_COMPLETE__": "完成句"
            },
            "is_fits": [
                [".*", "YOUSAYS"]
            ],
            "__DISABLE_WELCOME__": False,
            "__DISABLE_REFUSE__": False
        }
        ```
        
        ### SWITCH_STAGE
        
        SWITCH_STAGE 採用`stage_type`為`__LIB_SWITCH_STAGE__`，用於在`Agent`不同路線切換，主要結構是`stages_filter`。 stages_filter用來設定切換路線的條件，用`[]`可包含帶多種條件多路線，每一條件單位由`變數名稱`、`限定數值`和 `切換路線`三部分組成。
        
        以下說明主要幾種設置方式:
        * 無條件設定:
            ```
            [
                ["*",True,"_新路線1_"]
            ]
            ```
        * 單一條件設定:
            ```
            [
                ["_VAR_","VALUE1","_新路線1_"],
                ["_VAR_","VALUE2","_新路線2_"]
            ]
            ```
        * 多條件設定:
            ```
            [
                [["_VAR1_","_VAR2_"],["VALUE1","VALUE2"],"_新路線1_"],
                [["_VAR1_","_VAR2_"],["VALUE3","VALUE4"],"_新路線2_"],
            ]
            ```
        * 混合條件設定:
            ```
            [
                ["_VAR1_","VALUE1","_新路線1_"],
                [["_VAR1_","_VAR2_"],["VALUE3","VALUE4"],"_新路線2_"],
                ["*",True,"_新路線3_"]
            ]
            ```
        * 非`=`之條件設定:
            ```
            [
                ["_VAR1_",0.95,"_新路線1_",">="]
            ]
            ```
          
        * 多重非`=`之條件設定:
            ```
            [
                [["_VAR1_","_VAR2_"],[0.1,0.56],"_新路線1_",[">=","<"]]
            ]
            ```
          
        **儲存變數方式是透過`RE_STAGE`的 `is_fits`來執行。
        
        範例：
        ```
        {
            "stage_type": "__LIB_SWITCH_STAGE__",
            "stages_filter": [
                ["VAR","我想要的數值","_成功路線_"],,
                ["*",True,"_失敗路線_"]
            ]
        
        }
        ```
        
        ### QA_STAGE
        QA_STAGE 採用`stage_type`為`__QA_STAGE__`，是通過`相似度`來決定回應的一種階段，主要有三個部分的組成。
        1. says: 用來設定該階段的回應句，回應句有三種類型
           * 歡迎句: 第一次到該階段時，機器人會回應該句子。(可依需求關閉功能，`DISSABLE_WELCOME`設為`True`就關閉，預設為`False`。)
           * 拒絕句: 當相似分數低於`qa_threshold`時，機器人會回應該句子。(可依需求關閉功能，`__DISABLE_REFUSE__`設為`True`就關閉，預設為`False`。)
           * 完成句: 以上都完成時，機器人會回應該句子。(可透過`%%`包裹變數名稱，並以`空格`前後相隔後，調用該變數。)
        
        2. corpus: 使用者的輸入會與該字典的所有`key`進行比對，並儲存相關結果，相關結果包含：
            * `__QA_RESPOND_QUESTION__`: 相似值最高的 key
            * `__QA_RESPOND__`: 相似值最高的 key 對應之 value
            * `__QA_RESPOND_SCORE__`: 相似值最高的數值
            * `__RUNNING_CORPUS__`: 該次測試時使用的 corpus
            * `__QA_RESPOND_THRESHOLD__`: 該次測試使用的 threshold
            
        3. `__SAVED_NAME__`: 設定儲存之變數的名稱，方便使用。
        
        
        ```
         {
            "stage_type": "__QA_STAGE__",
            "qa_threshold": 1,
            "says": {
                "sys_welcome": "歡迎句",
                "sys_refuse": "拒絕句",
                "sys_complete": "完成句"
            },
            "corpus": {
                "早安": "1",
                "午安": "2",
                "晚安": "3"
            },
            "__SAVED_NAME__": {
                "__QA_RESPOND__": "QA_r1",
                "__QA_RESPOND_THRESHOLD__": "QA_th",
                "__QA_RESPOND_QUESTION__": "QA_q1",
                "__QA_RESPOND_SCORE__": "QA_s1",
                "__RUNNING_CORPUS__": "QA_c1",
            },
            "__DISABLE_WELCOME__": False,
            "__DISABLE_REFUSE__": False,
        }
        ```
        
        
        
        ## More Examples
        
        # 飲料店
        ```
        bot = {
            "__MAIN_STAGES__": [
                {
                    "stage_type": "__RE_STAGE__",
                    "question": {
                        "sys_welcome": "歡迎來到飲料店，請輸入您要的東西 紅茶/綠茶 少冰/去冰",
                        "sys_refuse": "不完全輸入 %%drink_type%% %%ice_type%% ",
                        "sys_complete": "你輸入的內容是 %%drink_type%% %%ice_type%% "
                    },
                    "is_fits": [
                        ["(紅茶|綠茶)+", "drink_type"],
                        ["(少冰|去冰)+", "ice_type"],
        
                    ]
                },
                {
                    "stage_type": "__LIB_SWITCH_STAGE__",
                    "stages_filter": [
                        [["drink_type", "ice_type"], ["綠茶", "去冰"], "_新路線1_"],
                        ["*", True, "_新路線2_"]
                    ]
        
                }
            ],
            "_新路線1_": [
                {
                    "stage_type": "__RE_STAGE__",
                    "question": {
                        "sys_welcome": "",
                        "sys_refuse": "",
                        "sys_complete": "切換分之成功1"
                    },
                    "__DISSABLE_Q1__": True
                },
            ],
            "_新路線2_": [
                {
                    "stage_type": "__RE_STAGE__",
                    "question": {
                        "sys_welcome": "",
                        "sys_refuse": "",
                        "sys_complete": "切換分之成功2"
                    },
                    "__DISSABLE_Q1__": True
                },
            ]
        }
        print(f"\n" * 5)
        
        agent = gen_agent(bot)
        data = {}
        reply_text, data = ConversationAgent.to_bot(agent, "哈囉", data)
        print(f"reply_text: {reply_text}， ")
        reply_text, data = ConversationAgent.to_bot(agent, "紅茶", data)
        print(f"reply_text: {reply_text}， ")
        reply_text, data = ConversationAgent.to_bot(agent, "少冰", data)
        print(f"reply_text: {reply_text}， ")
        ```
        
        ## ToDo
        
        ~~* Switch除了等號以外的方法~~
        
        ~~* DISSABLE_WELCOME測試與勘誤名詞~~
        
        ~~* QAStage 停用拒絕句(無論分數都會通過)~~
        
        ~~* 多回應方式~~
        
        ~~* 設定階段名稱~~
        
        * 修正QAstage為相似度模型階段
        * 分類型模型階段
        * 繼承的範例
        * 說明agent刪除變數的規則
        
        
        
Platform: UNKNOWN
Description-Content-Type: text/markdown
