[AI] LlamaIndexアプリ製作 その9 max_tokensの適切な設定

[M1 Mac, Monterey 12.6.3, Python 3.10.4]

以前LangChainライブラリにあるOpenAIクラスの設定でmax_tokensを3500以上の大きな数値にして不具合が生じていましたが、2048以下にすると正常動作しました。上限はまだ調べていません。

デフォルトでは256になっていて回答が尻切れになるケースがあり困っていましたが、これで解決です。

ネットで収集した料理レシピを1つのPDFファイルにまとめてインデックスファイルにするつもりです。ただ広告も取り込んでいるためそれらを消去する必要があり、下準備に結構時間が掛かりそうです。あと似たような料理でレシピの内容が混ざらないかチェックが必要ですね。

def loadIDX(self):
    # インデックスの読込
    llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="text-davinci-003", max_tokens=2048))
    service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
    
    choice = self.choice.currentText()
    
    if choice == "C++逆引き":
        index_path = "/AI/LlamaIndex/index/index_C++逆引き.json"
    elif choice == "Python逆引き":
        index_path = "/AI/LlamaIndex/index/index_Python逆引き.json"
    else:
        index_path = self.input2.text()

    try:
        self.index = GPTSimpleVectorIndex.load_from_disk(save_path= index_path, service_context=service_context)
    except Exception as e:
        print('エラーが発生しました:', e)
        self.output.setText(str(e))
        self.box.setStyleSheet('background-color: #ff00ff')
        return
    else:
        self.box.setStyleSheet('background-color: #00ffff')
        
    self.output.setText("IDX読込完了")

[AI] LlamaIndexアプリ製作 その8 例外処理

[M1 Mac, Monterey 12.6.3, Python 3.10.4]

LlamaIndexアプリが簡単には落ちないよう例外処理を強化しました。

def makeIDX(self):
    # インデックスの作成および保存
    llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="text-embedding-ada-002"))
    service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
    
    data_path = self.input.text()
    data_path2 = data_path.replace("'", "") # 拡張子判定用
    data_path3 = Path(data_path2) # loader用

    if data_path2.endswith('.csv'):
        SimpleCSVReader = download_loader("SimpleCSVReader")
        loader = SimpleCSVReader()
    elif data_path2.endswith('.pdf'):
        PDFReader = download_loader("PDFReader")
        loader = PDFReader()
    else:
        print('ファイルがcsv,pdfではありません')
        self.output.setText("ファイルがcsv,pdfではありません")
        self.box.setStyleSheet('background-color: #ff00ff')
        return

    try:
        nodes = loader.load_data(file=data_path3)
    except Exception as e:
        print('エラーが発生しました:', e)
        self.output.setText(str(e))
        self.box.setStyleSheet('background-color: #ff00ff')
        return
    else:
        self.box.setStyleSheet('background-color: #00ffff')

    index = GPTSimpleVectorIndex.from_documents(nodes, service_context=service_context)
    
    now = datetime.datetime.now()
    formatted_time = now.strftime('%y%m%d_%H%M%S')

    index_file = "/AI/LlamaIndex/index/" + formatted_time + "_index.json"
    index.save_to_disk(index_file)
    
    self.input2.setText(index_file)
    self.idxBtn2.click()

[Python] 354 PyQt6でドラッグ&ドロップ

[M1 Mac, Monterey 12.6.3, Python 3.10.4]

PyQt6ではQLineEdit(FLTKにおけるFl_Input)にドラッグ&ドロップできるようにするには、QLineEditを継承したクラスを別途作成する必要があります。

機能が簡素なFLTKでもドラッグ&ドロップは標準装備されているのでこれは意外です。

from PyQt6.QtWidgets import QLineEdit

class MyLineEdit(QLineEdit):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setDragEnabled(True)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            for url in event.mimeData().urls():
                file_path = url.toLocalFile()
                self.setText(file_path)
            event.accept()
        else:
            event.ignore()