# [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),用於緩解輕至中度的疼痛和發炎。
布洛芬的主要功能是減輕疼痛和消除發炎。它可以用於緩解頭痛、牙痛、關節炎、肌肉疼痛、痛經、傷口疼痛等不同類型的疼痛。
然而,布洛芬也有一些副作用。常見的副作用包括消化不良、胃痛、噁心、嘔吐、腹瀉等。在長期或高劑量使用時,還可能引起胃潰瘍、腎功能不全、高血壓等嚴重副作用。
此外,布洛芬對某些人可能有禁忌或不適用,例如患有胃潰瘍、哮喘、腎功能不全、心血管疾病等的人。
因此,在使用布洛芬或其他藥物之前,請務必咨詢醫生或藥劑師的建議,確保您的安全和適用性。
:::