[UCA수퍼컴아카데미] cohere 코히어 Command-R 모델 API 코딩--(2)
실제 엔터프라이즈 기업용으로 RAG 검색증강 기능이 추가되어 탁월한 성능을 발휘하도록 구축된 확장 가능한 최첨단 대규모 언어 모델(LLM)인 Command R+의 출시를 발표했습니다. RAG 검색증강이라는 용어 자체가 캐나다 인공지능(AI) 기업 코히어(Cohere) 소속의 패트릭 루이스 박사가 2020년 발간한 논문에서 처음 사용했다. AI 파운데이션 모델에 쌓인 데이터와 구글 검색같은 별개 외부 데이터를 이용해 답변의 정확도를 한번 더 높여서 응답해주는 기술이다.
원래 Command 모델은 일년 전에도 존재했었다. Command-R 이라는 신규 모델및 R-plus라는 모델이 추가로 등장한거다.
이번 출시는command-R 모델을 마이크로소프트 Azure 플랫폼에서 Cohere의 최신 R기반 모델에 액세스할 수 있도록 는 새로운 협업을 특징으로 한다. 투자자이면서 기존 클라우드 서비스 제공 고객이었던 아마존의 Amazon SageMaker, Bedrock 베드록, 오라클의 Oracle Cloud Infrastructure (OCI), 추가 클라우드 플랫폼에서도 사용할 수 있다고 한다.
미이크로소프트 Azure는 openAI는 독점, Mistral Large외에 cohere command R+도 제공하는 클라우드가 되어가고 있다.
Command R+는 128k (12만 8천)토큰 컨텍스트 창을 제공하며 동급 최고의 기능을 제공하도록 설계되었다. 약 300 페이지정도의 책을 입력 토큰으로 쓸 수 있다. AI 파운데이션 모델의 대표적인 골칫거리인 환각(할루시네이션)을 줄이기 위한 목적으로 인용이 포함된 검색증강기법 통칭 RAG (Retrieval Augmented Generation) 지원 커스텀 커넥터 기능이 합쳐져 있기도 하다. 한국어, 일본어 , 포르투갈어를 비롯한 10개 주요 언어로 다국어 지원을 통해 글로벌 비즈니스 운영을 돕고 있다.
기업이 POC (개념 증명)을 넘어 AI를 통해은 업무의 효율성과 탁월한 정확도의 균형을 맞추는 데 중점을 두었다고하는 커맨드 R+는 R 시리즈 모델에 훨씬 더 강력한 성능을 제공한다. 개인 정보 보호 및 데이터 보안에 대한 동일한 약속을 제공한다.
아래 사진을 보자.
코히어의 플레이그라운드에 해당하는 부분에서 command-r 모델에 선택하고, 걸그룹 아이브 안유진을 아느냐고 물어봤다.
이런건 학습한 내용에 있으니 응답에서도 잘 나온다.
하지만 아이브의 멤버들에 대한 정보가 있지만,
"아이브 걸그룹 리더의 이전 활동했던 걸그룹명이 뭐야"라는 식으로 물어보면, 프리스틴의 이강 이 리더라던지, 에버글로우라던지 환각에 기반한 답변들이 나온다. 이러면 모델 성능이 안 좋네, 환각이 엄청 심하네 이런 평가가 이어진다.
아이브의 리더가 누구인지 먼저 알아내야하고, 이걸 바탕으로 이전 활동 걸그룹명까지 복합적인 2차 정보를 가져와야한다.
장원영이 아닌가 하시는 분들도 있지만, 포지션은 센터다.
리더는 안유진이다.
그래서 우측에서 커스텀커넥터 웹서치를 켠다.
예전 GPT의 웹서치 검색결과를 도출해주는 <웹브라우징 플러그인> 같은건데, 인용부분에 나무위키, 한국경제 연예뉴스기사등이 찍혀있다.
웹서치를 8개정도 돌린후에 검색결과를 바탕으로 아이브 리더의 이전 활동 걸그룹명은 <아이즈원>이라고 정확하게 표시해준다.
가장 간단하게 결과값을 출력해보려면,
print(response.text)
로 커스텀커넥터인 웹서치로 각종 정보를 수집하고, 마지막의 추론 결과를 화면에 찍어볼 수 있다.
아이즈원 (IZ*ONE)입니다.
파이썬 소스코드
import os
import cohere
COHERE_API_KEY =os.environ.get("COHERE_KEY")
# print(COHERE_API_KEY)
co = cohere.Client(COHERE_API_KEY)
response = co.chat(
chat_history=[
{"role": "USER", "message": "kpop girlgroup 아이브 멤버는 누구인가?"},
{"role": "CHATBOT", "message": "김채원, 안유진, 장원영, 가을, 레이, 이서, 리즈"}
],
message="kpop girlgroup 아이브 리더가 소속되었던 이전 걸그룹 이름은 무엇인가?",
# perform web search before answering the question. You can also use your own custom connector.
connectors=[{"id": "web-search"}]
)
print(response.text)
# msg = list(response.chat_history)
# for x in msg:
# if x.role == "CHATBOT":
# print(x.message)
# else:
# pass
# msg = response.chat_history.pop()
# print(msg)
# if msg.role == "CHATBOT":
# print(msg.message)
'''
[ChatMessage(role='USER', message='kpop girlgroup 아이브 멤버는 누구인가?'), ChatMessage(role='CHATBOT', message='김채원, 안유진, 장원영, 가을, 레이, 이서, 리즈'),
ChatMessage(role='USER', message='kpop girlgroup 아이브 리더가 소속되었던 이전 걸그룹 이름은 무엇인가?'), ChatMessage(role='CHATBOT', message='아이브 리더 안유진은 아이즈원 출신입니다.')]
'''
일단 웹서치가 최소 8개 정도 되다보니 입력 토큰도 엄청 먹어서 아래처럼 input token 값이 37,686부터 63,000이상까지 찍히기도한다.
사용된 입력토큰수
'billed_units': {
'input_tokens': 37686,
'output_tokens': 18
},
'tokens': {
'input_tokens': 38435,
'output_tokens': 18
}
RAG의 취지가 쓸데없는거 줄이기 위해서 코딩으로 처리하는건데 입력토큰을 너무 많이 먹는다고 할지도 모르겠지만, RAG기능을 구현할줄 몰라도 토큰을 희생해서 원하는 답변을 검색하게 했다는데 의의를 두었으면 한다. 코히어의 평가판 키는 chat에 대해선 한달에 5천회까지 무료라서 막 써도 되긴 한다.
앞에서 코히어 홈페이지의 코랄 플레이그라운드에서는 따로 보이지않던 웹서칭 결과나 인용 데이터에 대한 정보들은 위의 파이썬 소스코드를 통해선 전부 파악가능할거다.
커스텀 커넥터 웹서치 8개의 출력 토큰들이 너무 길어서 아래처럼 캡처본만 올려놨다.
websearch_3의 한국경제 연예판 기사에서 <아이즈원 출신 안유진, 아이브 리더됐다> 라는 연예 기사로부터 모델이 추론에 사용하길 원하는 키워드 두 가지를 모두 추출 가능했다.
chat_history=[
{"role": "USER",
"message": "kpop girlgroup 아이브 멤버는 누구인가?"},
{"role": "CHATBOT",
"message": "김채원, 안유진, 장원영, 가을, 레이, 이서, 리즈"}
],
먼저 chat_history에 질문자가 두 개의 질문과 정답지를 먼저 담아보냈다.
"kpop girlgroup 아이브 멤버는 누구인가?" 에 대한 응답으로 "김채원, 안유진, 장원영, 가을, 레이, 이서, 리즈"라는 적절한 정답을 합쳐서 먼저 AI 파운데이션 모델에게 제공하면 <프리스틴 이강>이니 <에버글로우>같은 환각성이 짙은 답변은 먼저 제외할 수 있다.
이후 다른 웹서치 구문에서도
message="kpop girlgroup 아이브 리더가 소속되었던 이전 걸그룹 이름은 무엇인가?" 라는 복합적인 추론이 필요한 질문을 보냈을땐
'title': '멤버 레이가 톡으로 영상 보냈는데 ‘읽씹’한 아이브 리더 안유진 - 인사이트', 'url': 'https://www.insight.co.kr/news/435706'}
이런 인사이트 기사에서도 살펴보면 레이가 아이브의 멤버임이 앞에서 이미 CHATBOT 대답으로 미리 주어져있고, 읽씹한 아이브 리더 안유진이란 문장으로부터 안유진이 해당 그룹 아이브의 리더라는 정보를 추론해서 알아낸다.
토큰을 희생하더라도 co.chat() 펑션안에
connectors=[{"id": "web-search"}]
커스텀 커넥터 한 줄만 추가하면 답변이 굉장히 우수해지므로 실제ㅐ로도 실습을 해볼만한 내용이다. 아카데미에서도 학생들에게 코딩 사례로 가르치기 좋다.
출력부분도
print(response.text) 는 결과만 알려주고,
print(response)
는 커스텀커넥터 웹서치 결과들을 JSON형태로 다 파악할 수 있다.
CHATBOT 응답들의 리스트 데이터들에서 가장 마지막 응답만 빼서 보여주면 최종답변과 같은거다.
msg = response.chat_history.pop()
print(msg)
아니면 chat_history로 주어진 리스트 자료 구조로부터 CHATBOT role만 골라서 출력해주는 방법도 있겠다.
msg = list(response.chat_history)
for x in msg:
**if x.role == "CHATBOT":**
**print(x.message)**
**else:**
**pass**
두개의 CHATBOT role 답변만 출력이 된다.
파이썬 소스코드 다운로드
ulsancoding.com을 참고
UCA울산코딩아카데미
ulsancoding.com
교육문의: 052-708-001