---
# System prepended metadata

title: '[LangChain] 範例－病症顧問'
tags: [LangChain_samples]

---

# [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），用於緩解輕至中度的疼痛和發炎。

布洛芬的主要功能是減輕疼痛和消除發炎。它可以用於緩解頭痛、牙痛、關節炎、肌肉疼痛、痛經、傷口疼痛等不同類型的疼痛。

然而，布洛芬也有一些副作用。常見的副作用包括消化不良、胃痛、噁心、嘔吐、腹瀉等。在長期或高劑量使用時，還可能引起胃潰瘍、腎功能不全、高血壓等嚴重副作用。

此外，布洛芬對某些人可能有禁忌或不適用，例如患有胃潰瘍、哮喘、腎功能不全、心血管疾病等的人。

因此，在使用布洛芬或其他藥物之前，請務必咨詢醫生或藥劑師的建議，確保您的安全和適用性。
:::
