[UI]Chainlitで専門家AIと会話する_Local-LLM+Document Summary Index
LLMのUIにはtext-generation-webuiをはじめ様々なものがありますが、今回はChainlit(GitHub)に下記の記事と同じ方法で作成したindexを使ってLocal-LLMに回答してもらうChat-UIを作成します。
クラウドや高性能PCで作成したindexをそれほど高性能でない別のPC内で活用することができます。ほかのユーザーに使用してもらう際にUIはユーザーの認知容易性の面でメリットがあります。
0. 環境
1. 知識の収集・格納
今回はarXivで取得したPDFをフォルダに格納しました。
検索した単語は"NLP"(自然言語処理)です。論文数は91件です。
2. PDF ⇒ Document Summary Index
Document summary indexを構築します。
# フォルダのパス
path = r".\NLP"
# データの読込み
from llama_index.node_parser import SimpleNodeParser
from llama_index import (
SimpleDirectoryReader,
ServiceContext,
get_response_synthesizer,
)
from llama_index.indices.document_summary import DocumentSummaryIndex
documents = SimpleDirectoryReader(path).load_data()
response_synthesizer = get_response_synthesizer(
response_mode="tree_summarize", use_async=True
)
doc_summary_index = DocumentSummaryIndex.from_documents(
documents,
response_synthesizer=response_synthesizer,
show_progress=True,
)
作成したindexを保存します。
doc_summary_index.storage_context.persist("index")
3. Chainlitで使用するpyファイルを作成
下記のpyファイル、例えば app_nlp.py というファイル名で作成します。
LLMのモデルはHuggingFaceH4/zephyr-7b-betaです。
import os
import torch
from llama_index import (
ServiceContext,
StorageContext,
load_index_from_storage
)
from llama_index.llms import HuggingFaceLLM
import chainlit as cl
## 使用するLLMを設定、使用するIndexの読込
@cl.cache
def load_context():
llm = HuggingFaceLLM(
model_name="HuggingFaceH4/zephyr-7b-beta",
tokenizer_name="HuggingFaceH4/zephyr-7b-beta",
model_kwargs={"torch_dtype": torch.bfloat16},
generate_kwargs={"temperature": 0.1, "do_sample":True,},
device_map="auto",
)
service_context = ServiceContext.from_defaults(llm=llm, chunk_size=1024)
# Rebuild the storage context
storage_context = StorageContext.from_defaults(persist_dir="./NLP/index")
# Load the index
index = load_index_from_storage(storage_context, service_context=service_context)
return index
## query engineの設定
@cl.on_chat_start
async def start():
index = load_context()
query_engine = index.as_query_engine(response_mode="tree_summarize", use_async=True,)
cl.user_session.set("query_engine", query_engine)
await cl.Message(author="Assistant", content="Hello ! How may I help you ? ").send()
## 返答をユーザーに返す
@cl.on_message
async def main(message: str):
query_engine = cl.user_session.get("query_engine") # type: RetrieverQueryEngine
response = await cl.make_async(query_engine.query)(message.content)
response_message = cl.Message(content="")
response_message.content = response.response
await response_message.send()
4. 作成したpyファイルをChainlitで使用する
$ chainlit run app_nlp.py
5. 質疑例
翻訳
6. まとめ
非常に手軽にLlamaindexやLangchainを組み込めるChainlitは本当に素敵ですね。Chat-GPTがこれほど認知が広がったのは、その素晴らしいコンテンツだけではなく、UIのおかげも大きいと思います。UIの力、侮れません。
この記事が気に入ったらサポートをしてみませんか?