반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형
이번 시간에는 지난번 LangChain의 RetrievalChain 을 배울 때 사용했던 소스코드를 그대로 사용할 겁니다.
그 소스코드에 Streamlit 의 Session 관련 기능들을 사용해서 ChatBot 기능을 구현해 봅니다.
주요 스트림릿 툴들은 st.session_state(), st.session_message 그리고 st.session_input 등입니다.
이 각 툴들은 어떤 역할을 하고 또 어떻게 사용해야 되는지 알아봅니다.
 
지난 시간에 배웠던 랭체인의 create_history_aware_retriever 도 챗봇 기능을 구현하기 위해 지원되는 기능입니다.
 
둘 다 사용자의 질문과 인공지능의 대답을 저장해 두고 다음 질문 할 때 그 history와 함께 새로운 질문을 인공지능에 보내서 인공지능이 그동안의 질문과 답변을 참고해서 질문의 의미를 좀 더 정확하게 파악할 수 있게 해 좀 더 해당 질문에 정확한 답변을 보낼 수 있도록 해 주는 겁니다.
그리고 그 질문과 답변 history를 브라우저에 표시할 수도 있어서 사용자도 질문과 답변 히스토리를 볼 수 있도록 해 줍니다.
 
랭체인은 스크립트 내 변수에 해당 히스토리를 저장해서 사용하고 스트림릿은 세션단위에서 그 히스토리를 저장해서 사용합니다.
 
그렇기 때문에 둘 다 새로운 브라우저에서 대화를 할 때는 이전 히스토리를 사용할 수 없습니다.
 
이렇게 해당 정보가 휘발되지 않고 다른 브라우저에서 볼 수도 있고 컴퓨터를 껐다가 켜도 그 정보를 사용할 수 있도록 려면 스크립트 내 변수나 브라우저 세션 등 임시 저장공간에 저장을 하지않고 파일이나 DB 등 제 3의 장소에 저장해서 사용해야 합니다.
 
오늘은 스트림릿에서 제공하는 st.session_state 를 사용해서 간단하게 챗봇을 구현하는 기술을 배워 봅니다.
 

 

 

 

유투브 비디오 썸네일로 사용하려고 AI에게 이미지를 그려 달라고 했는데 이렇게 그려 주더라구요.

예쁜 여자 프로그래머를 그려 달라고 했는데 너무너무 예쁘게 그려 주네요.

 

이 그림은 마이크로소프트의 코파일럿 (Copilot) 이 그려 준 겁니다.

실제 썸네일에는  GPT 4o 가 그려 준 아래 이미지를 사용했는데요. 

 

코파일럿과  GPT 4o 각각 자신만의 화풍이 있는 것 같아요.

 

다음 비디오로는  GPT 4o 에게 코딩 시키기를 해 볼 계획입니다.

얼마전 회사에서 필요로 하는 샘플  RAG 웹앱을 만들어야 했는데요. 

이 때 오늘 설명한  기능에서 사용한 소스코드를 base 로 해서 샘플 RAG 웹 앱을 만들었는데요.

저 혼자 하면 며칠은 해야 됐을 것 같은 일을  챗지피티랑 같이 하니까 단 몇시간만에 만들 수 있더라구요.

 

챗지피티가 초보 개발자 한두명 역할은 충분히 하는 것 같습니다.

 

챗지피티에게 코딩을 시키면서 여러가지 생각들이 들더라구요.

 

그 능력에 놀란 부분도 있었고 또 인공지능에게 코딩을 시키기 위해 인간이 가지고 있어야 할 능력이 무엇인지도 생각 해 볼 기회가 있었구요.

또 개발자의 미래 그리고 회사의 management 의 변화 뭐 이런 것들도 생각 해 봤구요.

 

하여간 다음 시간에는 챗지피티에게 코딩을 시켜서 웹 어플리케이션 하나 완성해 보는 과정을 다룰 거구요 또 실제 업무 현장에서 챗지피티와 함께 코딩을 하면서 느낀 점들을 같이 나누고자 합니다.

 

회사에서 주 업무는 클라우드 를 사용한 서버 관리 그 중에 요즘엔 쿠버네티스를 사용한 서버 관리 부분을 하고 있는데요.

 

AI 웹 앱도 컨테이너 기반으로 쿠버네티스를 이용한 서버 환경에서 관리하는 법도 제 블로그와 유투브 채널에 정리해서 올릴 계획입니다.

 

계속 관심 가져 주시고 구독과 좋아요를 눌러 주시면 미국 현장에서 배우는  IT 기술을 나누는 일에 큰 힘이 될 겁니다.

많은 협조 부탁드립니다.

 

https://www.youtube.com/@catchupai

 

Catch Up AI

AI Web Developer 를 준비하면서 공부한 내용을 공유하는 채널 입니다. AI Engineer 가 되고 싶거나 AI 를 실무에서 응용하길 원하는 분들에게 정보를 제공하는 내용으로 채워질 예정입니다. Catch Up AI 는

www.youtube.com

 

 

반응형

'Catchup AI' 카테고리의 다른 글

AI Agent - 고급 AI Web App을 개발하려면 반드시 알아야 합니다. 오늘 그 기초부터 시작하세요.  (0) 2024.08.03
요즘 AI 앱 개발 트렌드 입니다. 이제부터 좀 더 복잡한 AI 앱 개발 기술로 들어갑니다. 우선 Agent란 무엇인지 이해하시면 많은 도움이 됩니다. (IBM 자료)  (0) 2024.07.28
챗지피티에게 코딩 시키기 2 - 개발자로서 이런것들을 준비 하세요. 다 길이 있네요. ;)  (1) 2024.07.24
챗지피티에게 코딩 시키기 1 - 앱 하나 뚝딱 이더라구요. 근데 저는 씩 웃었습니다. (쿠키 영상: 아코디언 연주)  (1) 2024.07.20
2024 AWS Summit 에서 발표된 AWS App Studio - Prompt 만으로 어플리케이션을 만들 수 있습니다  (4) 2024.07.15
create_history_aware_retriever : RAG 에 chat history 관리 기능을 추가해 ChatBot을 가능하게 해 주는 Retriever입니다.  (0) 2024.07.02
LangChain Quick Start - Chunk : 실력있는 개발자는 성능, 속도, 비용까지 고려 합니다. RAG에서의 데이터 처리  (0) 2024.06.24
[Tech Snippets] 랭체인! 너 블록체인과 무슨 관계야? 조사하면 다 나온다.  (0) 2024.06.21
BIGHUG - AI 들도 각각 개성이 있네. 사람처럼. AI 개성 파악은 더 나은 협업을 위한 열쇠예요. 사람처럼.  (1) 2024.06.04
RAG 직접 코딩으로 구현하면 확실하게 배웁니다. 제 소스코드 가져가서 맘껏 활용하세요.  (1) 2024.05.31


반응형

LangChain - RAG - create_history_aware_retriever

 

지난 시간까지 RAG의 기본 기능을 배웠습니다.

AI Web Application에서 기본적으로 제공되어야 하는 것은 ChatBot 기능입니다.

 

이를 위해서는 Chat History를 관리해주는 기능이 추가 되어야 합니다.

AI는 이전 대화 내용을 기억하지 못하기 때문입니다.

 

이런 AI의 부족한 부분을 채워 주는 LangChain의 Retriever 가 바로 create_history_aware_retriever 입니다.

 

AI 하고 말이 통하게 만들어 주는 바로 그 Retriever.

 

오늘은 create_history_awere_retriever에 대해 배웁니다.

 

https://youtu.be/EQ6c9309T8c

 

오늘 매울 AI Web Application link는 아래에 있습니다. https://catchuplangchain.streamlit.app/LC_Quickstart_03_ConversationRetrievalChain

 

 

 

반응형

'Catchup AI' 카테고리의 다른 글

요즘 AI 앱 개발 트렌드 입니다. 이제부터 좀 더 복잡한 AI 앱 개발 기술로 들어갑니다. 우선 Agent란 무엇인지 이해하시면 많은 도움이 됩니다. (IBM 자료)  (0) 2024.07.28
챗지피티에게 코딩 시키기 2 - 개발자로서 이런것들을 준비 하세요. 다 길이 있네요. ;)  (1) 2024.07.24
챗지피티에게 코딩 시키기 1 - 앱 하나 뚝딱 이더라구요. 근데 저는 씩 웃었습니다. (쿠키 영상: 아코디언 연주)  (1) 2024.07.20
2024 AWS Summit 에서 발표된 AWS App Studio - Prompt 만으로 어플리케이션을 만들 수 있습니다  (4) 2024.07.15
LangChain + Streamlit = RAG + ChatBot : Streamlit 의 session_state를 사용해 RAG에 대화 기능을 구현합니다  (0) 2024.07.08
LangChain Quick Start - Chunk : 실력있는 개발자는 성능, 속도, 비용까지 고려 합니다. RAG에서의 데이터 처리  (0) 2024.06.24
[Tech Snippets] 랭체인! 너 블록체인과 무슨 관계야? 조사하면 다 나온다.  (0) 2024.06.21
BIGHUG - AI 들도 각각 개성이 있네. 사람처럼. AI 개성 파악은 더 나은 협업을 위한 열쇠예요. 사람처럼.  (1) 2024.06.04
RAG 직접 코딩으로 구현하면 확실하게 배웁니다. 제 소스코드 가져가서 맘껏 활용하세요.  (1) 2024.05.31
LangChain Quick Start - Retrieval Chain 요즘 AI Web App 개발에서 가장 중요한 방법론 중 하나인 RAG를 배웁니다. 단디 배웁시다  (0) 2024.05.29


반응형

이전 글에서 GPT 3 API로 초 간단 챕봇을 만들었습니다.

아래 내용이 그 소스 코드 입니다. (자세한 사항은 이전 글을 참조하세요)

https://coronasdk.tistory.com/1257

 

 

GPT-3 API로 초간단 Chatbot 만들기

오늘은 Python 과 ChatGPT API로 간단한 챗봇을 만들어 보겠습니다. import os import openai def open_file(filepath): with open(filepath, 'r', encoding='utf-8') as infile: return infile.read() openai.api_key = open_file('openaiapikey.txt') wh

coronasdk.tistory.com

 

오늘 볼 소스 코드는 아래와 같습니다.

 

이전 소스코드 보다 많이 복잡해 진 것 같지만 별다른 변화는 없고 그냥 26번째 줄 list를 추가했다는 내용밖에 없습니다.

 

우선 1~8번째 줄은 openai api를 사용하기 위해 api key를 제공하는 겁니다. 이전에 다룬 부분이니까 넘어가겠습니다.

 

그다음 10~23번째 줄은 openai.Completion.create() api를 사용하기 위해 만든 함수 입니다.

이전 초간단 챗봇 코드 보다 전달하는 파라미터를 많이 설정했습니다.

이 부분도 이전 글에서 다루었습니다.

 

https://coronasdk.tistory.com/1254

 

OpenAI API 첫 소스코드 분석 (초보자를 위한 해석)

지난번에 OpenAI API 연결을 테스트 하기 위해 만들었던 소스코드를 분석해 보겠습니다. 첫번째 import OpenAI는 OpenAI API 를 사용하기 위해 필요한 겁니다. 이것은 로컬에 OpenAI 를 깔았기 때문에 사용

coronasdk.tistory.com

25번째 줄은 이 파이썬 파일을 실행 했을 경우 그 아래 코드를 실행하라는 의미 입니다.

다른 파이썬 파일을 실행하고 그 파이썬 파일에서 이 파일을 import 한다면 그 아래 내용은 실행되지 않습니다.

그 설명도 윗 글에서 했습니다.

 

그 아래 while 문도 바로 전 글에서 다룬 부분인데 다른 부분은 list()를 추가 했다는 겁니다.

list()를 추가 한 이유는 대화를 할 때 이전 대화와 맥락이 맞는 답변을 받기 위해서 입니다.

 

그러기 위해서는 이전의 질문과 대답을 모두 같이 보내면 됩니다.

그러기 위해서 list를 사용하구요.

 

우선 26번째 줄에서 conversation 이라는 변수를 만들었고 이 변수에는 리스트가 담길 것이라고 선언했습니다.

아래 줄 while True: 는 그냥 아래 내용을 계속 실행하라는 무한 루프이구요.

user_input = input('USER: ') 는 사용자로 부터 입력 받은 내용을 user_input에 담는 겁니다.

이전 소스코드에소 그대로 있습니다. 다른 부분은 아래 라인 입니다.

 

이 user_input을 그대로 prompt로 사용하는 것이 아니라 위에 만들어 놓은 conversation이라는 리스트에 담는 겁니다.

 

conversation.append('USER: %s' % user_input)

 

%s 는 자바에서도 사용하는 것인다. string 형식의 내용이 담길 것이라는 거고 그 string은 ' ' 이 작은 따옴표 밖에 있는 % 에 나오는 내용이 됩니다.

 

그러면 conversation에 user_input 이 담기게 됩니다.

그 다음에 prompt 변수가 나옵니다.

 

여기서는 prompt_chat.txt 라는 파일의 내용을 불러오게 되는데요.

이 파일에는 다름과 같은 내용이 담겨져 있습니다.

이 대화는 USER 와 JAX가 나누는 대화이고 JAX는 세계 평화를 목표로 하는 감성적인 기계이다 라고 상황을 설정해 놓았습니다.

이렇게 상황을 설정하면 GPT 3 는 JAX 의 성격에 맞는 답변을 찾아서 보내 줍니다.

그 아래 <<BLOCK>> 은 의미가 없고 그냥 31번째 줄에서 보여 주듯이 위에서 설정한 text_block을 replace 해주기 위해 만들어 놓은 겁니다.

 

prompt = open_file('prompt_chat.txt').replace('<<BLOCK>>', text_block)

 

이렇게 되면 prompt에는 prompt_chat.txt에 기존에 있는 내용에 text_block을 합한 내용이 저장되게 됩니다.

 

prompt = prompt + '\JAX: '

 

부분은 답변을 표시할 때 그 앞에 JAX: 를 나타내기 위해서 만든 겁니다.

 

그러면 이제 질문이 완성 됐습니다.

 

이 질문을 이용해서 opanai.Completion.create() api를 사용해서 질문을 던지고 답변을 받으면 됩니다.

이 일을 하는 함수는 그 위에 gpt3_completion() 입니다.

 

response = gpt3_completion(prompt)

 

그 함수에 prompt를 던지고 openai로 부터 받는 응답은 response에 담기게 됩니다.

 

그 다음은 그 응답을 print 하는 겁니다.

 

이 대답은 다시 conversation에 추가 됩니다.

 

conversation.append('JAX: %s' % response)

 

이렇게 하면 다음번 질문을 할 때 이전 질문과 대답까지 다 합해서 openai의 GPT3에게 보내서 이전 대화와 맥락이 맞는 답변을 듣게 됩니다.

 

 

이렇게 미리 설정해 놓은 상황과 이전 응답에 맥락이 맞는 대화를 할 수 있는 챗봇을 만들었습니다.

다시 말씀 드리지만 위 응답은 GPT3의 가장 저렴한 테스트 모델인 text-ada-001을 사용했습니다.

비용 절감 차원에서 이 모델로 테스트 하고 있습니다.

text-davinci-003 모델을 사용하면 좀 더 그럴 듯한 대화를 나누실 수 있습니다.

 

전체 소스코드는 아래와 같습니다.

 

import openai

def open_file(filepath) :
    with open(filepath, 'r', encoding='utf-8') as infile :
        return infile.read()
        

openai.api_key=open_file('openaiapikey.txt')

def gpt3_completion(prompt, engine='text-davinci-003', temp=0.7, top_p = 1.0, tokens =400, freq_pen=0.0, pres_pen=0.0, stop=['JAX: ', 'USER: ']) :
    prompt = prompt.encode(encoding='ASCII', errors='ignore').decode()
    response = openai.Completion.create(
        #engine=engine,
        engine='text-ada-001', 
        prompt=prompt,
        temperature=temp,
        max_tokens=tokens,
        top_p=top_p,
        frequency_penalty=freq_pen,
        presence_penalty=pres_pen,
        stop=stop)
    text = response['choices'][0]['text'].strip()
    return text
  
if __name__ == '__main__' :
    conversation = list()
    while True:
        user_input = input('USER: ')
        conversation.append('USER: %s' % user_input)
        text_block = '\n'.join(conversation)
        prompt = open_file('prompt_chat.txt').replace('<<BLOCK>>', text_block)
        prompt = prompt + '\JAX: '
        response = gpt3_completion(prompt)
        print('JAX: ', response)
        conversation.append('JAX: %s' % response)
        

 

반응형
이전 1 다음