# [LangChain] 範例-病症顧問 日期:2023/09/21 ## 敘述 - 主題:SequentialChain() - 使用情境:對於碰到的症狀或疾病進行初步詢問,程式將根據不同項目(參考輸出)告訴使用者相關資訊。 若直接向ChatGPT詢問事情,有時會得到非常籠統的答案,或是得出自己並不想知道的資訊。此程式將使用不同的cahin,各自用於回答不同的問題,讓每個問答項目都是獨立清晰,較為容易理解。 - 輸入:敘述自己的症狀或疾病。 - 輸出:根據輸入的症狀或疾病進行回應,輸出將分別包含以下資訊: - 原因 - 症狀 - 一般建議 - 藥物建議 - 藥物的效用與副作用 補充: 此程式架構適用於,同個敘述延伸出多個不同類型問答。 ## 目錄 - [1. 主程式](#1-主程式) - [2. 輸入輸出](#2-輸入輸出) ____________________ ## 1. 主程式 導入套件 ```python= from dotenv import load_dotenv load_dotenv() from langchain.chat_models import ChatOpenAI from langchain.prompts import ( ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate, ) from langchain import LLMChain llm = ChatOpenAI(temperature=0.7) ``` ```python= from langchain.chains import SequentialChain ``` 定義各個chain,此範例中總共使用了5個LLMChain()物件用於問答,將分別回應症狀或病名幾個資訊,包含:原因、症狀、一般建議、藥物建議、藥物的效用與副作用。每個chain輸出結果將使用LLMChain()中提供的output_key參數進行定義。 大多數的chain將直接使用程式的輸入,除了chain5會使用chain4的輸出作為輸入。原因為,chain4將會回答藥物種類,而chain5則根據這些藥物種類回答效用與副作用。 ```python= #定義chain1 system_message = '根據使用者提到的症狀或病名,僅需解釋其"成因"。' prompt = ChatPromptTemplate( messages = [ SystemMessagePromptTemplate.from_template(system_message), HumanMessagePromptTemplate.from_template("{input}") ] ) chain1 = LLMChain(llm=llm, prompt=prompt, output_key="reason") #定義chain2 system_message = '根據使用者提到的症狀或病名,僅需描述其"症狀"。' prompt = ChatPromptTemplate( messages = [ SystemMessagePromptTemplate.from_template(system_message), HumanMessagePromptTemplate.from_template("{input}") ] ) chain2 = LLMChain(llm=llm, prompt=prompt, output_key="symptom") #定義chain3 system_message = '根據使用者提到的症狀或病名,僅需提供改善或治療相關的意見。' prompt = ChatPromptTemplate( messages = [ SystemMessagePromptTemplate.from_template(system_message), HumanMessagePromptTemplate.from_template("{input}") ] ) chain3 = LLMChain(llm=llm, prompt=prompt, output_key="advice") #定義chain4 system_message = '根據使用者提到的症狀或病名,僅需推薦具體"藥物名稱",並且不要回覆其他以外的答案。' prompt = ChatPromptTemplate( messages = [ SystemMessagePromptTemplate.from_template(system_message), HumanMessagePromptTemplate.from_template("{input}") ] ) chain4 = LLMChain(llm=llm, prompt=prompt, output_key="medicine") #定義chain5 system_message = '請根據輸入中提及的藥物名稱,說明其功能以及副作用。' prompt = ChatPromptTemplate( messages = [ SystemMessagePromptTemplate.from_template(system_message), HumanMessagePromptTemplate.from_template("{medicine}") ] ) chain5 = LLMChain(llm=llm, prompt=prompt, output_key="medicine_effect") ``` 將前面所有chain使用於定義SequentialChain(),透過此物件便將所有chain都串接在一起了。 ```python= #定義SequentialChain() overall_chain = SequentialChain( chains=[chain1, chain2, chain3, chain4, chain5], input_variables=["input"], output_variables=["reason", "symptom", "advice", "medicine", "medicine_effect"], verbose=True ) ``` ## 2. 輸入輸出 以下將提供3種不同的輸入供參考。 **輸入一** ```python= #input provided input_text = '我好像得了腸胃炎了' output = overall_chain(input_text) ``` :::success \> Entering new SequentialChain chain... \> Finished chain. ::: 透過以下程式碼了解輸出的資訊。可發現輸出為dict,其中包含了六個key,第一個key-input為輸入以外,其他各自對應到各個chain的輸出。 ```python= print('output其中包含的元素數:',len(output)) print(output.keys()) ``` :::success output其中包含的key: 6 dict_keys(['input', 'reason', 'symptom', 'advice', 'medicine', 'medicine_effect']) ::: 為了讓讀者方便察看結果,使用下面程式碼打印所有結果。 ```python= #顯示結果 for key in output: print('-'*45) print(key,':') print(output[key]) ``` :::success input : 我好像得了腸胃炎了 \--------------------------------------------- reason : 腸胃炎是指腸道和胃部的炎症,通常由病毒、細菌或寄生蟲感染引起。以下是引起腸胃炎的常見成因: \1. 病毒感染:腸胃炎最常見的成因之一是病毒感染,如腺病毒、諾羅病毒、食物中毒引起的病毒等。這些病毒可以通過食物、水或與感染者接觸傳播。 \2. 細菌感染:某些細菌,如沙門氏菌、大腸桿菌和鏈球菌等,也可以引起腸胃炎。這些細菌通常通過食物中的污染或不良衛生習慣傳播。 \3. 寄生蟲感染:寄生蟲如蠕蟲、旋毛蟲和阿米巴原蟲等也可能引起腸胃炎。這些寄生蟲可以通過飲水或食物中的寄生蟲卵傳播。 \4. 飲食不當:飲食不衛生或食用過期或不新鮮的食物可能引起腸胃炎。食物中的細菌或病毒可以在消化道中繁殖,導致炎症。 \5. 藥物或化學物質:某些藥物或化學物質,如抗生素、非甾類抗炎藥、酒精等,可能刺激腸道黏膜,引起腸胃炎。 \6. 免疫系統問題:免疫系統問題、長期壓力或其他健康狀況可能增加感染腸胃炎的風險。 要確診腸胃炎,需要進一步的醫學檢查和評估。如果您懷疑自己患有腸胃炎,建議尋求醫生的建議和適當的治療。 \--------------------------------------------- symptom : 腸胃炎的症狀包括腹痛、腹部脹氣、噁心、嘔吐、腹瀉、食慾不振、以及可能出現輕微發燒。 \--------------------------------------------- advice : 如果你確定自己可能患上腸胃炎,以下是一些改善症狀的建議: \1. 休息:給予身體足夠的休息時間,讓它能夠恢復和治愈。 \2. 飲食調整:少量多餐,避免油膩、辛辣、刺激性食物和飲料,以免增加腸胃負擔。選擇清淡易消化的食物,如米粥、麵包、蘋果等。 \3. 適量補充水分:腸胃炎可能導致脫水,要確保足夠的水分攝入,可以喝些溫水、果汁或含電解質的飲料。 \4. 避免刺激性藥物:避免使用非處方抗生素和非類固醇消炎藥等可能刺激腸胃的藥物,除非醫生有指示。 \5. 藥物治療:如果症狀嚴重,可以考慮使用醫生開的抗生素或其他藥物來治療腸胃炎。 然而,以上僅為一般性建議,若症狀持續或加重,建議尋求醫生的專業建議和治療。 \--------------------------------------------- medicine : 你可以嘗試服用"胃藥"或"抗生素"來緩解腸胃炎症狀。請咨詢醫生或藥師的建議,以確定適合你的藥物選擇和劑量。 \--------------------------------------------- medicine_effect : "胃藥"並非特定的藥物名稱,而是指用於緩解胃部不適或腸胃炎症狀的藥物類別。常見的胃藥包括抗酸藥、抗胃酸藥和抗胃潰瘍藥等。這些藥物的功能是減少胃酸分泌,保護胃黏膜,以及緩解胃脹、胃痛和消化不良等症狀。 然而,胃藥也有一些副作用。常見的副作用包括頭痛、噁心、嘔吐、腹瀉、便秘、腹部不適和藥物過敏反應等。某些胃藥可能與其他藥物產生不良互動,因此在使用之前應該諮詢醫生或藥師的建議。 "抗生素"是一種用於治療細菌感染的藥物。它可以殺死或抑制細菌的生長,幫助身體恢復健康。不同的抗生素對不同類型的細菌有不同的作用方式。 然而,抗生素也有一些副作用。常見的副作用包括腹瀉、腸胃不適、食慾減退、頭痛、噁心、嘔吐和藥物過敏反應等。此外,長期或不適當使用抗生素可能導致細菌耐藥性的發展,這意味著抗生素在治療感染時可能不再有效。 綜上所述,無論是服用胃藥還是抗生素,都應該在醫生或藥師的指導下使用,以確定適合的藥物選擇、正確的劑量和使用期限,並注意可能的副作用和藥物互動。 ::: 以下嘗試提供其他輸入給程式。 **輸入二** ```python= #input provided input_text = '我今天頭好痛' output = overall_chain(input_text) ``` :::success \> Entering new SequentialChain chain... \> Finished chain. ::: ```python= for key in output: print('-'*45) print(key,':') print(output[key]) ``` :::success input : 我今天頭好痛 \--------------------------------------------- reason : 頭痛是一種常見的症狀,其成因可能有多種原因。以下是一些可能導致頭痛的常見成因: \1. 壓力和疲勞:長時間的壓力和疲勞可能會導致頭痛。這可能是因為壓力和疲勞影響了神經系統的功能,導致血管收縮或擴張,進而引起頭痛。 \2. 缺乏睡眠:睡眠不足或睡眠質量不佳可能會導致頭痛。睡眠是身體修復和恢復的重要過程,缺乏睡眠可能會擾亂神經系統的平衡,導致頭痛。 \3. 過度使用電子產品:長時間盯著電子產品的螢幕,如電腦、手機或平板電腦,可能會引起頭痛。這可能是因為螢幕的藍光刺激了眼睛,並干擾了視覺系統和神經系統的正常功能。 \4. 飲食因素:某些食物或飲料可能會引起頭痛。例如,咖啡因、紅酒、巧克力、致敏物質或添加劑等,可能會觸發頭痛。 \5. 身體姿勢不良:長時間保持不良的姿勢,如長時間低頭看手機或電腦,可能會導致頸部和頭部肌肉緊張,進而引起頭痛。 \6. 眼睛問題:視力問題,如近視、遠視或散光,可能會導致頭痛。眼睛過度用力以適應視力問題可能會導致眼睛周圍的肌肉緊張,進而引起頭痛。 \7. 氣候變化:氣候變化、氣壓變化或溫度變化可能會影響血管收縮和擴張,進而引起頭痛。 請注意,這僅僅是一些常見的頭痛成因。如果頭痛持續或頻繁發作,建議諮詢醫生以獲得專業意見和治療建議。 \--------------------------------------------- symptom : 使用者表示今天頭痛。 \--------------------------------------------- advice : 您好,頭痛可能是由多種原因引起的,如壓力、缺乏睡眠、飲食不均衡、眼睛疲勞等。以下是一些建議,可以嘗試改善頭痛症狀: \1. 休息:試著放鬆身體,休息一下,避免長時間用力或保持同一個姿勢。 \2. 應用熱敷或冷敷:使用熱敷或冷敷可有助於緩解頭痛。請根據自己的感覺選擇適合的方式。 \3. 喝足夠的水:水分不足可能導致頭痛,確保您足夠地飲水。 \4. 適度運動:進行輕度的運動有助於促進血液循環,減輕頭痛。 \5. 遠離刺激物:避免暴露在刺激物中,如噪音、強光、煙霧等。 如果頭痛持續或頻繁發作,建議您尋求醫生的建議,以確定病因並獲得適當的治療。 \--------------------------------------------- medicine : 建議您服用"布洛芬"來緩解頭痛。 \--------------------------------------------- medicine_effect : 布洛芬是一種非類固醇抗炎藥物,具有抗痛、退燒和消炎的作用。它可以用於緩解頭痛、牙痛、肌肉痛、關節痛和經痛等不同類型的疼痛症狀。 然而,布洛芬也有一些常見的副作用。常見的副作用包括胃部不適、消化道潰瘍、噁心、嘔吐、胃灼熱感和食慾不振。在長期或高劑量使用下,布洛芬還可能導致腎臟損傷、高血壓、水腫和心血管問題。 此外,布洛芬也有一些嚴重的副作用,如胃腸道出血、腎功能衰竭、心臟問題和過敏反應。因此,在服用布洛芬之前,請務必遵從醫生的建議,確保使用安全並避免潛在的副作用。 ::: **輸入三** ```python= #input provided input_text = '我今天搬米袋時,扭到了我的腳。' output = overall_chain(input_text) ``` :::success \> Entering new SequentialChain chain... \> Finished chain. ::: ```python= for key in output: print('-'*45) print(key,':') print(output[key]) ``` :::success input : 我今天搬米袋時,扭到了我的腳。 \--------------------------------------------- reason : 當您扭傷腳時,通常是由於腳部受到過度拉扯或扭曲而導致的。這可能是由於以下原因之一: \1. 肌肉或腱的拉傷:當您突然改變移動方向、跳躍或承受重物時,可能會導致肌肉或腱受到過度拉伸或撕裂。這種情況通常稱為扭傷或扭曲。 \2. 韌帶損傷:腳部的韌帶是連接骨頭的結締組織。當腳部受到劇烈扭曲時,韌帶可能會受傷或撕裂。這種情況常見於腳踝。 \3. 骨折:嚴重的扭傷可能會導致骨頭斷裂。這種情況通常需要進一步的醫療處理。 不論扭傷的嚴重程度如何,請確保儘快休息和提供適當的治療,以幫助減輕疼痛和促進康復。如果疼痛嚴重或持續,建議儘快就醫,以確定傷害的嚴重程度並獲得適當的治療。 \--------------------------------------------- symptom : 您可能會出現以下症狀: \- 腳部疼痛 \- 腫脹 \- 受傷處可能會出現瘀斑或紅斑 \- 可能會感到不穩或不能正常行走 \--------------------------------------------- advice : 很抱歉聽到你扭傷了腳。以下是一些建議可以幫助改善你的情況: \1. 冰敷:在受傷的地方冰敷15-20分鐘,每2-3小時重複一次,可以減輕腫脹和疼痛。 \2. 保持休息:在扭傷後,盡量避免過度使用受傷的腳,讓它有充分時間休息恢復。 \3. 提高患肢:使用墊子或靠墻,將受傷的腳抬高,有助於減少腫脹和疼痛。 \4. 使用壓縮帶:使用彈性壓縮帶輕輕地纏繞在受傷的腳上,有助於減少腫脹。 \5. 疼痛管理:如果疼痛嚴重,你可以使用非處方的止痛藥,如布洛芬或撒隆巴斯。 \6. 尋求醫療協助:如果症狀嚴重或持續時間較長,建議尋求醫療專業人員的幫助,以確定是否需要進一步的治療。 請記住,以上建議僅供參考,如果你的情況惡化或持續時間較長,一定要尋求醫療專業人員的意見。 \--------------------------------------------- medicine : 建議您使用止痛藥,例如布洛芬(ibuprofen)。 \--------------------------------------------- medicine_effect : 布洛芬(ibuprofen)是一種非類固醇消炎藥(NSAIDs),用於緩解輕至中度的疼痛和發炎。 布洛芬的主要功能是減輕疼痛和消除發炎。它可以用於緩解頭痛、牙痛、關節炎、肌肉疼痛、痛經、傷口疼痛等不同類型的疼痛。 然而,布洛芬也有一些副作用。常見的副作用包括消化不良、胃痛、噁心、嘔吐、腹瀉等。在長期或高劑量使用時,還可能引起胃潰瘍、腎功能不全、高血壓等嚴重副作用。 此外,布洛芬對某些人可能有禁忌或不適用,例如患有胃潰瘍、哮喘、腎功能不全、心血管疾病等的人。 因此,在使用布洛芬或其他藥物之前,請務必咨詢醫生或藥劑師的建議,確保您的安全和適用性。 :::