1. PDF 기반 학습 챗봇
예시 1)
# 필요한 패키지들 설치해줌
!pip install langchain_community
!pip install pypdf
!pip install tiktoken
!pip install faiss-cpu
예시 2)
# PyPDFLoader를 import 해줌
from langchain_community.document_loaders import PyPDFLoader
예시 3)
api_key='sk-API키' #OPEN AI를 위해 API KEY를 설정
pdf_filepath= '/content/차세대 한국형 스마트팜 개발.pdf' # PDF 파일의 경로를 지정
loader = PyPDFLoader(pdf_filepath) # 지정된 PDF 파일 경로를 기반으로 PyPDFLoader 객체를 생성
data = loader.load() # PDF 파일의 내용을 로드하여 data 변수에 저장
api_key = 'sk-API키'
pdf_filepath = '/content/차세대 한국형 스마트팜 개발.pdf'
loader = PyPDFLoader(pdf_filepath)
data = loader.load()
예시 4)
# langchain.text_splitter 모듈에서 텍스트를 분할하는 데 사용되는 CharacterTextSplitter 클래스를 임포트
from langchain.text_splitter import CharacterTextSplitter
예시 5)
# CharacterTextSplitter를 사용하여 문서를 작은 조각들로 분할
# chunk_size는 각 청크의 최대 문자 수를 1000자로 지정
# chunk_overlap은 인접한 청크 간에 200자의 중복을 허용하여 문맥의 연속성을 유지
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
# 기존에 로드한 PDF 데이터(data)를 분할하여, 각각의 문서 조각으로 나눔
data = text_splitter.split_documents(data)
예시 6)
# OpenAI의 임베딩 모델을 사용하여 텍스트를 벡터로 변환하기 위한 클래스를 불러옴
from langchain.embeddings.openai import OpenAIEmbeddings
# 'text-embedding-ada-002' 모델을 사용하여 OpenAI 임베딩 인스턴스를 생성
# 이때 api_key를 통해 OpenAI API에 인증을 진행
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002", api_key=api_key)
-->
<ipython-input-7-3f9102034340>:3: 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 :class:`~langchain-openai package and should be used instead. To use it run `pip install -U :class:`~langchain-openai` and import as `from :class:`~langchain_openai import OpenAIEmbeddings``.
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002", api_key=api_key)
예시 7)
# FAISS 모듈을 사용하여 벡터스토어를 생성
from langchain.vectorstores import FAISS
# FAISS의 from_documents 메서드를 이용해, 분할된 문서 데이터와 임베딩을 활용하여 벡터스토어를 생성
# 이 벡터스토어는 나중에 문서의 벡터 간 유사도 검색 등을 위해 사용됨
vectorstore = FAISS.from_documents(data, embeddings)
예시 8)
# ChatOpenAI 클래스를 사용하여 OpenAI의 대화형 모델(gpt-3.5-turbo)을 초기화
# temperature=0은 모델의 응답을 보다 결정적이고 일관되게 만들어 창의적 요소를 최소화
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0, api_key=api_key)
--->
<ipython-input-9-64120722ad71>:3: 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 :class:`~langchain-openai package and should be used instead. To use it run `pip install -U :class:`~langchain-openai` and import as `from :class:`~langchain_openai import ChatOpenAI``.
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0, api_key=api_key)
예시 9)
# ConversationBufferMemory는 대화의 문맥(대화 내역)을 저장하고 관리하는 역할을 함
from langchain.memory import ConversationBufferMemory
# ConversationBufferMemory 인스턴스를 생성
# memory_key는 저장된 대화 내역을 참조하는 데 사용할 키이며, 여기서는 'chat_history'로 지정
# return_messages=True는 대화 기록을 메시지 형식으로 반환하도록 설정
# 이후 체인 또는 모델에 이 대화 기록을 문맥으로 제공할 수 있게 함
memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True)
--->
<ipython-input-11-1d2c96308ff0>:3: LangChainDeprecationWarning: Please see the migration guide at: https://python.langchain.com/docs/versions/migrating_memory/
memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True)
예시 10)
from langchain.chains import ConversationalRetrievalChain
# 이 체인은 사용자의 질문에 대해 관련 문서를 검색(retriever)
# 이전 대화 기록(memory)을 참조하여 문맥에 맞는 응답을 생성하는 대화형 체인
# chain_type="stuff"는 검색된 모든 문서를 한 번에 LLM에 제공하는 방식을 의미
# retriever=vectorstore.as_retriever()를 통해 FAISS 벡터스토어를 검색 기능으로 변환
# memory는 이전 대화 내역을 저장하는 ConversationBufferMemory 인스턴스
conversation_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(),
memory=memory
)
예시 11)
# query 변수에 "한국형 스마트팜이란?"이라는 질문을 저장
query = "한국형 스마트팜이란?"
# conversation_chain에 질문을 전달하면, 관련 문서를 검색하고 대화의 문맥(메모리)를 고려하여 응답을 생성
result = conversation_chain({"question": query})
# 생성된 결과(result)는 딕셔너리 형태이며, "answer" 키에 응답 텍스트가 포함
answer = result["answer"]
answer
-->
한국형 스마트팜은 사물인터넷, 빅데이터, 인공지능, 로봇 등의 첨단 기술을 활용하여 농산물의 생육환경을 최적화하고 노동력을 절감하며 생산성을 향상시키는 효율적인 농업 형태를 말합니다. 한국형 스마트팜은 한국의 농업 환경과 상황에 맞춰 독자적인 농업 생산기술을 개발하여 국내외에서 경쟁력을 확보하는 것을 목표로 합니다. 이를 통해 농가 소득 향상과 농업 기술의 국제경쟁력 강화를 도모하고 있습니다.
예시 12)
# query 변수에 "스마트팜 농가의 통합관리 및 유지보수가 어려운 이유는?"라는 질문을 저장
query = "스마트팜 농가의 통합관리 및 유지보수가 어려운 이유는?"
# conversation_chain에 질문을 전달하면, 관련 문서를 검색하고 대화의 문맥(메모리)을 고려하여 응답을 생성
result = conversation_chain({"question": query})
# 생성된 결과는 딕셔너리 형태이며, "answer" 키에 응답 텍스트가 저장
answer = result["answer"]
answer
-->
스마트팜 농가의 통합관리 및 유지보수가 어려운 이유는 현재까지 보급되고 있는 ICT 기기들이 업체마다 제품의 규격이 달라서 서로 호환되지 않기 때문입니다. 이로 인해 스마트팜 농가에서 다양한 ICT 기기를 사용할 때 통합관리와 유지보수가 어려워지는 문제가 발생하고 있습니다.
## Gradio를 이용한 챗봇 만들기
예시 1)
# gradio 패키지 설치
!pip install gradio
예시 2)
import gradio as gr
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
import os
# OpenAI API 키 설정 (환경 변수 또는 직접 입력)
os.environ["OPENAI_API_KEY"] = api_key # 여기에 OpenAI API 키를 입력하세요
# 프롬프트 템플릿 설정
prompt = PromptTemplate(
input_variables=["chat_history", "question"],
template="""You are an AI assistant. You are
currently having a conversation with a human. Answer the questions.
chat_history: {chat_history},
Human: {question}
AI:"""
)
# LLM 모델 설정
llm = ChatOpenAI(
# 창의성 설정
# (0: 같은 입력에 대해 같은 출력 생성)
# 0.1~0.3 : 응답이 일관적이고, 창의성이 적음(사실 기반)
# 0.4~ 0.7 : 중간정도의 창의성
# 1.1~2.0 : 랜덤한 응답, 사실성이 매우 떨어짐
temperature=0,
model_name='gpt-4o-mini-2024-07-18' # 모델명
)
# 최신 메모리 사용 방식 적용 (ConversationBufferWindowMemory 제거)
# chat_history : 화면에 구성할 문자열을 연결하여 출력함
def chat_with_ai(user_input, history):
"""사용자 입력을 받아 AI 응답을 반환하는 함수."""
chat_history = "\n".join([f"Human: {h['content']}" if h['role'] == 'user' else f"AI: {h['content']}" for h in history])
response = (prompt | llm).invoke({"chat_history": chat_history, "question": user_input}).content
return {"role": "assistant", "content": response}
# Gradio 인터페이스 설정
demo = gr.ChatInterface(chat_with_ai, type="messages")
demo.launch(share=True, debug=True)
--->
물어보면 답변을 이런식으로 해준다.
Gradio를 활용하여 챗봇을 만들면 구현을 쉽게 할수가 있다
728x90
LIST
'자연어 처리 > 자연어 처리' 카테고리의 다른 글
14. 벡터 데이터베이스 (4) | 2025.02.19 |
---|---|
13. RAG (2) | 2025.02.17 |
12. 사전 학습된 언어 모델(PML) (4) | 2025.02.13 |
11. 트랜스포머 (2) | 2025.02.12 |
10. 어텐션 메커니즘 (1) | 2025.02.12 |