실습 환경
https://brunch.co.kr/@topasvga/4145
1
링체인을 이용한 챗봇.
RAG는 사용 안함.
2
# 환경
스트림릿을 사용하기 위해서는 아나콘다 환경이어야 한다.
기본 라이브러리 설치하고, 제공하는. py 파일로 빠르게 실습해 보자.
3
# 작업 순서
# 아나콘다 설치
# windows > Amaconda Prompt
jupyter notebook 실행하여 라이브러리 설치
파이썬 소스 작성
dos창에서 python 실행
4
https://brunch.co.kr/@topasvga/4145
5
실습 파일
6
산출물
7
# ch.py로 제공하는 소스로 사용
예제에 있는 FM 모델 없어짐.
변경전
gpt-4-0314
변경후
gpt-4
8
9
10
# windows 10 pc에서
Anaconda Prompt 실행
jupyter notebook 사용
LLM으로 변경하자
11
12
13
!pip install langchain
!pip install streamlit
!pip install openai
14
실습
15
예제에 있는 FM 모델 없어짐.
모델 변경
gpt-4
#!/usr/bin/env python
# coding: utf-8
# In[1]:
#!pip install langchain
# In[2]:
#!pip install streamlit
# In[3]:
#!pip install openai
# In[4]:
import streamlit as st
from langchain.chat_models import ChatOpenAI
st.set_page_config(page_title="�� 뭐든지 질문하세요~ ")
st.title('�� 뭐든지 질문하세요~ ')
import os
os.environ["OPENAI_API_KEY"] = "sk" #openai 키 입력
def generate_response(input_text): #llm이 답변 생성
llm = ChatOpenAI(temperature=0, # 창의성 0으로 설정
model_name='gpt-4', # 모델명
)
st.info(llm.predict(input_text))
with st.form('Question'):
text = st.text_area('질문 입력:', 'What types of text models does OpenAI provide?') #첫 페이지가 실행될 때 보여줄 질문
submitted = st.form_submit_button('보내기')
generate_response(text)
# In[ ]:
16
c:\Users\seo\anaconda3\envs\llm\Scripts>streamlit run cha.py
17
1
텍스트에 있는 내용을 벡터화하고, 내용을 참고해서 LLM에 질문하여 응답을 받는다.
ai란?
text 파일에 있는 내용을 참고해서 답변 한다.
답변
2
랭체인에서 RAG 구현 방법을 알아보자.
AI.txt 파일을 읽어서 벡터 데이터 베이스에 저장하자.
질문을 하면 벡터 데이터 베이스 내용을 참고해서 LLM에 질의하여 응답을 받는다.
AI.TXT 내용을 참고하는 것이다.
# AI 관련 내용을 ai.txt 로 만든다.
Artificial intelligence (AI) is the intelligence of machines or software, as opposed to the intelligence of humans or animals. It is a field of study in computer science that develops and studies intelligent machines. Such machines may be called AIs.
AI technology is widely used throughout industry, government, and science. Some high-profile applications are: advanced web search engines (e.g., Google Search), recommendation systems (used by YouTube, Amazon, and Netflix), understanding human speech (such as Google Assistant, Siri, and Alexa), self-driving cars (e.g., Waymo), generative and creative tools (ChatGPT and AI art), and superhuman play and analysis in strategy games (such as chess and Go).[1]
# ai에 대해 질문한다.
3
순서
4
상세
5
# 코랩 사용
https://colab.research.google.com/?hl=ko
6
# 여러 라이브러리 설치
# 텍스트 파일처럼 구조화 되지 않은 데이터를 다룰때 사용하는 라이브러리
!pip install unstructured
실행
ALT + ENTER
7
// 아래 오류 해결을 위해 openai 버전과 httpx 버전 변경함.
//TypeError: Client.__init__() got an unexpected keyword argument 'proxies'
!pip install --upgrade openai==1.55.3
!pip install --upgrade httpx==0.27.2
!pip install langchain_community
!pip install langchain-openai
!pip install chromadb
8
#AI 파일을 코랩이 올리자
6
# textloader를 통해 파일을 불러오자
from langchain.document_loaders import TextLoader
documents = TextLoader("ai.txt").load()
9
# 문장을 청크로 분할 하자
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 문서를 청크로 분할
def split_docs(documents,chunk_size=1000,chunk_overlap=20):
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
docs = text_splitter.split_documents(documents)
return docs
# docs 변수에 분할 문서를 저장
docs = split_docs(documents)
10
#OpenAI의 임베딩 모델 사용
from langchain_openai import OpenAIEmbeddings
api_key="sk-prfMLWHM_1ENA06iDl86IA"
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002", api_key=api_key)
# Chromdb에 벡터 저장, 저장 장소는 코랩
from langchain.vectorstores import Chroma
db = Chroma.from_documents(docs, embeddings, persist_directory="/")
11
from langchain.chat_models import ChatOpenAI
model_name = "gpt-3.5-turbo" #GPT-3.5-turbo 모델 사용
llm = ChatOpenAI(model_name=model_name, api_key=api_key)
# Q&A 체인을 사용하여 쿼리에 대한 답변 얻기
from langchain.chains.question_answering import load_qa_chain
chain = load_qa_chain(llm, chain_type="stuff",verbose=True)
# 쿼리를 작성하고 유사성 검색을 수행하여 답변을 생성,따라서 txt에 있는 내용을 질의해야 합니다
query = "AI란?"
matching_docs = db.similarity_search(query)
answer = chain.run(input_documents=matching_docs, question=query)
answer
12
> Entering new StuffDocumentsChain chain... > Entering new LLMChain chain... Prompt after formatting: System: Use the following pieces of context to answer the user's question. If you don't know the answer, just say that you don't know, don't try to make up an answer. ---------------- Artificial intelligence (AI) is the intelligence of machines or software, as opposed to :
:
:
optimization, formal logic, artificial neural networks, and methods based on statistics, operations research, and economics.[b] AI also draws upon psychology, linguistics, philosophy, neuroscience and other fields.[12] Human: AI란? > Finished chain. > Finished chain.
AI(Artificial Intelligence)란 기계나 소프트웨어의 지능을 말합니다. 이는 인간이나 동물의 지능과는 다른 것을 의미하며, 컴퓨터 과학 분야에서 개발되고 연구되는 지능 기계들을 가리킵니다. AI 기술은 산업, 정부, 과학 분야에서 널리 사용되며, 구글 검색, YouTube, 아마존, 넷플릭스 등의 추천 시스템, 구글 어시스턴트, Siri, Alexa와 같은 음성 인식, Waymo와 같은 자율 주행 자동차, ChatGPT, AI art 등의 창의적인 도구, 체스와 바둑과 같은 전략 게임에서의 초인간적인 플레이와 분석 등 다양한 분야에서 사용되고 있습니다.
앞으로 돌아가기
https://brunch.co.kr/@topasvga/3864
1
PDF파일을 요약해 주는 서비스.
웹페이지에 PDF를 올리면 요약해서 보여 준다.
2
# windows 10 pc에서
Anaconda Prompt 실행
jupyter notebook 사용
LLM으로 변경하자
!pip install langchain
!pip install streamlit
!pip install PyPDF2
!pip install langchain-openai
3
# 제공하는. py 파일로 실행.
# OPENAI API 키 변경 필요
#!/usr/bin/env python
# coding: utf-8
# In[1]:
#!pip install langchain
# In[2]:
#!pip install streamlit
# In[3]:
#!pip install PyPDF2
# In[4]:
#!pip install langchain-openai
# In[5]:
import os
from PyPDF2 import PdfReader
import streamlit as st
from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain import FAISS
from langchain.chains.question_answering import load_qa_chain
from langchain.chat_models import ChatOpenAI
from langchain.callbacks import get_openai_callback
api_key="sk-projfMLWHM_1ENA06iDl86IA"
def process_text(text):
#CharacterTextSplitter를 사용하여 텍스트를 청크로 분할
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=1000,
chunk_overlap=200,
length_function=len
)
chunks = text_splitter.split_text(text)
#임베딩 처리(벡터 변환), 임베딩은 OpenAI 모델을 사용합니다.
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002", api_key=api_key)
documents = FAISS.from_texts(chunks, embeddings)
return documents
def main(): #streamlit을 이용한 웹사이트 생성
st.title("�PDF 요약하기")
st.divider()
pdf = st.file_uploader('PDF파일을 업로드해주세요', type='pdf')
if pdf is not None:
pdf_reader = PdfReader(pdf)
text = "" # 텍스트 변수에 PDF 내용을 저장
for page in pdf_reader.pages:
text += page.extract_text()
documents = process_text(text)
query = "업로드된 PDF 파일의 내용을 약 3~5 문장으로 요약해 주세요." # LLM에 PDF파일 요약 요청
if query:
docs = documents.similarity_search(query)
llm = ChatOpenAI(model="gpt-3.5-turbo-16k", api_key=api_key, temperature=0.1)
chain = load_qa_chain(llm, chain_type='stuff')
with get_openai_callback() as cost:
response = chain.run(input_documents=docs, question=query)
print(cost)
st.subheader('--요약 결과--:')
st.write(response)
if __name__ == '__main__':
main()
# In[ ]:
https://github.com/gilbutITbook/080413/tree/main/%EC%8B%A4%EC%8A%B5/5%EC%9E%A5
3
아나콘다 프롬프트 실행
4
기본 라이블러리 설치
py 소스 파일 실행
cd c:\Users\seo\anaconda3\envs\llm\Scripts
streamlit run pd.py
1
내가 가진 PDF로 RAG 구성
RAG는 질문을 받으면 내가가진 PDF내용을 찾아보고 질문과 찾은 결과를 LLM에 제공하여 답변을 얻는다.
PDF 문서를 가져와 텍스트를 추춘하고 청크로 분할한다.
분할된 청크는 임베딩처리하고 파스(FAISS)에 저장
OPENAI API 키 변경하기!!!
# 하나의 질문에만 답하는 예제이다.
2
아나콘다 프롬프트
쥬피터 노트 사용
기본 OPENAI APIKEY 입력
도스창에서 제공하는 pdf.py 실행
c:\Users\seo\anaconda3\envs\llm\Scripts>streamlit run pdf.py
3
https://github.com/gilbutITbook/080413/tree/main/%EC%8B%A4%EC%8A%B5/5%EC%9E%A5
챗봇으로 올려진 PDF 파일 내용을 물어 보자.
pdf 내용 이외의 내용을 물어보자.
# pdf 내용 이외의 내용을 물어보자. = 답변을 하지 않는다.
1
대화형 챗봇을 만들어 보자.
가진 데이터를 활용한 챗봇
PDF파일 업로드 사용
PDF 안의 내용을 물어보면 답을 준다.
2
https://brunch.co.kr/@topasvga/4145
3
# Jupyter 노트 실행
!pip install streamlit-chat
!pip install streamlit
!pip install langchain
4
!pip install faiss-cpu
5
# OPENAI API 키 변경
import streamlit as st
from streamlit_chat import message
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.vectorstores import FAISS
import tempfile
from langchain.document_loaders import PyPDFLoader
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-jO-fMLWHM_1ENA06iDl86IA" #openai 키 입력
uploaded_file = st.sidebar.file_uploader("upload", type="pdf")
6
if uploaded_file :
with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
tmp_file.write(uploaded_file.getvalue())
tmp_file_path = tmp_file.name
loader = PyPDFLoader(tmp_file_path)
data = loader.load()
embeddings = OpenAIEmbeddings()
vectors = FAISS.from_documents(data, embeddings)
chain = ConversationalRetrievalChain.from_llm(llm = ChatOpenAI(temperature=0.0,model_name='gpt-4'), retriever=vectors.as_retriever())
def conversational_chat(query): #문맥 유지를 위해 과거 대화 저장 이력에 대한 처리
result = chain({"question": query, "chat_history": st.session_state['history']})
st.session_state['history'].append((query, result["answer"]))
return result["answer"]
if 'history' not in st.session_state:
st.session_state['history'] = []
if 'generated' not in st.session_state:
st.session_state['generated'] = ["안녕하세요! " + uploaded_file.name + "에 관해 질문주세요."]
if 'past' not in st.session_state:
st.session_state['past'] = ["안녕하세요!"]
#챗봇 이력에 대한 컨테이너
response_container = st.container()
#사용자가 입력한 문장에 대한 컨테이너
container = st.container()
with container: #대화 내용 저장(기억)
with st.form(key='Conv_Question', clear_on_submit=True):
user_input = st.text_input("Query:", placeholder="PDF파일에 대해 얘기해볼까요? (:", key='input')
submit_button = st.form_submit_button(label='Send')
if submit_button and user_input:
output = conversational_chat(user_input)
st.session_state['past'].append(user_input)
st.session_state['generated'].append(output)
if st.session_state['generated']:
with response_container:
for i in range(len(st.session_state['generated'])):
message(st.session_state["past"][i], is_user=True, key=str(i) + '_user', avatar_style = "fun-emoji", seed = "Nala")
message(st.session_state["generated"][i], key=str(i), avatar_style = "bottts", seed = "Fluffy")
7
!pip install pypdf
!pip install tiktoken
8
# 쥬피터 노트에서 라이블러리들 설치
# cmd 창
# py 파일을 실행시키면 동작한다.
c:\Users\seo\anaconda3\envs\llm\Scripts>streamlit run co.py
9
10
11
# 라이블러리들 설치 하지 않고 실행하면 아래처럼 모듈이 없다고 나온다.
ModuleNotFoundError: No module named 'streamlit_chat'
Traceback:
File "C:\Users\seo\anaconda3\Lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py", line 534, in _run_script exec(code, module.__dict__)
File "C:\0ai\co.py", line 32, in <module> from streamlit_chat import message
한글로 텍스트를 입력하면 번역해주는 서비스이다.
일본어, 중국어, 영어로 번역해주는 서비스이다.
1
번역 서비스?
번역을 원하는 텍스트를 입력한다.
번역을 원하는 언어를 선택 > 번역 클릭
번역된다.
2
https://brunch.co.kr/@topasvga/4145
#windows 에서
아나콘다 프롬프트 실행
3
주피터 노트북 실행
4
llm 지정
5
# 라이블러리들 설치
!pip install langchain
!pip install langchain_community
6
!pip install streamlit
7
!pip install openai
8
# OPENAPI AI 변경
import streamlit as st
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
import os
os.environ["OPENAI_API_KEY"] = "sk" #openai 키 입력
# 제공되는 py 소스 파일로 실행하면 잘된다.
9
# 웹페이지에 보여질 내용
langs = ["Korean", "Japanese", "chinese", "English"] #번역을 할 언어를 나열
left_co, cent_co,last_co = st.columns(3)
#웹페이지 왼쪽에 언어를 선택할 수 있는 라디오 버튼
with st.sidebar:
language = st.radio('번역을 원하는 언어를 선택해주세요.:', langs)
st.markdown('### 언어 번역 서비스예요~')
prompt = st.text_input('번역을 원하는 텍스트를 입력하세요') #사용자의 텍스트 입력
trans_template = PromptTemplate(
input_variables=['trans'],
template='Your task is to translate this text to ' + language + 'TEXT: {trans}'
) #해당 서비스가 번역에 대한 것임을 지시
#momory는 텍스트 저장 용도
memory = ConversationBufferMemory(input_key='trans', memory_key='chat_history')
llm = ChatOpenAI(temperature=0.0,model_name='gpt-4')
trans_chain = LLMChain(llm=llm, prompt=trans_template, verbose=True, output_key='translate', memory=memory)
# 프롬프트(trans_template)가 있으면 이를 처리하고 화면에 응답을 작성
if st.button("번역"):
if prompt:
response = trans_chain({'trans': prompt})
st.info(response['translate'])
10
c:\Users\seo\anaconda3\envs\llm\Scripts>streamlit run tr.py
# 쥬피터 노트북에서 라이블러리들 설치 하지 않고 실행하면 아래처럼 모듈이 없다고 나온다.
오류 내용 ?
2024-11-13 17:02:42.901 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. C:\Users\seo\AppData\Local\Temp\ipykernel_1040\496781053.py:20: LangChainDeprecationWarning: The class `ChatOpenAI` was deprecated in LangChain 0.0.10 and will be removed in 1.0. An updated version of the class exists in the langchain-openai package and should be used instead. To use it run `pip install -U langchain-openai` and import as `from langchain_openai import ChatOpenAI`. llm = ChatOpenAI(temperature=0.0,model_name='gpt-4')
11
# 쥬피터 노트북에서 라이블러리들 설치 하지 않고 실행하면 아래처럼 모듈이 없다고 나온다.
번역 서비스 py 파일 실행 오류
메일을 작성해주는 예제.
1
메일 작성서비스 ?
모임이 있어요 입력
[예제를 보여 주세요] 버튼을 클릭하면 이메일을 작성해주는 서비스를 만들자.
2
아나콘다 프롬프트
3
!pip install streamlit
!pip install langchain
!pip install openai
4
import streamlit as st
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-fMLWHM_1ENA06iDl86IA" #openai 키 입력
st.set_page_config(page_title="이메일 작성 서비스예요~", page_icon=":robot:")
st.header("이메일 작성기")
5
def getEmail():
input_text = st.text_area(label="메일 입력", label_visibility='collapsed',
placeholder="당신의 메일은...", key="input_text")
return input_text
input_text = getEmail()
6
# 이메일 변환 작업을 위한 템플릿 정의
query_template = """
메일을 작성해주세요.
아래는 이메일입니다:
이메일: {email}
"""
7
from langchain import PromptTemplate
# PromptTemplate 인스턴스 생성
prompt = PromptTemplate(
input_variables=["email"],
template=query_template,
)
8
from langchain.chat_models import ChatOpenAI
# 언어 모델을 호출합니다
def loadLanguageModel():
llm = ChatOpenAI(temperature=0.0,model_name='gpt-4')
return llm
9
# 예시 이메일을 표시
st.button("*예제를 보여주세요*", type='secondary', help="봇이 작성한 메일을 확인해보세요.")
st.markdown("### 봇이 작성한 메일은:")
if input_text:
llm = loadLanguageModel()
# PromptTemplate 및 언어 모델을 사용하여 이메일 형식을 지정
prompt_with_email = prompt.format(email=input_text)
formatted_email = llm.predict(prompt_with_email)
# 서식이 지정된 이메일 표시
st.write(formatted_email)
# 반응이 없다. 정상.
10
# 주피터 노트에서 .py 확장자료 다운 받자. = File > Save and Export Notebook > Executable Scropt 선택
11
도스창에서
streamlit run em3.py
실행하자.
12
원본 오류 , 수정함!!
# 제공하는 email.py에서 get_ipy 부분 삭제 - 불필요하게 들어가 있음.
CSV 파일(Excel)파일을 읽고 , 원하는 것을 묻고 답변을 받는 서비스
1
가상환경 하나 추가로 만들자
판다스 사용하려 한다. = 파이썬 3.9 이상에서 동작한다.
2
Windows에서 아나콘다 프롬프트 실행
3
conda create -n llm2 python=3.9
activate llm2
pip install ipykernel
python -m ipykernel install --user --name llm39 --display-name "llm39"
jupyter notebook
4
NEW > llm39 선택하여 사용
5
# 라이브러리 설치하자.
# langchain-experimental 는 판다스 사용을 위해 필요하다.
!pip install langchain-experimental
!pip install tabulate
!pip install pandas
!pip install openai
6
# CSV 파일을 C:/data 폴더에 넣어두자.
CSV파일의 형식은 다음과 같다.
import pandas as pd #파이썬 언어로 작성된 데이터를 분석 및 조작하기 위한 라이브러리
#csv 파일을 데이터프레임으로 가져오기
df = pd.read_csv('c:/data/booksv_02.csv') #booksv_02.csv 파일이 위치한 경로 지정
df.head()
결과
7
# OPENAI API 키 입력하기
from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent
from langchain.chat_models import ChatOpenAI
from langchain.agents.agent_types import AgentType
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-febmAeqQRjKvXZvNA06iDl86IA" #openai 키 입력
#에이전트 생성
agent = create_pandas_dataframe_agent(
ChatOpenAI(temperature=0, model='gpt-4o'), #gpt-3.5-turbo 사용
df, #데이터가 담긴 곳
verbose=False, #추론 과정을 출력하지 않음
agent_type=AgentType.OPENAI_FUNCTIONS,
allow_dangerous_code=True,
)
8
결과 확인 ?
# 카운트 높은것에 대해 문의 , 가장 최근 출간된 책 문의
agent.run('어떤 제품의 ratings_count가 제일 높아?')
agent.run('가장 최근에 출간된 책은?')
9
# 소스 모음
https://github.com/gilbutITbook/080413/tree/main/%EC%8B%A4%EC%8A%B5/5%EC%9E%A5
1
기존 상담원에서 바뀐 화장품에 대한 추가 교육
신규 입사한 상담원에게 이전 버전과 바뀐 버전에 대한 교육필요로 비용,시간 부담 가중
LLM을 이용해 스크립트 생성
동작)
xx 상품에 대해 이전 버전과 비교 설명해줘?
화장품 DB에서 검색
검색 결과 반환
질문 +검색 결과 반환 로 LLM에 문의
스크립트 생성
상담원이 스크립트 보고 답변함.
2
동작)
최근 유행하는 청바지는? 묻는다.
검색 엔진을 통해 가장 많이 팔린 청바지 확인.
최근 유행하는 청바지 + 검색 엔진을 통해 가장 많이 팔린 청바지 확인. 으로 질문
LLM이 답변한다.
3
보험료, 가입 조건을 결정해 계약의 승낙/거절 여부를 판단.
동작)
보험 가입 여부 질의 - 사용자 정보 확인 (질병여부, 최근 3년내 보험금 지급내역 등)- 질문 + 검색결과 - 가입?
다음
https://brunch.co.kr/@topasvga/3865