😷 증상 기반 법정감염병 판별 챗봇 (RAG, LLaMA2)¶
- 목표: RAG와 LLaMA2를 활용한 법정감염병을 판별하는 챗봇을 개발합니다.
- LLM의 환각과 해결 방안
- LLM의 가장 일반적인 문제는 부정확하거나 환각적인 반응을 보인다는 것입니다.
- LLM의 가중치에 포함된 일반 지식과 최신 정보 간의 불일치는 RAG를 사용하여 해결될 수 있습니다.
- RAG(Retrieval-Augmented Generation, 검색 증강 생성)
- RAG에는 외부 지식 소스의 추가 정보를 제공하여 LLM(대형 언어 모델)의 출력을 향상시키는 작업이 포함됩니다.
- Langchain RAG 문서 내RAG 프로세스 참고
1. 환경 설정 및 데이터 로드¶
1-1. 필수 라이브러리 설치¶
In [ ]:
!pip install transformers sentence-transformers langchain openai chromadb bs4 accelerate langchain_community pypdf text_generation
1-2. Hugging Face 토큰 등록¶
In [ ]:
import os
from google.colab import userdata
os.environ['HUGGINGFACEHUB_API_TOKEN'] = userdata.get('HUGGINGFACEHUB_API_TOKEN')
1-3. 데이터 로드¶
- 데이터 유형별로 로드 방식이 다르며, 해당 데이터는 PyPDFLoader 사용
- 2023_법정감염병진단_신고기준.pdf 데이터 출처: [질병관리청]2023 법정감염병 진단·신고기준 지침(pdf 추가)
In [ ]:
from google.colab import drive
drive.mount('/content/drive') # 구글 드라이브를 사용하는 경우
Mounted at /content/drive
In [ ]:
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("/content/drive/MyDrive/대외활동/Langchain_Web_QA/2023_법정감염병진단_신고기준.pdf")
pages = loader.load_and_split()
In [ ]:
# [제1급감염병] 진단 기준만 포함
disease_pages = pages[54:72]
In [ ]:
docs = disease_pages
2. 문서 변환 및 Vector DB 저장¶
2-1. 문서 변환 – 문서 분할 및 청킹¶
- 긴 문서를 모델과 호환되고 정확하고 명확한 결과를 생성하는 작은 덩어리로 분할하는 작업
- RecursiveCharacterTextSplitter 사용
In [ ]:
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200, add_start_index=True
)
splits = text_splitter.split_documents(docs)
2-2. Vector DB 저장¶
- 텍스트 청크를 추출한 후 RAG 애플리케이션을 사용하여 향후 검색을 위해 이를 저장하고 색인화함
- 일반적인 접근 방식은 각 분할의 콘텐츠를 임베딩하고 이러한 임베딩을 벡터 저장소에 저장하는 것
- 다국어 모델인 sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 사용
In [ ]:
# Import the HuggingFaceEmbeddings class from the langchain module
from langchain.embeddings import HuggingFaceEmbeddings
# Define the path to the pre-trained model you want to use
# modelPath = "sentence-transformers/all-MiniLM-l6-v2"
modelPath = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
# Create a dictionary with model configuration options, specifying to use the CPU for computations
model_kwargs = {'device':'cpu'}
# Create a dictionary with encoding options, specifically setting 'normalize_embeddings' to False
encode_kwargs = {'normalize_embeddings': False}
# Initialize an instance of HuggingFaceEmbeddings with the specified parameters
embeddings = HuggingFaceEmbeddings(
model_name=modelPath, # Provide the pre-trained model's path
model_kwargs=model_kwargs, # Pass the model configuration options
encode_kwargs=encode_kwargs # Pass the encoding options
)
- Chroma 벡터 저장소와 Lang chain의 오픈 소스 "HuggingFaceEmbeddings"를 사용하면 단일 명령으로 모든 문서 분할을 삽입하고 저장
In [ ]:
# Import the Chroma class from the langchain.vectorstores module
from langchain.vectorstores import Chroma
# Create a Chroma vector store from the previously split documents and using the specified embeddings
vectorstore = Chroma.from_documents(
documents=splits, # Split documents for vectorization
embedding=embeddings # Embeddings instance for encoding
)
- 검색할 때 검색 쿼리를 포함하고 유사성 검색을 수행하여 쿼리 포함과 가장 유사한 포함으로 저장된 분할을 식별합니다.
- 임베딩 간의 각도를 측정하는 코사인 유사성은 간단한 유사성 측정입니다.
In [ ]:
question = "발열과 구토 증상"
searchDocs = vectorstore.similarity_search(question)
print(searchDocs[0].page_content)
-초기에는 발열,오한,오심,구토,식욕부진 ,발진 등 비특이적 증상이 발생한 후 토혈,
복통,혈변 등의 증상이 나타나고 패혈증으로 진행함
○구인두 탄저
-발열,피로,숨가쁨 ,복통,오심,구토 등의 비특이적 증상과 함께 인후통 ,연하곤란 ,
경부 부종이 나타나고 경부 림프절병증 ,복수,의식변화도 동반 가능
▣역학적 연관성
○다음의 위험요인 중 하나 이상 해당
-탄저균 오염이 확인되거나 의심되는 환경,식품,물질,물건 등에 노출
-탄저균에 감염된 동물이나 이들의 사체 취급
-탄저 환자가 섭취한 동일 식품 섭취
▣진단을 위한 검사기준
○검체(혈액,수포도말 ,대변,가래,뇌척수액 등)에서 B.anth racis 분리 동정
▣신고시기 :즉시 신고
▣신고방법 :신고서를 제출하기 전에 관할 보건소장 또는 질병관리청장*에게 구두,전화
등의 방법으로 알려야 함.이 후 신고서 (발생 신고는 부록 1-1,사망(검안)신고는 부록 1-2,
병원체검사결과 신고는 부록 1-3)를 작성하여 관할 보건소로 팩스 또는 웹
(http://is.kdca.go.kr) 의 방법으로 신고
*질병관리청 종합상황실 (043-719-7789, 7790)
▣질병관리청 담당부서 :신종감염병대응과 ,고위험병원체분석과 (진단)
2-3. 텍스트 청크 검색기(retriever) 생성¶
- 데이터를 저장하고, LLM 모델을 준비하고, 파이프라인을 구축한 후에는 데이터를 검색해야 합니다.
- 검색기는 쿼리를 기반으로 문서를 반환하는 인터페이스 역할을 합니다.
In [ ]:
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
3. RAG 및 LLaMA2 기반 답변 생성¶
3-1. LLM 로드¶
- HuggingFaceTextGenInference로 HuggingFace의 LLaMA2 모델을 사용
In [ ]:
from langchain_community.llms import HuggingFaceTextGenInference
ENDPOINT_URL = "https://api-inference.huggingface.co/models/meta-llama/Llama-2-70b-chat-hf"
HF_TOKEN = userdata.get('HUGGINGFACEHUB_API_TOKEN')
llm = HuggingFaceTextGenInference(
inference_server_url=ENDPOINT_URL,
max_new_tokens=1024,
top_k=50,
temperature=0.1,
repetition_penalty=1.03,
server_kwargs={
"headers": {
"Authorization": f"Bearer {HF_TOKEN}",
"Content-Type": "application/json",
}
},
)
3-2. 프롬프트 템플릿 생성¶
- 검색기로 벡터 저장소에서 관련 문서를 검색하여 context 값으로 생성
In [ ]:
from langchain.prompts import PromptTemplate
question = "발열과 구토 증상이 있는데, 어떤 감염병이야?"
# 템플릿
template = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. Keep the answer as concise as possible.
{context}
Question: {question}
Helpful Answer:"""
QA_CHAIN_PROMPT = PromptTemplate.from_template(template)
3-3. QA 체인 생성¶
- 프롬프트를 사용하여 사용자 쿼리와 함께 llm에 전달할 RetrievalQA 체인 생성
In [ ]:
# Import the RetrievalQA class from the langchain module
from langchain.chains import RetrievalQA
# Create a RetrievalQA instance with specified components
chain = RetrievalQA.from_chain_type(
llm=llm, # Provide the language model
chain_type="stuff", # Specify the type of the language model chain
retriever=retriever, # Provide the document retriever
return_source_documents=True, # Returning source-documents with answers
chain_type_kwargs={"prompt": QA_CHAIN_PROMPT}
)
4. QA 결과 및 문서 레퍼런스 확인¶
4-1. QA 결과¶
In [ ]:
# Execute the query using the RetrievalQA chain and store the result
result = chain ({ "query" : question })
# Print or use the formatted result text
print(result['result'])
발열과 구토 증상이 있는 경우, 페스트 (Plague) 또는 신종감염병증후군 (Unknown
Infectious Disease)으로 의심됩니다. 이 경우 즉시 의사에게 문의하여 진단을 받아야 하며, 관할 보건소에 신고하여
질병관리청에 팩스 또는 웹으로 보고하여야 합니다.
In [ ]:
result
'''출력 예시
{'query': '발열과 구토 증상이 있는데, 어떤 감염병이야?',
'result': ' 발열과 구토 증상이 있는 경우, 페스트 (Plague) 또는 신종감염병증후군 (Unknown\nInfectious Disease)으로 의심됩니다. 이 경우 즉시 의사에게 문의하여 진단을 받아야 하며, 관할 보건소에 신고하여\n질병관리청에 팩스 또는 웹으로 보고하여야 합니다.',
'source_documents': [Document(page_content='-초기에는 발열,오한,오심,구토,식욕부진 ,발진 등 비특이적 증상이 발생한 후 토혈,\n복통,혈변 등의 증상이 나타나고 패혈증으로 진행함\n○구인두 탄저\n-발열,피로,숨가쁨 ,복통,오심,구토 등의 비특이적 증상과 함께 인후통 ,연하곤란 ,\n경부 부종이 나타나고 경부 림프절병증 ,복수,의식변화도 동반 가능\n▣역학적 연관성\n○다음의 위험요인 중 하나 이상 해당 \n-탄저균 오염이 확인되거나 의심되는 환경,식품,물질,물건 등에 노출\n-탄저균에 감염된 동물이나 이들의 사체 취급\n-탄저 환자가 섭취한 동일 식품 섭취\n▣진단을 위한 검사기준\n○검체(혈액,수포도말 ,대변,가래,뇌척수액 등)에서 B.anth racis 분리 동정\n▣신고시기 :즉시 신고\n▣신고방법 :신고서를 제출하기 전에 관할 보건소장 또는 질병관리청장*에게 구두,전화 \n등의 방법으로 알려야 함.이 후 신고서 (발생 신고는 부록 1-1,사망(검안)신고는 부록 1-2,\n병원체검사결과 신고는 부록 1-3)를 작성하여 관할 보건소로 팩스 또는 웹\n(http://is.kdca.go.kr) 의 방법으로 신고\n*질병관리청 종합상황실 (043-719-7789, 7790)\n▣질병관리청 담당부서 :신종감염병대응과 ,고위험병원체분석과 (진단)', metadata={'page': 68, 'source': '/content/drive/MyDrive/대외활동/Langchain_Web_QA/2023_법정감염병진단_신고기준.pdf', 'start_index': 781}),
...
Document(page_content='●●●2023 법정감염병 진단·신고 기준\n64 | 질병관리청 12. [제1급-12] 신종감염병증후군\n우리나라에서 처음으로 발견된 감염병 또는 병명을 정확히 알 수 없으나 새로 발생한 감염성\n증후군으로서 다른 법정감염병에 속하지 않으며 입원치료가 필요할 정도로 병상이 중대하거\n나 급속한 전파,또는 확산이 우려되어 환자격리 및 역학조사와 방역대책 등의 조치가 필요\n한 질환\n▣신고범위 :환자,의사환자\n▣신고를 위한 진단기준\n○국내에 아직 발생사실이 보고되지 않은 신종 병원체에 의한 감염병이 의심되는 \n상황으로 급성출혈열증후군 ,급성호흡기증후군 ,급성설사증후군 ,급성황달증후군 ,\n급성신경증후군 ,그 외 감염증후군으로 추정되는 환자,의사환자\n▣신고시기 :즉시 신고\n▣신고방법 :신고서를 제출하기 전에 관할 보건소장 또는 질병관리청장*에게 구두,전화 \n등의 방법으로 알려야 함.이 후 신고서 (발생 신고는 부록 1-1,사망(검안)신고는 부록 1-2)\n를 작성하여 관할 보건소로 팩스 또는 웹(http://is.kdca.go.kr) 의 방법으로 신고\n*질병관리청 종합상황실 (043-719-7789, 7790)\n▣질병관리청 담당부서 :위기대응총괄과', metadata={'page': 71, 'source': '/content/drive/MyDrive/대외활동/Langchain_Web_QA/2023_법정감염병진단_신고기준.pdf', 'start_index': 0})]}
'''
4-2. 문서 레퍼런스¶
In [ ]:
documents=result['source_documents']
for document in documents:
# Extracting content from the 4 document chunks used for specific query
page_content = document.page_content
metadata = document.metadata
# Now you can use page_content and metadata as needed
print("Page Content:", page_content)
print("Source:", metadata['source'])
print("Start Index:", metadata['start_index'])
print("\n")
'''출력 예시
Page Content: -초기에는 발열,오한,오심,구토,식욕부진 ,발진 등 비특이적 증상이 발생한 후 토혈,
복통,혈변 등의 증상이 나타나고 패혈증으로 진행함
○구인두 탄저
-발열,피로,숨가쁨 ,복통,오심,구토 등의 비특이적 증상과 함께 인후통 ,연하곤란 ,
경부 부종이 나타나고 경부 림프절병증 ,복수,의식변화도 동반 가능
▣역학적 연관성
○다음의 위험요인 중 하나 이상 해당
-탄저균 오염이 확인되거나 의심되는 환경,식품,물질,물건 등에 노출
-탄저균에 감염된 동물이나 이들의 사체 취급
-탄저 환자가 섭취한 동일 식품 섭취
▣진단을 위한 검사기준
○검체(혈액,수포도말 ,대변,가래,뇌척수액 등)에서 B.anth racis 분리 동정
▣신고시기 :즉시 신고
▣신고방법 :신고서를 제출하기 전에 관할 보건소장 또는 질병관리청장*에게 구두,전화
등의 방법으로 알려야 함.이 후 신고서 (발생 신고는 부록 1-1,사망(검안)신고는 부록 1-2,
병원체검사결과 신고는 부록 1-3)를 작성하여 관할 보건소로 팩스 또는 웹
(http://is.kdca.go.kr) 의 방법으로 신고
*질병관리청 종합상황실 (043-719-7789, 7790)
▣질병관리청 담당부서 :신종감염병대응과 ,고위험병원체분석과 (진단)
Source: /content/drive/MyDrive/대외활동/Langchain_Web_QA/2023_법정감염병진단_신고기준.pdf
Start Index: 781
...
'''
🤗 Hugging Face 내 증상 기반 법정감염병 판별 챗봇
https://huggingface.co/spaces/Hyeonseo/Infectious-Disease-Diagnosis-Chatbot
😷 챗봇 화면
'IT > 인공지능' 카테고리의 다른 글
[생성형AI][LLM] RAG 기반 기술문서 QA Gemma 모델 (Hugging Face) (0) | 2024.02.24 |
---|---|
[생성형AI][LLM] Gemma 모델 파인튜닝 (Hugging Face) (3) | 2024.02.24 |
[생성형AI][Text2Video] Sora: 콘텐츠 제작의 미래를 선도하는 비디오 생성 모델 (0) | 2024.02.20 |
[생성형AI][LLM] 데이터 없이 생성형 AI를 활용하여 개체명인식(NER) 분류 - 금융 도메인 (4) | 2024.02.07 |
[언어모델 변천사 A to Z] RNN부터 GPT까지 가볍게 살펴보기 (0) | 2023.03.25 |