[AI] LlamaIndexとLangChain(Chroma)の比較 その2 要約力

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

今度は要約力を比較しました。とある英語論文のPDF1ページ目を読み込ませて、要約してもらいました。

こちらでもLlamaIndexに軍配があがりました。ここでLangChain(Chroma)が優れているのであれば、Embeddings Toolアプリとして両者を統合する目論見でしたが、現時点では正確性・要約力で明らかにLangChain(Chroma)が劣っているため見送りです。

.py /usr/local/bin/python /Volumes/DATA_m1/AI/LangChain/Python/ChatGPT_LangChain 
Using embedded DuckDB with persistence: data will be stored in: .
この論文では、大規模言語モデルマシン(LLMM)と高水準プログラミング言語のクラスとの間に接続を
確立する新しいアプローチを提案しています。これにより、Turingマシンオブジェクトと言語オブジェクトの間の
シームレスな相互作用が可能になり、普遍的にアクセス可能なオブジェクト指向の記述が実現されます。
LLMMを利用して、現実世界のオブジェクトとそれらのシミュレーションを言語シミュレーション可能な
世界に自動的に変換する方法を示し、デジタルツインコンセプトを推進します。このプロセスは高水準
プログラミング言語に拡張することができ、これらのシミュレーションの実装をよりアクセスしやすく
実用的にすることができます。

[AI] LlamaIndexとLangChain(Chroma)の比較 その1 正確性

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

表題の2方法について、PDFを読み込ませた上で質問に対して正確に答えられるかどうか評価しました。

結果はLlamaIndexの圧勝でした。LangChain(Chroma)ではPDFにあるはずのデータを存在しないと返してきました。これでは話になりません。

LangChain(Chroma)では有力なベクトルDBであるChromaを使っていますが、苦手な処理だったのか正確性ではLlamaIndexとは比較になりませんでした。要約力であればまた結果が違ってくるのかもしれません。

import os
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.document_loaders import PyPDFLoader

loader = PyPDFLoader("試合日程表.pdf")
pages = loader.load_and_split()

# print(pages[1].page_content)

apiKey = os.getenv("CHATGPT_API_KEY")
os.environ["OPENAI_API_KEY"] = apiKey

llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")

embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(pages, embedding=embeddings, persist_directory=".")
vectorstore.persist()

pdf_qa = ConversationalRetrievalChain.from_llm(llm, vectorstore.as_retriever(), return_source_documents=True)

query = "XXXの試合はいつですか"
chat_history = []

result = pdf_qa({"question": query, "chat_history": chat_history})

print(result['answer'])

参考サイト

[AI] ChatRWKVアプリ製作 その5 LangChainでRWKVを使う PyQt6

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

LangChainでRWKV学習モデルを試してみました。

LangChainはこれまで3/31リリースの0.0.127を使っていました。このバージョンではRWKVは使えませんでしたが、現時点最新の0.0.146では使用可能になっています。毎日、新バージョンをリリースしているのでこまめにチェックが必要ですね。

パラメータ数1B5で受け答えがややまともになりましたが、M1 Macでは動作が遅すぎます。日本の首都を答えるのに3分掛かりました。

class chat_base():
    def __init__(self):
        self.model_tokens = []
        self.model_state = None
        self.all_state = {}
        self.user = None
        self.bot = None
        self.interface = None
        self.init_prompt = None
        self.pipeline = None
        self.bool_value = False
        
    def load_model(self, lang, strat, model, bool):
        self.lang = lang
        self.strat = strat
        self.model = model
        self.bool = bool
        
        if self.bool == False:
            from langchain.llms import RWKV
            
            llm = RWKV(
                model = '/Volumes/DATA_m1/AI/ChatRWKV_work/' + self.model, 
                strategy = self.strat, 
                tokens_path = "/Volumes/DATA_m1/AI/ChatRWKV_work/ChatRWKV/v2/20B_tokenizer.json"
            )
            
            while True:
                print("質問を入力して下さい")
                self.question = input()
                print(llm(self.generate_prompt(self.question)))

参考サイト

[AI] ChatRWKVアプリ製作 その3 chat.pyのクラス化 仮完了 

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

ChatRWKVアプリでmodel, language, strategyを選択できるようにしました。スクリプトをいちいち書き換える手間が省けるので、検証用ツールとして有用です。

chat.pyからメイン部分と各関数を抽出してクラスにまとめています。C++とは別種のややこしさがあってかなり手間取りました。

C/C++ではexternやヘッダファイルを駆使してファイル間で変数を自在に使っていますが、Pythonでは循環importになってしまい、いらいらが募ります。まあC/C++が自由すぎるのでしょう。

チャットボットを使ってみたところ、M1 Mac RAM 8GBで速度的に問題なく動作する436Mのモデルでは会話にならないです。

これで検証用ツール製作という目的はほぼ達成しましたが、ここまできたらGUI上で会話できるようにしたいです。

import os, copy, types, gc, sys
import numpy as np
from prompt_toolkit import prompt
import torch

END_OF_TEXT = 0
END_OF_LINE = 187
CHUNK_LEN = 256 # split input into chunks to save VRAM (shorter -> slower)

CHAT_LEN_SHORT = 40
CHAT_LEN_LONG = 150
FREE_GEN_LEN = 256

GEN_TEMP = 1.1 # It could be a good idea to increase temp when top_p is low
GEN_TOP_P = 0.7 # Reduce top_p (to 0.5, 0.2, 0.1 etc.) for better Q&A accuracy (and less diversity)
GEN_alpha_presence = 0.2 # Presence Penalty
GEN_alpha_frequency = 0.2 # Frequency Penalty
AVOID_REPEAT = ',:?!'

class chat_base():
    def __init__(self):
        self.model_tokens = []
        self.model_state = None
        self.all_state = {}
        self.user = None
        self.bot = None
        self.interface = None
        self.init_prompt = None
        self.pipeline = None
        
    def load_model(self, lang, strat, model):
        self.lang = lang
        self.strat = strat
        self.model = model
        
        CHAT_LANG = self.lang # English // Chinese // more to come
        PROMPT_FILE = f'/Volumes/DATA_m1/AI/ChatRWKV_work/ChatRWKV/v2/prompt/default/{CHAT_LANG}-2.py'
        self.load_prompt = self.load_prompt(PROMPT_FILE)
        
        sys.path.append('/Volumes/DATA_m1/AI/ChatRWKV_work/ChatRWKV/rwkv_pip_package/src')
        
        try:
            os.environ["CUDA_VISIBLE_DEVICES"] = sys.argv[1]
        except:
            pass
        np.set_printoptions(precision=4, suppress=True, linewidth=200)
        args = types.SimpleNamespace()

        print('\n\nChatRWKV v2 https://github.com/BlinkDL/ChatRWKV')
        
        torch.backends.cudnn.benchmark = True
        torch.backends.cudnn.allow_tf32 = True
        torch.backends.cuda.matmul.allow_tf32 = True

<以下略>

[AI] ChatRWKVアプリ製作 その2 LangChainの追加

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

RWKVのモデルをLangChainでも使えるようにGUIを書き換えました。

import os, sys
from PyQt6.QtWidgets import QLabel,QWidget,QApplication,QTextEdit,QLineEdit,QPushButton,QComboBox, QLabel, QRadioButton, QButtonGroup
from PyQt6.QtCore import Qt
from langchain import OpenAI
import chat_base

class ChatRWKV(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("RWKV")
        self.setGeometry(100,100,480,640)
        self.setStyleSheet('background-color: #165E83') # 藍色 あいいろ
        self.setAcceptDrops(True)
        
        # 信号
        self.box = QLabel(self)
        self.box.setGeometry(420,15,50,50)
        self.box.setStyleSheet('background-color: #3E62AD') # 杜若色 かきつばたいろ
        
        tool = QLabel('TOOL',self)
        tool.setGeometry(10,15,40,20)
        tool.setStyleSheet('color: #FFFFFF; font-size: 14pt;')
        tool.setAlignment(Qt.AlignmentFlag.AlignLeft)
        
        self.rbtn1 = QRadioButton('ChatRWKV', self)
        self.rbtn1.setGeometry(60,10,100,25)
        self.rbtn1.setChecked(True) 

        self.rbtn2 = QRadioButton('LangChain', self)
        self.rbtn2.setGeometry(170,10,100,25)
        
        # ラジオボタングループの作成
        self.group = QButtonGroup(self)
        self.group.addButton(self.rbtn1)
        self.group.addButton(self.rbtn2)

<以下略>

[AI] ChatRWKVアプリ製作 その1 GUI作成 PyQt6

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

ChatRWKVのGUIアプリ製作に着手しました。

とりあえずPyQt6でガワだけ作成しました。chat.pyは改変してクラス化しています。

import os, copy, types, gc, sys
import numpy as np
from prompt_toolkit import prompt
import torch

class chat_base():
    def __init__(self, lang, strat, model):
        self.lang = lang
        self.strat = strat
        self.model = model
        
        current_path = os.path.dirname(os.path.abspath(__file__))
        sys.path.append(f'{current_path}/../rwkv_pip_package/src')
        
        try:
            os.environ["CUDA_VISIBLE_DEVICES"] = sys.argv[1]
        except:
            pass
        np.set_printoptions(precision=4, suppress=True, linewidth=200)
        args = types.SimpleNamespace()

        print('\n\nChatRWKV v2 https://github.com/BlinkDL/ChatRWKV')

<以下略>

[AI] ChatRWKV 動作確認 M1 Mac / Metalを使用

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

ChatRWKVではMacOSのグラフィックスAPIであるMetalが使えるようなので、早速試してみました。PyTorchを使用しているライブラリではVenturaでMetalを使えます。

Montereyではtorch.sortなどPyTorchの一部機能が使えないため、VenturaにOSアップデートしました。

軽量な学習モデルではChatRWKVを起動させることができました。ただCPUとの比較では明確な差は感じませんでした。7B(14.79GB)以上でないとまともな会話が出来ないようなので、やはりRAMメモリは32GB以上欲しいところです。

私の場合はAI開発者というわけではないですから、無理にRTX 4070Ti搭載PCなどを組んだりせず、気長にAIの進化を待ちつつM2 Pro RAM 32GBあたりで適当に遊ぶのが無難に思えてきました。

args.strategy = 'mps fp32'
# args.strategy = 'cpu fp32'
# args.strategy = 'cuda fp16'

[AI] ChatRWKV 動作確認 M1 Mac, Intel Mac, Windows PC

手持ちのPCでChatRWKVの動作確認をしました。

評価したPCはM1 Mac, Intel Mac, Windows PCです。

学習モデルには14B(28.3GB)など3つを使用しました。

RAMを32GB積んだIntel Macのみ起動しましたが、動作が遅すぎて実用は無理です。プログラム自体はメモリを50GB以上を使っていました。つまりスワップしています。

やはりNVIDIA RTX 3000番台以上とRAMを32GB以上積んだWindows PCじゃないと厳しそうです。

[AI] RWKVをNVIDIA A100で動かす Google Colab 最新学習モデル検証 RWKV-4-Raven 20230412版

[M1 Mac, Monterey 12.6.3]

ChatRWKV用の新しい学習モデルが公開されていたので、プログラミング・アシスタントとして早速試してみました。

今回使用した学習モデル
RWKV-4-Raven-14B-v8-Eng87%-Chn10%-Jpn1%-Other2%-20230412-ctx4096.pth

前回3/29よりもかなり良くなった印象です。gpt-3.5-turboにはまだ及ばないですが、背中が見えてきた感じです。

こうなってくると高スペックGPU搭載PCが俄然欲しくなってきました。

Windows11のUIを扱うのは気が進まないですが、そんなことも言ってられません。

# Googleドライブのマウント
from google.colab import drive
drive.mount('/content/drive')

# 作業フォルダへの移動
import os
%cd '/content/drive/My Drive/work'

# GPU確認
!nvidia-smi

# ChatRWKVのインストール
!git clone https://github.com/BlinkDL/ChatRWKV
%cd ChatRWKV
!pip install -r requirements.txt

# チャット開始
!python v2/chat.py
# 歴史・芸術についてはかなりいい加減な回答を返してくる。
# gpt-3.5-turboも同様でバロン薩摩は西郷隆盛のいとこらしい。

Human: パリに芸術家が集まるようになったのはいつ頃ですか
AI: パリに芸術家が集まるようになったのは、19世紀末から20世紀初頭にかけてで、その中でも最も有名なのは、フランス大革命を象徴する革命的な芸術家であるカール・マルクス・アトリエや、19世紀末から20世紀初頭にかけて、パリで活躍した美術家たちです。

Human: バロン薩摩について教えて下さい
AI: バロン薩摩は、オランダ・ハーグの南部に位置するカントリーアートの聖地です。ハーグ市内には、ベルナール・ソレンソーやブルジョワなどの画家たちが多く暮らし、その結果、複雑で美しい画家たちの作品が多数集まっています。

Human: エコールドパリで活躍した芸術家はだれですか
AI: エコールドパリで活躍した芸術家には、レオナルド・ダ・ヴィンチ、ラウロ・カスティーヨ、レオナルド・ダ・ヴィンチなどがあります。また、近代美術の先駆者であるレオナルド・マルクスや、20世紀に活躍した画家たちも多数います。

学習モデル ダウンロードサイト