こんにちは、このシリーズ何度か分からないですが色々作ってます。今回はプログラミングコードが含まれたものをやってみます。
量子コンピュータのプログラミングって学ぶのが大変ですよね。それらをLLMに覚え込ませたいところですが、全部覚えてるとは限らないので、参照させてみます。今回はCSVを使ってみました。
pip install --quiet transformers accelerate langchain langchain-community sentence-transformers faiss-gpu pypdf gradio
from transformers import AutoTokenizer, pipeline
model_id = "mistralai/Mistral-7B-Instruct-v0.2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
pipe = pipeline("text-generation", model=model_id, tokenizer=tokenizer, device=0, max_new_tokens=300)
モデルはMistral7Bを使いました。データはpandasでcsvを読み込みます。今回はこのlist2.csvのファイルの中に色々説明やコードが入ってます。
from langchain_community.document_loaders import DataFrameLoader
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_text_splitters import CharacterTextSplitter
import pandas as pd
df = pd.read_csv("list2.csv")
loader = DataFrameLoader(df)
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
embeddings = HuggingFaceEmbeddings(
model_name="intfloat/multilingual-e5-large"
)
db = FAISS.from_documents(docs, embeddings)
retriever = db.as_retriever()
print(db.index.ntotal)
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain.llms import HuggingFacePipeline
llm = HuggingFacePipeline(pipeline=pipe)
template = """あなたは量子コンピュータプログラミングの先生です。次のコンテクストに含まれる説明とコードを参照して質問に答えてください:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
この辺りはお馴染みです。pipelineで構築したLLMをRAGに渡します。プロンプトは日本語で丁寧に指定をしました。そして最後にGradio。
import gradio as gr
import os
def add_text(history, text):
history = history + [(text, None)]
return history, gr.Textbox(value="", interactive=False)
def bot(history):
query = history[-1][0]
response = chain.invoke(query)
if "Answer:" in response:
response = response.split("Answer:")[1]
if "Question:" in response:
response = response.split("Question:")[0]
history[-1][1] = ""
for character in response:
history[-1][1] += character
yield history
with gr.Blocks() as demo:
chatbot = gr.Chatbot([])
with gr.Row():
txt = gr.Textbox(
scale=4,
show_label = False,
container = False
)
clear = gr.Button("Clear")
txt_msg = txt.submit(add_text, [chatbot, txt], [chatbot, txt], queue = False).then(bot, chatbot, chatbot)
txt_msg.then(lambda: gr.Textbox(interactive = True), None, [txt], queue = False)
clear.click(lambda: None, None, chatbot, queue=False)
demo.queue()
demo.launch(share=True)
もうなんというか最低限の構成を色々使い回すだけでできますね。こんな感じでインターフェースでやってくれます。
しかも、きちんとコードも提示して、コードの中も説明してくれました。