LLM_test / app.py.bak
Minhoon's picture
Rename app.py.bal to app.py.bak
996c437 verified
raw
history blame contribute delete
5.46 kB
import gradio as gr
import tempfile, os, shutil
import requests, json, uuid, time, asyncio
from typing import Any, List
from pydantic import PrivateAttr
# llama-index κ΄€λ ¨ μž„ν¬νŠΈ
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.core.chat_engine import CondenseQuestionChatEngine
from llama_index.core.llms import CustomLLM, CompletionResponse, CompletionResponseGen, LLMMetadata
from llama_index.core.embeddings import BaseEmbedding
# μ„€μΉ˜λœ νŒ¨ν‚€μ§€μ—μ„œ 클래슀 μž„ν¬νŠΈ
from clova_llama_index import ClovaClient, ClovaIndexEmbeddings, ClovaLLM
# import chromadb
from llama_index.core import (
VectorStoreIndex,
SimpleDirectoryReader,
StorageContext,
SimpleKeywordTableIndex,
TreeIndex,
Settings
)
# from llama_index.vector_stores.chroma import ChromaVectorStore
# from IPython.display import Markdown, display
# image_url = "https://www.fpn119.co.kr/imgdata/fpn119_co_kr/202408/2024080548213280.jpg"
# ==========================================
# 4. Gradio μΈν„°νŽ˜μ΄μŠ€ 및 RAG μ‹œμŠ€ν…œ κ΅¬ν˜„
# ==========================================
# HyperCLOVA API ν‚€ (λ°˜λ“œμ‹œ μ‹€μ œ API ν‚€λ‘œ λ³€κ²½ν•˜μ„Έμš”)
clova_api_key = os.environ.get("API_KEY")
print(clova_api_key)
client = ClovaClient(api_key=clova_api_key)
# llama-index μ„€μ •: HyperCLOVA LLM 및 μž„λ² λ”© 적용
Settings.llm = ClovaLLM(client)
Settings.embed_model = ClovaIndexEmbeddings(client)
Settings.chunk_size = 4096
chat_engine = None
def chat_with_docs(message, history):
global chat_engine
if chat_engine is None:
return "⚠️ chat_engine을 μ°Ύμ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€."
response = chat_engine.chat(message)
return response.response
def show_image():
return "./img/19.jpg" # μ—…λ‘œλ“œν•œ 파일λͺ…
with gr.Blocks() as demo:
print("with gr.Blocks() as demo:")
gr.Markdown("## πŸ€– HyperCLOVA 기반 λ¬Έμ„œ 챗봇")
documents = SimpleDirectoryReader('./law', required_exts=[".pdf", ".txt"]).load_data()
# index = VectorStoreIndex.from_documents(documents)
# chat_engine = index.as_chat_engine(chat_mode="condense_question", verbose=True)
nodes = Settings.node_parser.get_nodes_from_documents(documents)
# μž„λ² λ”© ν•¨μˆ˜ μ΄ˆκΈ°ν™” ν›„ μ»¬λ ‰μ…˜μ— 제곡
embed_model = ClovaIndexEmbeddings(client, embed_batch_size=1)
Settings.embed_model = embed_model
Settings.chunk_size = 1024
Settings.chunk_overlap = 128
# # initialize storage context (by default it's in-memory)
storage_context = StorageContext.from_defaults()
storage_context.docstore.add_documents(nodes)
index = VectorStoreIndex.from_documents(documents)
chat_engine = index.as_chat_engine(chat_mode="condense_question", verbose=True)
embed_model = ClovaIndexEmbeddings(client, embed_batch_size=1)
print("keyword_index start")
keyword_index = SimpleKeywordTableIndex(nodes, storage_context=storage_context)
print("vector_index start")
vector_index = VectorStoreIndex(nodes, storage_context=storage_context)
print("tree_index start")
tree_index = TreeIndex(nodes, storage_context=storage_context)
from llama_index.core.tools import QueryEngineTool
vector_query_engine = vector_index.as_query_engine(
response_mode="tree_summarize", use_async=True, name="vector"
)
keyword_query_engine = keyword_index.as_query_engine(
response_mode="tree_summarize", use_async=True, name="keyword"
)
tree_query_engine = tree_index.as_query_engine(
response_mode="tree_summarize", use_async=True, name="tree"
)
vector_tool = QueryEngineTool.from_defaults(
query_engine=vector_query_engine,
description=(
"법λ₯ μ— λŒ€ν•œ μ „λ°˜μ μΈ 검색이 ν•„μš”ν•  λ•Œ ν™œμš©ν•˜μ„Έμš”."
)
)
keyword_tool = QueryEngineTool.from_defaults(
query_engine=keyword_query_engine,
description=(
"ν‚€μ›Œλ“œλ‘œ 법λ₯  검색을 μ§„ν–‰ν• λ•Œ ν™œμš©ν•˜μ„Έμš”."
)
)
tree_tool = QueryEngineTool.from_defaults(
query_engine=tree_query_engine,
description=(
"법λ₯  전체λ₯Ό Tree ν˜•νƒœλ‘œ λ§Œλ“€μ–΄μ„œ 검색을 ν•  λ•Œ ν™œμš©ν•©λ‹ˆλ‹€."
)
)
from llama_index.core import VectorStoreIndex
from llama_index.core.objects import ObjectIndex
obj_index = ObjectIndex.from_objects(
[vector_tool, keyword_tool, tree_tool],
index_cls=VectorStoreIndex,
)
from llama_index.core.query_engine import ToolRetrieverRouterQueryEngine
query_engine = ToolRetrieverRouterQueryEngine(obj_index.as_retriever())
# response = query_engine.query("μ†Œλ°©μ‹œμ„€μ—…μ„ λ“±λ‘ν•˜λ €λŠ” μ‚¬λžŒμ€ μ–΄λ–€ 절차λ₯Ό 따라야 ν•˜λ‚˜μš”? κ΄€λ ¨λœ 법령 쑰항을 ν•¨κ»˜ ν‘œμ‹œν•΄ μ£Όμ„Έμš”. 닡변을 μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ μ΅œλŒ€ν•œ μƒμ„Ένžˆ μž‘μ„±ν•΄ μ£Όμ„Έμš”")
# print(response)
# with gr.Row():
# file_input = gr.File(file_types=[".pdf", ".txt"], file_count="multiple", label="πŸ“ λ¬Έμ„œ μ—…λ‘œλ“œ")
# upload_btn = gr.Button("πŸ“Œ λ¬Έμ„œ 뢄석 μ‹œμž‘")
# status_box = gr.Textbox(label="μƒνƒœ", interactive=False)
# μ΅œμ‹  Gradio ν˜•μ‹μ— 맞게 type="messages" μ„€μ •
chatbot = gr.ChatInterface(fn=chat_with_docs, title="πŸ“š λ¬Έμ„œ 기반 챗봇", type="messages")
# upload_btn.click(fn=upload_and_prepare_chat, inputs=[file_input], outputs=[status_box])
demo.launch()