chatgpt 명령한것과 똑같은 효과를 두는

open api chatCompletion 호출 사용의 예제이다. 매~우 간단함

 

다만, 챗gpt는 원래 대화방 단위로 사용자와의 대화이력을 이어갈수 있다.

그러면 앞서 나누던 대화의 맥락을 이어갈수 있다.

 

message에 role:user와 role:assistant에 대화를 누적해가며 계속 호출하면되는데

대화방 컨텍스트에 따른 대화이력 저장방식이 필요함으로 

 

여기서는 단순 1회성 호출만 소개한다.

import os
import openai
import datetime
openai.api_key = os.getenv("OPENAI_API_KEY") #부여 받은 api key, 이걸 기준으로 과금된다.
로컬에 환경변수에 저장된 key를 가져오도록 해놨다. 

#openai.organization = "org-cT1P어쩌고L"  #api key의 계정-조직의 id, 
#지금처럼 주석으로 막아놓듯이 선언을 따로 안하면 open ai에 세팅된 디폴트 organizaion을 사용한다.

inputPrompt = "자기 소개서 잘 쓰는법 알려줘"           # reqeust 문장
model = "gpt-3.5-turbo"                                          # 모델선택 gpt-4, gpt-4-0314, gpt-4-32k, gpt-4-32k-0314, gpt-3.5-turbo, gpt-3.5-turbo-0301


# massage는 복수형 array인데, user와 assistant의 대화 히스토리를 통째로 보내서 
요청할수 있는 구조이다. 여기선 1회성 호출만 하도록 role user의 명렁 1개만 넣어 호출한다

completion = openai.ChatCompletion.create(
  model=model,
  temperature=0,
  messages=[
    {"role": "user", "content": inputPrompt}
  ]
)
result = completion.choices[0]
# 결과는 복수개를 돌려준다, 이중에 최상단 1개값만 가져온다


#print (result)
# 결과값은 obect로 되어있다. 주석처리하여 따로 보지않도록 해놨고 보고싶으면 주석해제하면됨

print (result.message.content)
# 결과값에서 assistant 응답메세지만 가져온다

print(datetime.datetime.now())
# 그냥 현재 시간 표시용

*openai.api_key는 open ai에서 발급받아 사용하며, 유료 호출이다.  gpt-3.5의 경우 매우 저렴하기에 딱히 별 이슈가 없다.

*api_key는 local에 저장된 환경변수를 가져다 쓰는 방식이 스탠다드다, 윈도우는 환경변수로 key를 넣는게 매우 쉽고, MAC은 터미널로 좀 까다로운 작업이 필요함,  잘 모르겠으면 그냥 open ai의 api key 를 그대로 = 뒤에다가 string으로 붙여서 써도 된다.

다만 이럴경우 스크립트를 온라인으로 그대로 공유할때 api key가 공개됨으로 남이 막 쓸수있다. 유료라서 과금이 되니 문제가됨

 

message의 role user의 content에 명령어를 넣고,

결과는 completion이 복수형으로 나오는데, 이중에 만앞에꺼면 뽑아서 message.content를 출력하면 된다.

 

 

 

나에게 친숙한 업비트 코인 가격조회 api를 통해,

langchain / langflow를 써서, 업비트의 코인코드 확보 및 가격조회 api 두개를 tool로 사용하여

 

실시간으로 코인 가격을 얻어오는 agent 데모를 만들었다.

일종의 자가 chatgpt plugin이라 하겠다

 

 

상당한 복잡한 패턴의 시나리오까지 금방 소화해버림,

채팅봇 기반으로 만드려면 시나리오 조건이나 파라미터 지정, 필드 지정에 대한 노가다 난이도가 미쳐버리는데,

이것으로는 GET api를 포함해서 30분도 안걸렸다.

 

그런데 문제가 뭐냐하면...

 

hallucination, 즉 "구라"가 자꾸 튀어나오는 것이다

프롬프팅 튜닝을 통해 막으면, 기존에 잘되던게 안되기도 하는, 원인 추적불가 사이드이펙트가 나타나고

무엇보다도 정의하지 않은 모든 형태의 요청조건에 대해 할루시에이션이 생기는걸 막을수 없다.

 

프롬프팅에서 제대로 가이드하지않으면 모르는부분을 어떻게든 거짓말을 쳐서 답변하려는

잘못된 면접후보생 같은 태도를 보이는것이다.

 

그러면 뭐가 문제냐면,

비지니스로 사용할수가없다.

 

예상치 못한 결함과 오차가 언제든 발생한다는 전제로 사용해야하는데,

그럼 농담따먹기 말고 비지니스에서 사용할 방법이 있을까?

 

두번째로는, 느리다는것,

룰기반으로 하면 1초도 안되서 나올 간단한 답이 20~30초 걸리는것..

하이퍼클로바x도 마찬가지.

 

 

일반적인 대화 agent로서, 고객센터의 대체제로서는

아직은 LLM은 쓰지 못하는게 아닐까.

 

 

시간이 허락하면

랭체인과 랭플로우를 쓰는 방법을 정리 해볼 예정

 

 

 

 

xor 알고리즘을 데이터로 학습시키고, data2로 다른샘플을 학습시켜 본다


from sklearn import svm


xor_data = [ # xor 처리 학습을 위한 최초 데이터

#P, Q, Result

[0,0,0],
[0,1,1],
[1,0,1],
[1,1,0]

]


data1 =[] #최초 데이터 만들기
label = []

for row in xor_data:


p = row[0]
q = row[1]
r = row[2]


data1.append([p,q]) #튜플 형태로 최초데이터 생성
label.append(r)

#print (data)
#print (label)


clf = svm.SVC() # 데이터 학습하기
clf.fit(data1,label) # 데이터1를 보고 라벨의 결과를 학습, 자체 함수 만듬

data2 = [ [0,0], [1,1], [1,1], [1,0], [1,0], [0,1], [0,0] ]


pre = clf.predict(data2) #데이터2를 보고 예측값 확인
print ("예측결과 : " , pre )


+ Recent posts