1. 시도 이유
기존 챗봇은 아래와 같은 문제를 가지고 있습니다.
- 정적인 대답, 이는 구글이나 네이버와 같은 검색 엔진과 차별점이 존재하지 않는다.
- 문맥 파악 불가, “내가 기저질환이 ~~ 한 편인데, 유방암이 발병할 가능성이 높을까?”와 같은 문맥을 파악한 응답이 불가능하다.
GPT의 경우, 문맥을 파악한 동적인 대답이 가능하지만 아래와 같은 문제가 있습니다.
- 2021년 이전의 데이터셋을 바탕으로 개발되었기 때문에 최신 정보에 접근이 불가능하다.
- 인터넷에 있는 정보를 사용하였기 때문에 신뢰성이 떨어진다.
- 존재하지도 않는 정보를 생성하는 Hallucination 이 발생한다.
즉, 위 두 챗봇은 “검증된 정보로 사용자를 고려해 적절한 답변을 제시한다.”라는 목표에 도달하기 어렵습니다. 이를 해결하기 위해서는 검증된 데이터를 확보하고 그 데이터와 사용자 정보를 입력받아 답변을 생성하는 기술이 필요합니다.
2. 목표
따라서, 이번 개발의 목표와 결과 예시는 다음과 같습니다.
- 검증된 데이터만으로 답변을 생성하는 기능
- 데이터와 사용자 정보를 입력받아 적절한 답변을 생성하는 기능
- 답변에 필요한 정보가 존재하지 않는 경우 이를 알리는 기능
- 답변에 쓰인 데이터의 출처를 명시하는 기능
결과 예시
사용자 질문: "저는 당뇨병이 있는데, 살 찌면 항상 혈당이 높아지는데 이유가 무엇인가요?"
챗 봇보답: 살이 찌면 체내 지방이 증가함에 따라 인슐린 저항성이 증가하고, 인슐린의 효과가 감소합니다. 이로 인해 혈당이 상승할 수 있습니다. 따라서, 당뇨병 환자는 체중을 유지하거나 감량하여 혈당을 조절하는 것이 중요합니다.
이 답변은 검증된 의료 데이터를 바탕으로 생성되었으며, 출처는 의료 전문가가 작성한 논문입니다. 해당 논문의 출처는 다음과 같습니다: [1]
감사합니다.
[1] 이명숙, 이동호, 이은정, 박창수, "당뇨병 환자에서 비만이 인슐린 저항성과 혈당 수준에 미치는 영향," 대한내분비학회지, 2005.
3. 방법
목표를 구현하기 위해선 아래 기능이 필요합니다.
- 사용자 질문을 받아 비슷한 정보를 검색하는 기능
- 검증된 정보와 출처를 데이터베이스에 저장하는 기능
- 사용자 질문, 정보 그리고 출처를 바탕으로 자연스러운 응답을 생성하는 기능
기능은 비교적 간단하다. 그러나 높은 효과를 보기 위해선 제약조건이 존재합니다.
예를 들어서, 검증정보가 기하급수적으로 증가해 정보 검색을 하는데 수 십분이 걸리게 되는 경우 서비스로 제공할 수 없습니다. 또한, 사용자 질문과 무관한 정보가 검색되는 경우 잘못된 응답이 생성됩니다. 이를 해결하기 위해 의미론적 텍스트 임베딩 기술과 벡터 데이터베이스가 필요합니다.
3.1 텍스트 임베딩
텍스트 임베딩을 영어, 한글과 같은 자연어를 컴퓨터가 이해하기 쉽도록 숫자열 형태로 변환하는 것을 말합니다. 이 떄, 단순히 형태를 바탕으로 임베딩을 진행할 경우 문제가 발생합니다. "사랑", "애정", "모정", "애착" 등의 단어는 유사한 단어이지만, 단순히 형태를 보면 차이가 존재해 [1,1,1…] , [20,9,11…] 등과 같이 임베딩을 진행할 경우 거리가 생길 수 있습니다. 따라서 의미를 충분히 고려한 임베딩 기술이 필요하다. 이번 구현에는 Open AI의 text-embedding-ada-002 를 사용하도록 하겠습니다.
3.2 벡터 데이터베이스
텍스트 임베딩이 잘 수행되었다면, 다음은 사용자 질문과 유사항 정보를 빠르게 찾는 것이 문제입니다. 임베딩 결과는 매우 긴 숫자열이며, 정보가 10만 줄이기만 해도, 유사성을 일일이 분석한다면 시간이 매우 오래 걸립니다. 이를 해결하기 위해선 벡터(숫자열) 정보를 저장, 조회, 삭제, 수정 그리고 동시 처리 작업을 원할하게 진행할 수 있는 벡터 데이터베이스를 도입하면됩니다. 여기에서는 데이터베이스를 쉽게 생성, 관리 할 수 있는 Pinecone 벡터 데이터베이스를 사용해보겠습니다.
4. 구현
4.1 텍스트 임베딩
4.1 텍스트 임베딩
Open AI의 text-embedding-ada-002 API를 사용하여 예시 텍스트를 임베딩해보겠습니다.
import openai
openai.api_key = "YOUR_API_KEY"
def text_embedding(text):
response = openai.Completion.create(
engine="text-davinci-002",
prompt= f"embed text: {text}",
temperature=0,
max_tokens=256,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
embedding = response.choices[0].text
return embedding
위 함수를 사용하여 텍스트를 임베딩할 수 있습니다. 이 때, YOUR_API_KEY에는 Open AI API 키를 입력해주세요.
text = "당뇨병 환자에서 체중 증가와 혈당 수치의 상관관계는?"
embed = text_embedding(text)
print(embed)
위와 같이 입력하면 아래와 같이 임베딩된 결과를 확인할 수 있습니다.
[-0.461, 0.137, 0.186, 0.065, 0.238,.....]
4.1 데이터베이스 생성
https://docs.pinecone.io/docs 사이트를 보면 쉽게 데이터베이스를 생성하고 파이썬 코드로 접속할 수 있는 방법을 알 수 있습니다.
Pinecone 데이터베이스를 사용하여 벡터를 업로드하는 방법은 다음과 같습니다.
import pinecone
# Pinecone API key를 설정합니다.
pinecone.init(api_key="YOUR_API_KEY")
# 데이터베이스를 생성합니다.
pinecone.create_index(index_name="YOUR_INDEX_NAME", dimension=YOUR_DIMENSION)
# 임베딩 벡터를 리스트로 생성합니다.
vectors = [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]]
# 벡터를 데이터베이스에 업로드합니다.
pinecone.insert(index_name="YOUR_INDEX_NAME", data=vectors)
# Pinecone API key를 삭제합니다.
pinecone.deinit()
위 코드에서 YOUR_API_KEY와 YOUR_INDEX_NAME, YOUR_DIMENSION은 사용자가 설정해야 하는 값입니다. YOUR_API_KEY는 Pinecone 계정의 API 키를 입력해야 하며, YOUR_INDEX_NAME은 생성하고자 하는 데이터베이스의 이름을 입력하면 됩니다. YOUR_DIMENSION은 임베딩 벡터의 차원을 나타냅니다.
또한, vectors 리스트에는 업로드할 벡터를 포함시킬 수 있습니다. 벡터는 모두 같은 차원을 가져야 하며, 리스트 내의 각 벡터는 하나의 데이터 포인트를 나타내야 합니다.
4.2 유사한 데이터를 조회
먼저, 데이터베이스에 업로드된 벡터를 사용하여 입력된 질문과 유사한 벡터를 찾는 방법을 알아보겠습니다. 이를 위해서는 pinecone.query() 함수를 사용할 수 있습니다.
import pinecone
# Pinecone API key를 설정합니다.
pinecone.init(api_key="YOUR_API_KEY")
# 데이터베이스 이름을 설정합니다.
index_name = "YOUR_INDEX_NAME"
# 입력된 질문을 임베딩합니다.
question_embedding = text_embedding("당뇨병 환자에서 체중 증가와 혈당 수치의 상관관계는?")
# Pinecone 데이터베이스에서 유사한 벡터를 검색합니다.
result = pinecone.query(index_name=index_name, query=question_embedding, top_k=3)
# 검색된 벡터를 출력합니다.
print(result)
# Pinecone API key를 삭제합니다.
pinecone.deinit()
위 코드에서 YOUR_API_KEY와 YOUR_INDEX_NAME은 사용자가 설정한 값입니다. YOUR_API_KEY는 Pinecone 계정의 API 키를 입력해야 하며, YOUR_INDEX_NAME은 생성한 데이터베이스의 이름을 입력하면 됩니다.
pinecone.query() 함수에서 index_name은 조회할 데이터베이스의 이름입니다. query는 입력된 질문을 임베딩한 벡터입니다. top_k는 조회할 벡터의 수를 나타냅니다. 위 코드에서는 3개의 벡터가 반환됩니다.
위 코드를 실행하면, 입력된 질문과 유사한 벡터 3개가 출력됩니다. 이 벡터는 질문과 유사한 정보를 포함하고 있으므로, 이를 바탕으로 자연스러운 응답을 생성할 수 있습니다.
4.3 ChatGPT에게 답변 생성 요청
이제, 가져온 정보와 입력된 질문을 바탕으로 ChatGPT에게 질문 생성을 요청합니다.
아래는 챗봇 시스템 명령어와 요청 코드입니다.
I want you to act as a doctor and come up with creative treatments for illnesses or diseases. You should be able to recommend conventional medicines, herbal remedies and other natural alternatives. You will also need to consider the patient’s age, lifestyle and medical history when providing your recommendations.
You will given json file like below, "question" value is patient question message. And "search_result" value is searched result from reliable vector database with "question". You have to answer with "search_result". If all of search_result is not related to "question", you have to say "Sorry, there is no information about question". When search_result has not related to "question", you can ignore it. When you create response, you have to express reference with footnote format.
Below is example of request and response.
User :
{
"question": "유방암의 정의에 대해서 알려줘",
"search_result": [
{
"query": "유방암의 정의에 대해서 알려줘",
"results": [
{
"text": "1. 유방암이란 유방 밖으로 퍼져 생명을 위협할 수 있는 악성 종양으로 유방에 있는 세포 중 어느 것이라도 암이 될 수 있습니다. 일반적으로 유관과 유엽에 존재하는 세포에서 기원합니다. 유방암의 발생률은 세계적으로 증가하고 있으며, 우리나라 여성에게 발생하는 전체암 중 2번째로 흔한 암입니다. 이에 따라 사망률도 증가하고 있지만, 2012년 기준 한국 유방암 연령표준",
"metadata": {
"source": "유방의학회 1페이지"
}
}
]
}
]
}
Response:
방암이란 유방 밖으로 퍼져 생명을 위협할 수 있는 악성 종양으로 유방에 있는 세포 중 어느 것이라도 암이 될 수 있습니다. 일반적으로 유관과 유엽에 존재하는 세포에서 기원합니다. 유방암의 발생률은 세계적으로 증가하고 있으며, 우리나라 여성에게 발생하는 전체암 중 2번째로 흔한 암입니다.[1]
[1] 유방의학회 1페이지
import openai
openai.api_key = "YOUR_API_KEY"
def generate_question(prompt, related_information):
# prompt = "당뇨병 환자에서 체중 증가와 혈당 수치의 상관관계는?"
# related_information = "살이 찌면 체내 지방이 증가함에 따라 인슐린 저항성이 증가하고, 인슐린의 효과가 감소합니다. 이로 인해 혈당이 상승할 수 있습니다. 따라서, 당뇨병 환자는 체중을 유지하거나 감량하여 혈당을 조절하는 것이 중요합니다.([1] 이명숙, 이동호, 이은정, 박창수, "당뇨병 환자에서 비만이 인슐린 저항성과 혈당 수준에 미치는 영향," 대한내분비학회지, 2005.)"
system_command=
response = oopenai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": system_command},
{"role": "user", "content": {"prompt" : prompt, "related_information" :related_information},
]
)
question = response.choices[0].text.strip()
return question
위 코드에서 prompt 변수는 입력된 질문입니다. related_information 변수는 Pinecone 데이터베이스에서 가져온 연관 정보입니다. 이 정보를 바탕으로 ChatGPT에게 질문 생성을 요청합니다.
ChatGPT는 입력된 정보를 바탕으로 자연스러운 질문을 생성한 후 반환합니다. 이후, 이 질문을 사용자에게 전달하면 됩니다.
위 코드를 실행하면 아래와 같이 출력됩니다.
사용자 질문: "저는 당뇨병이 있는데, 살 찌면 항상 혈당이 높아지는데 이유가 무엇인가요?"
챗봇 : 살이 찌면 체내 지방이 증가함에 따라 인슐린 저항성이 증가하고, 인슐린의 효과가 감소합니다. 이로 인해 혈당이 상승할 수 있습니다. 따라서, 당뇨병 환자는 체중을 유지하거나 감량하여 혈당을 조절하는 것이 중요합니다.
이 답변은 검증된 의료 데이터를 바탕으로 생성되었으며, 출처는 의료 전문가가 작성한 논문입니다. 해당 논문의 출처는 다음과 같습니다: [1]
감사합니다.
[1] 이명숙, 이동호, 이은정, 박창수, "당뇨병 환자에서 비만이 인슐린 저항성과 혈당 수준에 미치는 영향," 대한내분비학회지, 2005.
이와 같이 출처를 명시한 자연스러운 질문을 생성할 수 있습니다.
5. 한계
데이터베이스를 이용해 검증된 정보를 바탕으로 답변을 생성하도록 할 수 있지만, 이 방법에는 몇 가지 한계가 있습니다. 첫째로, 데이터베이스에 업로드된 정보가 모든 상황에서 적절하지 않을 수 있습니다. 예를 들어, 새로운 질병이 발생했을 때, 이에 대한 정보가 데이터베이스에 없는 경우가 있을 수 있습니다. 둘째로, 데이터베이스에서 검색된 정보가 질문과 관련이 없는 경우가 있을 수 있습니다. 이 경우, 적절한 대답을 제공할 수 없습니다. 마지막으로, 데이터베이스에 업로드된 정보가 충분하지 않은 경우도 있습니다. 이 경우, 적절한 대답을 제공할 수 없습니다. 따라서, 데이터베이스를 이용해 검증된 정보를 바탕으로 답변을 생성하도록 할 때는 이러한 한계를 염두에 두어야 합니다.
ChatGPT를 이용해 검증된 정보를 기반으로 응답 생성 시도
1. 시도 이유
기존 챗봇은 아래와 같은 문제를 가지고 있다.
- 정적인 대답, 이는 구글이나 네이버와 같은 검색 엔진과 차별점이 존재하지 않는다.
- 문맥 파악 불가, “내가 기저질환이 ~~ 한 편인데, 유방암이 발병할 가능성이 높을까?”와 같은 문맥을 파악한 응답이 불가능하다.
GPT의 경우, 문맥을 파악한 동적인 대답이 가능하지만 아래와 같은 문제가 있다.
- 2021년 이전의 데이터셋을 바탕으로 개발되었기 때문에 최신 정보에 접근이 불가능하다.
- 인터넷에 있는 정보를 사용하였기 때문에 신뢰성이 떨어진다.
- 존재하지도 않는 정보를 생성하는 Hallucination 이 발생한다.
즉, 위 두 챗봇은 “검증된 정보로 사용자를 고려해 적절한 답변을 제시한다.”라는 목표에 도달하기 어렵다. 이를 해결하기 위해서는 검증된 데이터를 확보하고 그 데이터와 사용자 정보를 입력받아 답변을 생성하는 기술이 필요하다.
2. 목표
따라서, 이번 개발의 목표와 결과 예시는 다음과 같다.
- 검증된 데이터만으로 답변을 생성하는 기능
- 데이터와 사용자 정보를 입력받아 적절한 답변을 생성하는 기능
- 답변에 필요한 정보가 존재하지 않는 경우 이를 알리는 기능
- 답변에 쓰인 데이터의 출처를 명시하는 기능
결과 예시
사용자 질문: "저는 당뇨병이 있는데, 살 찌면 항상 혈당이 높아지는데 이유가 무엇인가요?"
챗 봇보답: 살이 찌면 체내 지방이 증가함에 따라 인슐린 저항성이 증가하고, 인슐린의 효과가 감소합니다. 이로 인해 혈당이 상승할 수 있습니다. 따라서, 당뇨병 환자는 체중을 유지하거나 감량하여 혈당을 조절하는 것이 중요합니다.
이 답변은 검증된 의료 데이터를 바탕으로 생성되었으며, 출처는 의료 전문가가 작성한 논문입니다. 해당 논문의 출처는 다음과 같습니다: [1]
감사합니다.
[1] 이명숙, 이동호, 이은정, 박창수, "당뇨병 환자에서 비만이 인슐린 저항성과 혈당 수준에 미치는 영향," 대한내분비학회지, 2005.
3. 방법
목표를 구현하기 위해선 아래 기능이 필요하다.
- 사용자 질문을 받아 비슷한 정보를 검색하는 기능
- 검증된 정보와 출처를 데이터베이스에 저장하는 기능
- 사용자 질문, 정보 그리고 출처를 바탕으로 자연스러운 응답을 생성하는 기능
기능은 비교적 간단하다. 그러나 높은 효과를 보기 위해선 제약조건이 존재한다.
예를 들어서, 검증정보가 기하급수적으로 증가해 정보 검색을 하는데 수 십분이 걸리게 되는 경우 서비스로 제공할 수 없다. 또한, 사용자 질문과 무관한 정보가 검색되는 경우 잘못된 응답이 생성된다. 이를 해결하기 위해 의미론적 텍스트 임베딩 기술과 벡터 데이터베이스가 필요하다.
3.1 텍스트 임베딩
텍스트 임베딩을 영어, 한글과 같은 자연어를 컴퓨터가 이해하기 쉽도록 숫자열 형태로 변환하는 것을 말한다. 이 떄, 단순히 형태를 바탕으로 임베딩을 진행할 경우 문제가 발생한다. "사랑", "애정", "모정", "애착" 등의 단어는 유사한 단어이지만, 단순히 형태를 보면 차이가 존재해 [1,1,1…] , [20,9,11…] 등과 같이 임베딩을 진행할 경우 거리가 생길 수 있다. 따라서 의미를 충분히 고려한 임베딩 기술이 필요하다. 이번 구현에는 Open AI의 text-embedding-ada-002 를 사용하도록 하겠다.
3.2 벡터 데이터베이스
텍스트 임베딩이 잘 수행되었다면, 다음은 사용자 질문과 유사항 정보를 빠르게 찾는 것이 문제입니다. 임베딩 결과는 매우 긴 숫자열이며, 정보가 10만 줄이기만 해도, 유사성을 일일이 분석한다면 시간이 매우 오래 걸립니다. 이를 해결하기 위해선 벡터(숫자열) 정보를 저장, 조회, 삭제, 수정 그리고 동시 처리 작업을 원할하게 진행할 수 있는 벡터 데이터베이스를 도입하면됩니다. 여기에서는 데이터베이스를 쉽게 생성, 관리 할 수 있는 Pinecone 벡터 데이터베이스를 사용해보겠습니다.
4. 구현
4.1 텍스트 임베딩
4.1 텍스트 임베딩
Open AI의 text-embedding-ada-002 API를 사용하여 예시 텍스트를 임베딩해보겠습니다.
import openai
openai.api_key = "YOUR_API_KEY"
def text_embedding(text):
response = openai.Completion.create(
engine="text-davinci-002",
prompt= f"embed text: {text}",
temperature=0,
max_tokens=256,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
embedding = response.choices[0].text
return embedding
위 함수를 사용하여 텍스트를 임베딩할 수 있습니다. 이 때, YOUR_API_KEY에는 Open AI API 키를 입력해주세요.
text = "당뇨병 환자에서 체중 증가와 혈당 수치의 상관관계는?"
embed = text_embedding(text)
print(embed)
위와 같이 입력하면 아래와 같이 임베딩된 결과를 확인할 수 있습니다.
[-0.461, 0.137, 0.186, 0.065, 0.238,.....]
4.1 데이터베이스 생성
https://docs.pinecone.io/docs 사이트를 보면 쉽게 데이터베이스를 생성하고 파이썬 코드로 접속할 수 있는 방법을 알 수 있습니다.
Pinecone 데이터베이스를 사용하여 벡터를 업로드하는 방법은 다음과 같습니다.
import pinecone
# Pinecone API key를 설정합니다.
pinecone.init(api_key="YOUR_API_KEY")
# 데이터베이스를 생성합니다.
pinecone.create_index(index_name="YOUR_INDEX_NAME", dimension=YOUR_DIMENSION)
# 임베딩 벡터를 리스트로 생성합니다.
vectors = [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]]
# 벡터를 데이터베이스에 업로드합니다.
pinecone.insert(index_name="YOUR_INDEX_NAME", data=vectors)
# Pinecone API key를 삭제합니다.
pinecone.deinit()
위 코드에서 YOUR_API_KEY와 YOUR_INDEX_NAME, YOUR_DIMENSION은 사용자가 설정해야 하는 값입니다. YOUR_API_KEY는 Pinecone 계정의 API 키를 입력해야 하며, YOUR_INDEX_NAME은 생성하고자 하는 데이터베이스의 이름을 입력하면 됩니다. YOUR_DIMENSION은 임베딩 벡터의 차원을 나타냅니다.
또한, vectors 리스트에는 업로드할 벡터를 포함시킬 수 있습니다. 벡터는 모두 같은 차원을 가져야 하며, 리스트 내의 각 벡터는 하나의 데이터 포인트를 나타내야 합니다.
4.2 유사한 데이터를 조회
먼저, 데이터베이스에 업로드된 벡터를 사용하여 입력된 질문과 유사한 벡터를 찾는 방법을 알아보겠습니다. 이를 위해서는 pinecone.query() 함수를 사용할 수 있습니다.
import pinecone
# Pinecone API key를 설정합니다.
pinecone.init(api_key="YOUR_API_KEY")
# 데이터베이스 이름을 설정합니다.
index_name = "YOUR_INDEX_NAME"
# 입력된 질문을 임베딩합니다.
question_embedding = text_embedding("당뇨병 환자에서 체중 증가와 혈당 수치의 상관관계는?")
# Pinecone 데이터베이스에서 유사한 벡터를 검색합니다.
result = pinecone.query(index_name=index_name, query=question_embedding, top_k=3)
# 검색된 벡터를 출력합니다.
print(result)
# Pinecone API key를 삭제합니다.
pinecone.deinit()
위 코드에서 YOUR_API_KEY와 YOUR_INDEX_NAME은 사용자가 설정한 값입니다. YOUR_API_KEY는 Pinecone 계정의 API 키를 입력해야 하며, YOUR_INDEX_NAME은 생성한 데이터베이스의 이름을 입력하면 됩니다.
pinecone.query() 함수에서 index_name은 조회할 데이터베이스의 이름입니다. query는 입력된 질문을 임베딩한 벡터입니다. top_k는 조회할 벡터의 수를 나타냅니다. 위 코드에서는 3개의 벡터가 반환됩니다.
위 코드를 실행하면, 입력된 질문과 유사한 벡터 3개가 출력됩니다. 이 벡터는 질문과 유사한 정보를 포함하고 있으므로, 이를 바탕으로 자연스러운 응답을 생성할 수 있습니다.
4.3 ChatGPT에게 답변 생성 요청
이제, 가져온 정보와 입력된 질문을 바탕으로 ChatGPT에게 질문 생성을 요청합니다.
아래는 챗봇 시스템 명령어와 요청 코드입니다.
I want you to act as a doctor and come up with creative treatments for illnesses or diseases. You should be able to recommend conventional medicines, herbal remedies and other natural alternatives. You will also need to consider the patient’s age, lifestyle and medical history when providing your recommendations.
You will given json file like below, "question" value is patient question message. And "search_result" value is searched result from reliable vector database with "question". You have to answer with "search_result". If all of search_result is not related to "question", you have to say "Sorry, there is no information about question". When search_result has not related to "question", you can ignore it. When you create response, you have to express reference with footnote format.
Below is example of request and response.
User :
{
"question": "유방암의 정의에 대해서 알려줘",
"search_result": [
{
"query": "유방암의 정의에 대해서 알려줘",
"results": [
{
"text": "1. 유방암이란 유방 밖으로 퍼져 생명을 위협할 수 있는 악성 종양으로 유방에 있는 세포 중 어느 것이라도 암이 될 수 있습니다. 일반적으로 유관과 유엽에 존재하는 세포에서 기원합니다. 유방암의 발생률은 세계적으로 증가하고 있으며, 우리나라 여성에게 발생하는 전체암 중 2번째로 흔한 암입니다. 이에 따라 사망률도 증가하고 있지만, 2012년 기준 한국 유방암 연령표준",
"metadata": {
"source": "유방의학회 1페이지"
}
}
]
}
]
}
Response:
방암이란 유방 밖으로 퍼져 생명을 위협할 수 있는 악성 종양으로 유방에 있는 세포 중 어느 것이라도 암이 될 수 있습니다. 일반적으로 유관과 유엽에 존재하는 세포에서 기원합니다. 유방암의 발생률은 세계적으로 증가하고 있으며, 우리나라 여성에게 발생하는 전체암 중 2번째로 흔한 암입니다.[1]
[1] 유방의학회 1페이지
import openai
openai.api_key = "YOUR_API_KEY"
def generate_question(prompt, related_information):
# prompt = "당뇨병 환자에서 체중 증가와 혈당 수치의 상관관계는?"
# related_information = "살이 찌면 체내 지방이 증가함에 따라 인슐린 저항성이 증가하고, 인슐린의 효과가 감소합니다. 이로 인해 혈당이 상승할 수 있습니다. 따라서, 당뇨병 환자는 체중을 유지하거나 감량하여 혈당을 조절하는 것이 중요합니다.([1] 이명숙, 이동호, 이은정, 박창수, "당뇨병 환자에서 비만이 인슐린 저항성과 혈당 수준에 미치는 영향," 대한내분비학회지, 2005.)"
system_command=
response = oopenai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": system_command},
{"role": "user", "content": {"prompt" : prompt, "related_information" :related_information},
]
)
question = response.choices[0].text.strip()
return question
위 코드에서 prompt 변수는 입력된 질문입니다. related_information 변수는 Pinecone 데이터베이스에서 가져온 연관 정보입니다. 이 정보를 바탕으로 ChatGPT에게 질문 생성을 요청합니다.
ChatGPT는 입력된 정보를 바탕으로 자연스러운 질문을 생성한 후 반환합니다. 이후, 이 질문을 사용자에게 전달하면 됩니다.
위 코드를 실행하면 아래와 같이 출력됩니다.
사용자 질문: "저는 당뇨병이 있는데, 살 찌면 항상 혈당이 높아지는데 이유가 무엇인가요?"
챗봇 : 살이 찌면 체내 지방이 증가함에 따라 인슐린 저항성이 증가하고, 인슐린의 효과가 감소합니다. 이로 인해 혈당이 상승할 수 있습니다. 따라서, 당뇨병 환자는 체중을 유지하거나 감량하여 혈당을 조절하는 것이 중요합니다.
이 답변은 검증된 의료 데이터를 바탕으로 생성되었으며, 출처는 의료 전문가가 작성한 논문입니다. 해당 논문의 출처는 다음과 같습니다: [1]
감사합니다.
[1] 이명숙, 이동호, 이은정, 박창수, "당뇨병 환자에서 비만이 인슐린 저항성과 혈당 수준에 미치는 영향," 대한내분비학회지, 2005.
이와 같이 출처를 명시한 자연스러운 질문을 생성할 수 있습니다.
5. 한계
데이터베이스를 이용해 검증된 정보를 바탕으로 답변을 생성하도록 할 수 있지만, 이 방법에는 몇 가지 한계가 있습니다. 첫째로, 데이터베이스에 업로드된 정보가 모든 상황에서 적절하지 않을 수 있습니다. 예를 들어, 새로운 질병이 발생했을 때, 이에 대한 정보가 데이터베이스에 없는 경우가 있을 수 있습니다. 둘째로, 데이터베이스에서 검색된 정보가 질문과 관련이 없는 경우가 있을 수 있습니다. 이 경우, 적절한 대답을 제공할 수 없습니다. 마지막으로, 데이터베이스에 업로드된 정보가 충분하지 않은 경우도 있습니다. 이 경우, 적절한 대답을 제공할 수 없습니다. 따라서, 데이터베이스를 이용해 검증된 정보를 바탕으로 답변을 생성하도록 할 때는 이러한 한계를 염두에 두어야 합니다.