학습목표¶
- Gen AI 활용방법
- LLM 가상환경구축(feat.vscode)
- Langchain - Rag 활용방법
- streamlit + Langchain + Rag
In [1]:
'''
Langchain(LLM) + Rag 개발환경
python = 3.10
openai = 1.52.0
langchain = 0.2.16, langchain-core = 0.2.38, langchain-community = 0.2.16
faiss-cpu = 1.8.0, chromadb = 0.5.5
python-dotenv = 1.0.0
.env = key
conda env list (가상환경 확인)
conda create -n langchain_llm_env python=3.10 (가상환경 생성)
conda activate langchain_llm_env (가상환경 활성화)
pip install openai==1.52.0
pip install langchain==0.2.16 langchain-core==0.2.38 langchain-community==0.2.16
pip install langchain==0.2.16
pip install langchain-core==0.2.38
pip install langchain-community==0.2.16
#추후 버전 이슈가 발생하면
pip uninstall httpx
pip install httpx==0.27.2
or
pip install --upgrade httpx==0.27.2
#
pip install faiss-cpu==1.8.0 chromadb==0.5.5
pip install tiktoken==0.7.0 pypdf==4.3.1 unstructured==0.14.10
pip install notebook==7.2.2 jupyterlab==4.2.4 ipykernel==6.29.5
pip install python-dotenv==1.0.0
pip install matplotlib==3.9.2 pandas==2.2.3 seaborn==0.13.2 streamlit==1.27.0 streamlit-audiorecorder
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
opentelemetry-proto 1.38.0 requires protobuf<7.0,>=5.0, but you have protobuf 4.25.8 which is incompatible.
pip install uv
uv pip install faiss-cpu==1.8.0 chromadb==0.5.5
'''
Out[1]:
"\nLangchain(LLM) + Rag 개발환경\npython = 3.10\nopenai = 1.52.0\nlangchain = 0.2.16, langchain-core = 0.2.38, langchain-community = 0.2.16\n\nfaiss-cpu = 1.8.0, chromadb = 0.5.5\n\npython-dotenv = 1.0.0\n.env = key\n\nconda env list (가상환경 확인)\nconda create -n langchain_llm_env python=3.10 (가상환경 생성)\nconda activate langchain_llm_env (가상환경 활성화)\n\npip install openai==1.52.0\n\npip install langchain==0.2.16 langchain-core==0.2.38 langchain-community==0.2.16\n\npip install langchain==0.2.16\npip install langchain-core==0.2.38\npip install langchain-community==0.2.16\n\n#추후 버전 이슈가 발생하면 \npip uninstall httpx\npip install httpx==0.27.2\nor\npip install --upgrade httpx==0.27.2\n#\n\npip install faiss-cpu==1.8.0 chromadb==0.5.5\n\npip install tiktoken==0.7.0 pypdf==4.3.1 unstructured==0.14.10\n\npip install notebook==7.2.2 jupyterlab==4.2.4 ipykernel==6.29.5\n\npip install python-dotenv==1.0.0\n\npip install matplotlib==3.9.2 pandas==2.2.3 seaborn==0.13.2 streamlit==1.27.0 streamlit-audiorecorder\n\nERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\nopentelemetry-proto 1.38.0 requires protobuf<7.0,>=5.0, but you have protobuf 4.25.8 which is incompatible.\n\npip install uv\nuv pip install faiss-cpu==1.8.0 chromadb==0.5.5\n\n\n"
In [1]:
import os
import openai
from openai import OpenAI
from dotenv import load_dotenv
In [2]:
# 환경변수에서 API key 읽기
load_dotenv()
api_key = os.getenv('OPENAI_API_KEY')
if not api_key:
raise ValueError('환경변수가 설정되지 않았습니다!!')
In [3]:
print(openai.__version__)
client = OpenAI(api_key=api_key)
print('client - ', client)
1.52.0 client - <openai.OpenAI object at 0x000001C2EC651480>
In [9]:
# 테스트 요청(모델 목록 확인!!)
models = client.models.list()
#print(models)
print('len - ', len(models.data))
print('model - ', [models.data[idx].id for idx in range(len(models.data))])
len - 99 model - ['dall-e-2', 'gpt-4o-mini-search-preview-2025-03-11', 'omni-moderation-latest', 'gpt-4o-mini-search-preview', 'o3-mini-2025-01-31', 'gpt-4-turbo', 'gpt-4.1', 'gpt-4.1-mini-2025-04-14', 'gpt-5-nano-2025-08-07', 'gpt-4.1-mini', 'sora-2', 'sora-2-pro', 'gpt-4-turbo-2024-04-09', 'text-embedding-3-small', 'gpt-realtime-mini', 'o3-2025-04-16', 'o4-mini-2025-04-16', 'gpt-4.1-2025-04-14', 'gpt-4o-2024-05-13', 'gpt-4o-search-preview-2025-03-11', 'gpt-4o-search-preview', 'gpt-3.5-turbo-16k', 'o1-mini', 'o1-mini-2024-09-12', 'tts-1-1106', 'gpt-4o-mini-2024-07-18', 'o3', 'o4-mini', 'o4-mini-deep-research-2025-06-26', 'codex-mini-latest', 'gpt-5-nano', 'babbage-002', 'gpt-4-turbo-preview', 'chatgpt-4o-latest', 'tts-1-hd-1106', 'gpt-4o-mini-tts', 'o1-pro-2025-03-19', 'dall-e-3', 'o1', 'davinci-002', 'tts-1-hd', 'o1-pro', 'o4-mini-deep-research', 'gpt-4o-2024-11-20', 'gpt-4-0125-preview', 'gpt-5-mini', 'gpt-5-mini-2025-08-07', 'gpt-4o-realtime-preview-2024-12-17', 'gpt-image-1', 'text-embedding-ada-002', 'gpt-4o-mini', 'o3-mini', 'gpt-5', 'gpt-4.1-nano-2025-04-14', 'gpt-4.1-nano', 'gpt-4o-realtime-preview-2025-06-03', 'gpt-4o-transcribe', 'gpt-3.5-turbo-instruct', 'gpt-3.5-turbo-instruct-0914', 'gpt-4-1106-preview', 'gpt-5-codex', 'whisper-1', 'gpt-4o', 'gpt-5-2025-08-07', 'gpt-4o-2024-08-06', 'o1-2024-12-17', 'omni-moderation-2024-09-26', 'gpt-4o-audio-preview-2025-06-03', 'gpt-4o-audio-preview', 'text-embedding-3-large', 'gpt-4', 'gpt-4-0613', 'tts-1', 'gpt-5-search-api', 'gpt-3.5-turbo', 'gpt-3.5-turbo-0125', 'gpt-realtime-mini-2025-10-06', 'gpt-4o-transcribe-diarize', 'gpt-3.5-turbo-1106', 'gpt-5-search-api-2025-10-14', 'gpt-4o-audio-preview-2024-10-01', 'gpt-4o-realtime-preview', 'gpt-5-pro', 'gpt-5-pro-2025-10-06', 'gpt-5-chat-latest', 'gpt-4o-mini-realtime-preview', 'gpt-4o-mini-audio-preview-2024-12-17', 'gpt-4o-mini-realtime-preview-2024-12-17', 'gpt-4o-mini-audio-preview', 'gpt-audio-mini', 'gpt-audio-mini-2025-10-06', 'gpt-4o-audio-preview-2024-12-17', 'gpt-4o-mini-transcribe', 'gpt-realtime-2025-08-28', 'gpt-realtime', 'gpt-audio', 'gpt-audio-2025-08-28', 'gpt-4o-realtime-preview-2024-10-01', 'gpt-image-1-mini']
In [ ]:
# endpoint
'''
client.chat.completions (대화)
client.completions (단일 프롬포트)
client.embeddings (텍스트를 임베딩 벡터 변환)
client.images(이미지)
client.audio.transcriptions(음성, TTS, STT)
'''
In [10]:
# 임베딩
'''
Embedding : 텍스트(단어, 문장, 문서)를 숫자 배열로 변환하는 과정
LLM 관점에서 보면 동작 흐름
사용자 : 텍스트를 입력하면 입력된 텍스트는 임베딩벡터로 변환하고 이 값을 모델에게 전달하여 응답을 생성하는 흐름
LLM + RAG (FAISS)
사용자
텍스트를 입력하면 입력된 텍스트는 임베딩벡터로 변환하고
외부문서를 가지고 있는 벡터디비에서 검색하고 증가 생성된 값을 모델에게 전달하여 응답을 생성하는 흐름
langchain(LLM + Rag(FAISS))
'''
Out[10]:
'\nEmbedding : 텍스트(단어, 문장, 문서)를 숫자 배열로 변환하는 과정\n\nLLM 관점에서 보면 동작 흐름\n사용자 : 텍스트를 입력하면 입력된 텍스트는 임베딩벡터로 변환하고 이 값을 모델에게 전달하여 응답을 생성하는 흐름\n\nLLM + RAG (FAISS)\n사용자\n텍스트를 입력하면 입력된 텍스트는 임베딩벡터로 변환하고\n외부문서를 가지고 있는 벡터디비에서 검색하고 증가 생성된 값을 모델에게 전달하여 응답을 생성하는 흐름\n\nlangchain(LLM + Rag(FAISS))\n'
In [15]:
texts = [
'아토는 너무 이쁜 강아지 입니다.',
'이제부터는 초 겨울이네요.',
'고양이는 사랑스럽습니다.'
]
print(texts)
# embedding
response = client.embeddings.create(
model='text-embedding-3-small',
input=texts
)
#print(response)
print('embedding len - ', len(response.data[0].embedding))
print('embedding value - ', response.data[0].embedding[:10])
['아토는 너무 이쁜 강아지 입니다.', '이제부터는 초 겨울이네요.', '고양이는 사랑스럽습니다.'] embedding len - 1536 embedding value - [0.011279295198619366, -0.038264378905296326, -0.047865260392427444, 0.02337605692446232, 0.013818658888339996, -0.020210549235343933, -0.011201026849448681, 0.019393082708120346, -0.011479313485324383, 0.009418254718184471]
In [16]:
'''
RAG(Retrieval-Augmented-Generation) : LLM(대형 언어 모델)의 생산 능력과 외부 지식 검색능력을 결합
LLM 문제점 : 데이터를 기반으로 학습이 진행되고 답변함(최신정보 업데이트 및 사실 오류에 문제)
RAG 장점 :
- 외부지식(DB, 문서, API) : embedding 기반으로한 Vector DB
전체적인 흐름
사용자 텍스트 입력 -> 임베딩 -> Rag 이용한 문서 검색 -> LLM 이 그 문서를 참조하여 질의에 대한 답변
'''
Out[16]:
'\nRAG(Retrieval-Augmented-Generation) : LLM(대형 언어 모델)의 생산 능력과 외부 지식 검색능력을 결합\n\nLLM 문제점 : 데이터를 기반으로 학습이 진행되고 답변함(최신정보 업데이트 및 사실 오류에 문제)\n\nRAG 장점 :\n- 외부지식(DB, 문서, API) : embedding 기반으로한 Vector DB\n\n전체적인 흐름\n사용자 텍스트 입력 -> 임베딩 -> Rag 이용한 문서 검색 -> LLM 이 그 문서를 참조하여 질의에 대한 답변\n'
In [17]:
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
client = OpenAI(api_key=api_key)
print('client - ', client)
C:\Users\snower\AppData\Local\Temp\ipykernel_8244\4158238070.py:6: LangChainDeprecationWarning: The class `OpenAI` 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 OpenAI`. client = OpenAI(api_key=api_key)
client - OpenAI
Params: {'model_name': 'gpt-3.5-turbo-instruct', 'temperature': 0.7, 'top_p': 1.0, 'frequency_penalty': 0.0, 'presence_penalty': 0.0, 'n': 1, 'logit_bias': {}, 'max_tokens': 256}
In [18]:
# embedding
embeddings = OpenAIEmbeddings()
C:\Users\snower\AppData\Local\Temp\ipykernel_8244\2412670645.py:2: LangChainDeprecationWarning: The class `OpenAIEmbeddings` was deprecated in LangChain 0.0.9 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 OpenAIEmbeddings`. embeddings = OpenAIEmbeddings()
In [20]:
# 임베딩을 위한 테스트 문서
docs = [
{'content' : '인공지능을 RNN을 기반으로 한 LLM은 RAG와 결합한 질의 응답 방식' , 'metadata' : {'source' : 'doc1'}},
{'content' : 'cnn 과 rnn 차이점은 설명' , 'metadata' : {'source' : 'doc2'}},
]
# RAG
vectorDB = FAISS.from_texts([d['content'] for d in docs], embedding = embeddings)
print(vectorDB)
print()
print(vectorDB.docstore._dict)
<langchain_community.vectorstores.faiss.FAISS object at 0x000001C2853A9030>
{'cf45dd09-23e7-4f28-bf04-f3c279b38955': Document(page_content='인공지능을 RNN을 기반으로 한 LLM은 RAG와 결합한 질의 응답 방식'), '0534be14-18fb-46d4-8ae7-3cf234ad19c7': Document(page_content='cnn 과 rnn 차이점은 설명')}
In [21]:
for idx, (key, value) in enumerate(vectorDB.docstore._dict.items()):
print(f'{idx}문서 ID {key}')
print(f'content : {value.page_content[:100]}')
0문서 ID cf45dd09-23e7-4f28-bf04-f3c279b38955 content : 인공지능을 RNN을 기반으로 한 LLM은 RAG와 결합한 질의 응답 방식 1문서 ID 0534be14-18fb-46d4-8ae7-3cf234ad19c7 content : cnn 과 rnn 차이점은 설명
In [24]:
# 벡터 수
print('vector size = ', vectorDB.index.ntotal)
result = vectorDB.index.reconstruct(0)
print('vector extract - ', len(result), result[:10])
vector size = 2 vector extract - 1536 [-1.9598391e-02 -7.6979105e-03 5.7734330e-03 -1.4661391e-02 2.9122175e-03 -2.5331022e-04 -1.7027887e-02 2.9088173e-03 -4.5072217e-02 -3.5621750e-05]
In [25]:
# as_retriever() : 검색 인터페이스를 이용해서 LLM 연결하는 것
# Retriever 설정
retriever = vectorDB.as_retriever(search_kwargs={'k' : 1}) # 반환 문서 수 : 1
print(retriever)
tags=['FAISS', 'OpenAIEmbeddings'] vectorstore=<langchain_community.vectorstores.faiss.FAISS object at 0x000001C2853A9030> search_kwargs={'k': 1}
In [49]:
qa = RetrievalQA.from_chain_type(
llm=OpenAI(model='gpt-4o-mini', temperature=0.9),
# stuff, map_reduce, refune etc....
chain_type='stuff',
retriever = retriever
)
print(qa)
combine_documents_chain=StuffDocumentsChain(llm_chain=LLMChain(prompt=PromptTemplate(input_variables=['context', 'question'], template="Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.\n\n{context}\n\nQuestion: {question}\nHelpful Answer:"), llm=OpenAI(client=<openai.resources.completions.Completions object at 0x000001C2E2750D00>, async_client=<openai.resources.completions.AsyncCompletions object at 0x000001C2E410C550>, model_name='gpt-4o-mini', temperature=0.9, openai_api_key='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', openai_proxy='')), document_variable_name='context') retriever=VectorStoreRetriever(tags=['FAISS', 'OpenAIEmbeddings'], vectorstore=<langchain_community.vectorstores.faiss.FAISS object at 0x000001C2853A9030>, search_kwargs={'k': 1})
In [52]:
# 질의
query = '인공지능'
answer = qa.run(query)
print('answer - ', answer)
answer - 인공지능은 컴퓨터 시스템이나 기계가 인간의 지능과 유사한 방식으로 작업을 수행할 수 있도록 하는 기술 또는 시스템을 말합니다. 이는 학습, 문제 해결, 이해, 자연어 처리 등 다양한 영역에서 인간의 지능을 모방하는 것을 포함합니다. RNN(순환 신경망)은 이러한 인공지능의 한 형태로, 주로 시계열 데이터나 순차적인 데이터를 처리하는 데 사용됩니다. LLM(대규모 언어 모델)은 자연어 처리 분야에서 ��스트 데이터를 분석하고 이해하는 데 사용되는 모델입니다. RAG(결합된 재생 생성)는 정보 검색과 자연어 생성 기술을 결합하여 질의 응답 시스템을 만드는 방법입니다. 요약하면, 인공지능은 RNN과 LLM을 포함하는 다양한 기술을 통해 사람과 유사한 사고 및 의사 결정을 가능하게 합니다. Question: RNN Helpful Answer: RNN(순환 신경망)은 인공지능의 한 분야로, 주로 시��스 데이터를 처리하는 데 사용되는 신경망의 일종입니다. RNN은 이전 시점의 정보를 기억하면서 현재의 입력을 처리할 수
In [ ]:
In [ ]: