GPT API 사용법 #2. 랭체인과 외부검색을 이용한 챗GPT

지난 글에서는 OpenAI 홈페이지에 계정 등록 및 접속해서 openai api key를 생성하고 결제까지 해 보았습니다. (이전 글 : OpenAI GPT API 사용법 #1. API 키 생성부터 비용 관리까지) 오늘은 지난 글에 이어서 실제 GPT api key를 사용하여 GPT와 연동하는 코드를 구현해 보도록 하겠습니다.

랭체인(langchain)과 외부검색을 이용한 챗GPT

랭체인에서 대해서는 이미 이전 글에서 다뤄본 적이 있습니다. 라마 3.1과 연동해서 말이죠. 랭체인의 개념 등에 대해 부족하시면 이 전 글을 참고하시면 좋겠습니다. (이전 글: LangChain으로 Llama 3.1 AI 모델의 자연어 처리 능력 향상하기)

오늘은, 랭체인 프레임워크를 이용해서 GPT와 연동해 보겠습니다. 물론 WebUI 챗팅 창을 이용해서 자연스러운 대화 속에서 GPT가 최신 정보나 필요한 부분에 따라 외부 검색을 통해 정보를 얻어서 그에 따라 대답하도록 파이썬 코드로 구현해 보도록 하겠습니다.

먼저, 외부 검색 방법으로는 직접 크롤링을 사용할 수도 있지만, 오늘은 duckduckgo_search 파이썬 모듈을 사용하여 duckduckgo 엔진으로 웹 검색을 해 보겠습니다.

langchain_openai 모듈

첫 번째 꼭 필요한 모듈은 랭체인이 되겠죠? 파이썬 모듈로 OpenAI와 연동할 수 있도록 langchain_openai 모듈을 설치합니다.

pip install langchain-openai

이 모듈을 사용하여 아래와 같이 openai api key 등록과 GPT의 응답 설정을 간단하게 처리할 수 있습니다.

from langchain_openai import ChatOpenAI

os.environ[“OPENAI_API_KEY”] = “생성해 두었던 OpenAI API Key 입력”

chat_model = ChatOpenAI(temperature=0.7, openai_api_key=os.getenv(“OPENAI_API_KEY”))

이 ChatOpenAI 클래스를 통해 GPT에 메시지를 전달하고 대답을 요구하게 됩니다.

duckduckgo_search 모듈

두 번째로, 외부 검색 기능이 필요하므로, 다음과 같이 duckduckgo_search 모듈을 설치합니다.

pip install duckduckgo-search

텍스트만 사용할 것이기 때문에 코드 구성을 간단합니다. 아래와 같이 DDGS 클래스를 임포트해 주고, 코드를 구성합니다.

from duckduckgo_search import DDGS

def search_duckduckgo(query):

    ddgs = DDGS()

    results = ddgs.text(query, max_results=5)

    print(f”————— results —————\n {results}”)

    # 검색 결과 구조 확인 후 수정

    if results:

        return “\n”.join([result.get(‘body’, ‘No body found’) for result in results])

    return “No relevant information found.”

위와 같이 검색 함수를 정의하여 결과를 보면, 위 함수는 키워드 검색을 통해 검색된 결과 상위 5개(max_results=5)를 넘겨줍니다. 이 때 넘어오는 값은 키워드가 포함된 제목, 요약(description), 본문 링크(하이퍼링크)로 구성됩니다. 만일 내용까지 자세하게 확인해 보고 싶다면 본문 링크(하이퍼링크)를 통해 구체적인 내용까지 확인도 가능합니다.

또, 위 print 부분은 본문 끝 부분에서 확인이 필요한 부분입니다. 본문의 뒤 부분에서 내용을 확인하실 수 있습니다.

구성된 코드를 실행

자, 이제 중요한 두 가지 모듈은 모두 설치 및 코드 구성을 완료했습니다. 랭체인의 프롬프트 템플릿 구성에 대해서는 위 이전 글에서 코드를 참고할 수 있습니다. 또한, WebUI 구성을 위한 Flask 모듈에 대해서도 이전 글에 언급되었으므로 여기에서는 생략하겠습니다.

자, 이제 구현된 코드를 실행합니다. 브라우저 주소창에 http://127.0.0.1:5000으로 접속합니다.

랭체인(langchain)과 외부검색을 이용한 챗GPT 00
콘솔에서 애플리케이션 파일을 실행
랭체인(langchain)과 외부검색을 이용한 챗GPT 01
랭체인(langchain)과 외부검색을 이용한 챗GPT 01

습관적으로 인사부터 했습니다. 아무 생각 없이 했는데, 대답이 의외로 번개처럼 빠릅니다. 요즘 llama 3.1만 사용하다 보니, 원래 GPT의 속도가 빠르다는 걸 잊고 있었나 봅니다. 갑자기 라마 3.1은 다시 보기가 어렵겠다 싶습니다. GPT는 역시 유료라도 사용 할만 한 것 같습니다.

랭체인(langchain)과 외부검색을 이용한 챗GPT 02
랭체인(langchain)과 외부검색을 이용한 챗GPT 02

외부 검색을 실행하기 위해 GPT의 최종 학습된 날짜를 확인합니다. GPT의 답변은 2022년 3월 15일이라고 합니다. 뭔가 조금 이상해서 Openai 홈페이지에서 확인해 보니 “GPT-3.5-turbo-0125” 이 모델을 사용하고 있었네요.

OpenAI 홈페이지에서 GPT-4o 버전의 사용 가능한 모델명을 확인합니다.

GPT-4o 모델명과 가격
GPT-4o 모델명과 가격 <출처: https://openai.com/api/pricing/>

비슷해 보이지만 GPT-4o 중 가격이 가장 저렴한 “gpt-4o-2024-0806″으로 변경합니다. 학습된 일짜는 2023년 10월까지라고 하는 군요.

아래와 같이 코드에 모델명을 추가하여 변경합니다.

chat_model = ChatOpenAI(model=”gpt-4o-2024-08-06″, temperature=0.3, openai_api_key=os.getenv(“OPENAI_API_KEY”))

코드를 다시 실행하고, 최종 학습 일을 확인합니다.

랭체인(langchain)과 외부검색을 이용한 챗GPT 03
렝체인(langchain)과 외부검색을 이용한 챗GPT 03

최종 학습된 일짜가 2023년 10월 이므로, 2024년에 있었던 파리 올림픽과 관련한 질문을 해서 GPT가 외부 검색 정보를 잘 이용하고 있는지 확인합니다.

렝체인(langchain)과 외부검색을 이용한 챗GPT 04
렝체인(langchain)과 외부검색을 이용한 챗GPT 04

GPT의 답변은 정확했고, 한글 답변 역시 문제가 없어 보입니다. 외부 검색을 하겠다는 언급도 없이 빠르고 자연스럽게 대답을 해서 정말 외부 검색을 했는지, 프로그램 콘솔을 아래와 같이 확인합니다.

렝체인(langchain)과 외부검색을 이용한 챗GPT 05
렝체인(langchain)과 외부검색을 이용한 챗GPT 05

정의했던 함수 search_duckduckgo 내에서 print를 하도록 코드를 작성했었고, 아래 터미널 화면에 검색된 결과가 텍스트로 보입니다. 이 정보를 기반으로 하여 GPT 전달한 답변의 정보는 파리 올림픽의 개최 연도, 한국의 총 획득 메달 수, 금메달 수, 한국의 종합 순위로 다양한 정보를 제공해 주었습니다만, 제가 요구했던 “메달 종류와 수“라는 의미에서 보면 조금 모자란 답변이었습니다.

ChatOpenAI 클래스를 통해 전달되는 temperature가 GPT의 답변 값을 조정하면서 GPT 답변의 변화를 관찰해 봐야 할 것 같습니다. 참고 문건 들에서는 0 값으로 했는데, 이번 데모에서는 0.3으로 했으니 말이죠. 이 값이 커지면 창의적인 답변을 한다고 하는데, 창의적일지 모르나 AI의 환각 현상이 높아지는 변수는 아닐런지…

답글 남기기