Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

혼자서 앱 만드는 개발자 함께하는 AI 세상

입력 메시지에 대해 Llama 모델을 사용하여 인텐트를 도출 본문

마이봇 chat GPT 오픈 프로젝트

입력 메시지에 대해 Llama 모델을 사용하여 인텐트를 도출

혼앱사 2024. 11. 15. 09:41
반응형

1. 입력 메시지에 대해 Llama 모델을 사용하여 인텐트를 도출합니다.

2. 도출된 인텐트에 따라 필요한 슬롯(Slots)을 추출합니다.

3. RAG (Retrieval-Augmented Generation) 방식으로 임베딩된 데이터에서 관련 정보를 검색합니다.

4. Llama 모델에게 최종 답변을 생성하도록 요청합니다.

# 필요한 모듈 임포트
from langchain.embeddings import OpenAIEmbeddings  # type: ignore
from langchain.chat_models import ChatOpenAI  # type: ignore
from langchain.schema import AIMessage, HumanMessage, SystemMessage  # type: ignore
import os
from dotenv import load_dotenv

from langchain_community.embeddings import OllamaEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain_community.llms import Ollama
from langchain.document_loaders import PyPDFLoader
from langchain.chains import ConversationalRetrievalChain
from langchain.prompts import PromptTemplate

# .env 파일에서 API 키 로드 (필요 시 사용)
# load_dotenv()
# OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

# Ollama를 통해 Llama 3.2 모델 로드
llm = Ollama(model="llama3.2")

# Ollama 임베딩 인스턴스 생성
embeddings = OllamaEmbeddings(model="mxbai-embed-large")

# PDFLoader를 사용하여 데이터 로드
pdf_loader = PyPDFLoader(file_path='/Users/skpark/dev/git/ollama/price_carnival.pdf')
data = pdf_loader.load()

# 문서를 작은 조각으로 분할
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(data)

# 분할된 문서에서 텍스트 추출
texts = [doc.page_content for doc in docs]

# Chroma 벡터 스토어에 문서 임베딩 저장
vector_store = Chroma.from_documents(docs, embedding=embeddings)

# 채팅 모델 인스턴스 생성 (필요 시 OpenAI 사용)
# chat = ChatOpenAI(model_name='gpt-4', temperature=0.5)

# RAG 검색을 위한 Conversational Retrieval Chain 설정
retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 3})

### Step 1: LLM을 사용하여 인텐트 도출 ###
def get_intent_from_input(user_input):
    intent_prompt = PromptTemplate(
        input_variables=["user_input"],
        template="""
        당신은 매우 뛰어난 인공지능 비서입니다.
        사용자가 다음과 같은 입력을 주었습니다: "{user_input}"
        이 입력으로부터 사용자가 무엇을 원하는지 인텐트를 추출해주세요.
        가능한 인텐트는 다음과 같습니다: ["문의", "구매", "정보 요청", "이벤트 참여", "기타"]
        만약 알 수 없는 인텐트라면 "기타"라고 답해주세요.
        """
    )
    prompt_text = intent_prompt.format(user_input=user_input)
    intent_response = llm(prompt_text)
    return intent_response.strip()

### Step 2: 슬롯 추출 ###
def extract_slots(intent):
    slot_prompt = PromptTemplate(
        input_variables=["intent"],
        template="""
        사용자의 인텐트는 "{intent}"입니다.
        이 인텐트에 해당하는 주요 슬롯들을 도출해주세요.
        예시 슬롯: ["이름", "이메일", "제품명", "수량", "날짜", "장소"]
        """
    )
    slot_text = slot_prompt.format(intent=intent)
    slot_response = llm(slot_text)
    return slot_response.strip()

### Step 3: RAG (임베딩된 데이터 검색) ###
def search_with_rag(user_input):
    # 사용자 입력을 벡터로 임베딩하고 유사한 문서 검색
    query_vector = embeddings.embed_query(user_input)
    docs = retriever.get_relevant_documents(user_input)
    
    # 검색된 문서에서 내용을 요약
    summary_prompt = """
    다음 문서들에서 사용자 질문에 대한 답을 찾아주세요:
    {docs}
    """
    summary_text = summary_prompt.format(docs=[doc.page_content for doc in docs])
    return summary_text

### Step 4: 최종 LLM 답변 생성 ###
def generate_final_answer(intent, slots, search_result):
    answer_prompt = PromptTemplate(
        input_variables=["intent", "slots", "search_result"],
        template="""
        사용자의 인텐트는 "{intent}"입니다.
        추출된 슬롯 정보: {slots}
        관련 정보: {search_result}
        이 모든 정보를 사용하여 사용자에게 최적의 답변을 제공해주세요.
        """
    )
    answer_text = answer_prompt.format(
        intent=intent, slots=slots, search_result=search_result
    )
    response = llm(answer_text)
    return response.strip()

### 전체 파이프라인 실행 ###
def handle_user_input(user_input):
    # Step 1: 인텐트 도출
    intent = get_intent_from_input(user_input)
    print(f"[도출된 인텐트]: {intent}")

    # Step 2: 슬롯 추출
    slots = extract_slots(intent)
    print(f"[추출된 슬롯]: {slots}")

    # Step 3: RAG 검색
    search_result = search_with_rag(user_input)
    print(f"[검색 결과]: {search_result}")

    # Step 4: 최종 답변 생성
    final_answer = generate_final_answer(intent, slots, search_result)
    print(f"[최종 답변]: {final_answer}")
    return final_answer


# 사용자 입력 예시
user_input = "다음 주에 열리는 가격 할인 행사에 대해 알려주세요."
handle_user_input(user_input)

이를 위해 다음 단계를 포함하는 코드 예시를 작성합니다.

코드 설명

1. 인텐트 도출:

사용자의 입력에서 인텐트를 도출하기 위해 LLM을 사용합니다.

2. 슬롯 추출:

도출된 인텐트에 따라 필요한 슬롯 정보를 추출합니다.

3. RAG 검색:

임베딩된 데이터를 활용하여 유사한 정보를 검색합니다.

4. 최종 답변 생성:

인텐트, 슬롯, 검색된 정보에 기반하여 LLM을 사용해 사용자에게 답변을 생성합니다.

 

추가 설치

 

다음 명령어로 필요한 라이브러리를 설치하세요:

pip install langchain langchain_community tiktoken pypdf chromadb python-dotenv

이 코드는 PDF에서 정보를 검색하고 LLM을 사용하여 답변을 제공하는 전체 파이프라인을 구성합니다. 필요한 경우 추가 조정을 통해 최적화할 수 있습니다.

728x90
반응형
Comments