brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jul 03. 2024

AI 3탄-3. 외부검색과 히스토리를 바탕으로 응답

챗GPT와 랭체인을 활용한 LLM기반 AI 앱 개발-3/5

코랩 사용



<12> 외부 검색과 히스토리 바탕으로 응답하는 웹 앱 구현하기 

<13> AWS Cloud9 구성 (실습)

<14> 파이썬 구성  (실습)

<15> 깃허브 구성 (실습)

<16> 웹 앱 구현하기 (실습)

<17> 스트림릿 클라우드로 외부에 배포 하기 (실습)



서비스1- 외부검색과 히스토리를 바탕으로 응답하는 웹 앱 구현하기

서비스2- 스트림 형식으로 히스토리를 기반 응답하는 슬랙앱구현

서비스3- 사내 문서에 관해 답변하는 슬랙 앱 구현하기




<12> 외부 검색과 히스토리 바탕으로 응답하는 웹 앱 구현하기 


1





사전 준비

AWS Cloud9 구성 - 파이썬 구성

깃허브 구성

6장






<13> AWS Cloud9 구성



1

AWS에서 Cloud9 생성 (아마존 리눅스 1대)

서울 리전

아마존 리눅스

AWS Systems Manager (SSM)



https://console.aws.amazon.com/console/home






<14> 깃허브 생성



1





2

내 git 허브에 폴더 만들기

https://github.com/topasvga1/streamlit-langchain-app




3

Cloud9과 깃허브 연동.


Cloud9에서 깃허브에 SSH로 접속 하는 방법?

taeho.seo


ssh-keygen -t ed25519 -C "taeho.seo@gmail.com"


cat ~/.ssh/id_ed25519.pub 

공개키 xxxxxxxxxxxxxxxxxxxxxxx




4

깃허브에 공개키 등록 ???


오른쪽위  프로필  > 세팅

SSH and GPG keys > New SSH key 


cloud9-langchain-book

공개키  등록



5

ssh -T git@github.com

Hi topasvga1! You've successfully authenticated, but GitHub does not provide shell access.



6


ec2-user:~/environment $ git config --global user.email taeho.seo@gmail.com

ec2-user:~/environment $ git config --global user.email topasvga1



# git clone으로 파일 가져오기


git clone git@github.com:topasvga1/streamlit-langchain-app




<15> 파이썬 구성 


1

curl https://pyenv.run | bash

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc

echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc

eval "$(pyenv virtualenv-init -)"  >> ~/.bashrc

exec "$SHELL"

 pyenv --version




2

# pyenv 3.10 설치하자.


sudo yum remove -y openssl-devel

sudo yum install -y openssl-devel bzip2-devel xz-devel


sudo yum install libffi-devel

sudo yum install ncurses-devel

sudo yum install readline-devel




3

 pyenv install 3.10

(10여분 걸림)



4

# 가상 환경에서 python 3.10 사용하기 위한 절차  (선택)

# 라이블러리등 충돌 나지 않게 사용하기 위해 가상 환경을 사용한다.


ec2-user:~/environment $ cd streamlit-langchain-app/


ec2-user:~/environment/streamlit-langchain-app (main) $ pyenv local 3.10

ec2-user:~/environment/streamlit-langchain-app (main) $ more .python-version 

3.10

# local 명령어는 현재 디렉토리와 디렉토리 아래는 해당 파이썬 버전을 사용하게 된다.


ec2-user:~/environment/streamlit-langchain-app (main) $ python -m venv  .venv

ec2-user:~/environment/streamlit-langchain-app (main) $ .  .venv/bin/activate



5

비활성화

deactivate 





<16> 웹 앱 구현하기


1

6장

Window > New Terminal


2

#  스트림릿 설치


pip install streamlit



app.py

import streamlit as st

st.title("langchain-streamlit-app")



3

 streamlit run app.py --server.port 8080



4

# 동작 화면



5

소스


https://github.com/ychoi-kr/langchain-book/blob/main/chapter6/app.py



6

# 사용자 입력 받기 , app.py


import os

import streamlit as st

prompt = st.chat_input("What is up?")

print(prompt)



File > Save


streamlit run app.py --server.port 8080


Preview




7

# 입력 내용과 응답을 화면에 표시하기


import streamlit as st

st.title("langchain-streamlit-app")    

prompt = st.chat_input("What is up?")

if prompt:

    with st.chat_message("user"):

        st.markdown(prompt)        

    with st.chat_message("assistant"):

        response = " 안녕하세요로 응답한다"        

        st.markdown(response)



 streamlit run app.py --server.port 8080



preview



6

# 대화 기록 보기 기능 추가


 pip install langchain-community



import streamlit as st

from langchain_community.chat_message_histories import StreamlitChatMessageHistory

st.title("langchain-streamlit-app")

history = StreamlitChatMessageHistory()

for message in history.messages:

    st.chat_message(message.type).write(message.content)    

prompt = st.chat_input("What is up?")

if prompt:

    with st.chat_message("user"):

        history.add_user_message(prompt)

        st.markdown(prompt)     

    with st.chat_message("assistant"):

        response = " 안녕하세요!!"

        history.add_user_message(response)

        st.markdown(response)



File > 저장



 streamlit run app.py --server.port 8080




7

# 랭체인으로 API 실행하기


.env 파일 생성


OPENAI_API_KEY=

OPENAI_API_MODEL=gpt-3.5-turbo

OPENAI_API_TEMPERATURE=0.5




8

pip install langchain openai langchain-openai python-dotenv streamlit-chat




9


# Agent를 사용하여 필요에 따라 외부 정보 검색하기


pip install langchainhub duckduckgo-search wikipedia



import os

import streamlit as st

from dotenv import load_dotenv

from langchain import hub

from langchain.agents import AgentExecutor, create_openai_tools_agent, load_tools

from langchain.memory import ConversationBufferMemory

from langchain_community.callbacks import StreamlitCallbackHandler

from langchain_community.chat_message_histories import StreamlitChatMessageHistory

from langchain_openai import ChatOpenAI

load_dotenv()

def create_agent_chain(history):

    chat = ChatOpenAI(

        model_name=os.environ["OPENAI_API_MODEL"],

        temperature=os.environ["OPENAI_API_TEMPERATURE"],

    )    

    tools = load_tools(["ddg-search", "wikipedia"])    

    prompt = hub.pull("hwchase17/openai-tools-agent")    

    memory = ConversationBufferMemory(

        chat_memory=history, memory_key="chat_history", return_messages=True

    )    

    agent = create_openai_tools_agent(chat, tools, prompt)

    return AgentExecutor(agent=agent, tools=tools, memory=memory)

st.title("langchain-streamlit-app")

history = StreamlitChatMessageHistory()

for message in history.messages:

    st.chat_message(message.type).write(message.content)    

prompt = st.chat_input("What is up?")

if prompt:

    with st.chat_message("user"):

        st.markdown(prompt)        

    with st.chat_message("assistant"):

        callback = StreamlitCallbackHandler(st.container())

        agent_chain = create_agent_chain(history)

        response = agent_chain.invoke(

            {"input": prompt},

            {"callbacks": [callback]},

        )        

        st.markdown(response["output"])



streamlit run app.py --server.port 8080




출처

https://github.com/ychoi-kr/langchain-book/blob/main/chapter6/app.py





<17> 스트림릿 클라우드로 외부에 배포 하기 (실습)


1

#  클라우드 웹앱에서도 필요한 패키지를 설치래야 한다.

 requirements.txt  에 정리한다.  require txt를 만든다.


pip freeze > requirements.txt



2

# 깃허브에 소스 업로드 한다.


cd /home/ec2-user/environment/streamlit-langchain-app



git init

git remote add origin https://github.com/topasvga1/streamlit-langchain-app


git config  --global user.name "topasvga1"

git config --global user.email "taeho.seo@gmail.com"


git add .python-version app.py requirements.txt


git add .python-version app.py requirements.txt

 git commit -m 'add'

git push



# git 사용법 참고 필요시.


 git remote -v

 git remote rm origin

 git remote add origin https://github.com/topasvga1/memo1


git push -u origin main

topasvga1

passwd

ghp_spk


https://brunch.co.kr/@topasvga/3669




3

# 스트림릿 커뮤니티 클라우드에 배포하기


1) 가입

https://streamlit.io/cloud


2) app 생성

나는 google 계정




3

배포 안됨?



다음

https://brunch.co.kr/@topasvga/3897


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari