LangChain チートシート — すべての秘密を1ページにまとめました
『LangChain チートシート — 1ページですべての秘密を網羅』
作成したワンページはLangChainの基礎の要約です。この記事では、コードのセクションを進めて、LangChainをマスターするために必要なスターターパッケージを説明します。
現在、このワンページはLangchainの基本をカバーする唯一のチートシートです。 PDFバージョンをダウンロードして、GitHubをチェックして、Colabでコードを確認してください。
LangChain 101コースを探索しましょう:
LangChain 101コース(更新版)
LangChain 101コースセッション。すべてのコードはGitHubにあります。LLMs、Chatbots
VoAGI.com
モデル
LangChainのモデルは、OpenAIのtext-davinci-003/gpt-3.5-turbo/4/4-turboなどの言語モデルを指し、様々な自然言語処理のタスクに使用することができます。
LangChain 101コースのモデル講義をチェックしてください:
LangChain 101:パート2ab. (大規模な言語)モデルについて知っておく必要があるすべてのこと
これはLangChain 101コースのパート2abです。理解するためには最初のパートをチェックすることを強くお勧めします…
pub.towardsai.net
以下のコードは、LangChain内で(この特定の場合はOpenAIを使用して)言語モデルを初期化および使用する方法を示しています。
from langchain.llms import OpenAIllm = OpenAI(model_name="text-davinci-003", temperature=0.01)print(llm("データサイエンティストのためのお誕生日プレゼントを3つ提案してください"))>>> 1. データサイエンスの雑誌やジャーナルの定期購読2. データサイエンスの書籍セット3. データサイエンスをテーマにしたマグカップやTシャツ
ご覧の通り、LLMを初期化してクエリで呼び出しています。すべてのトークン化と埋め込みが裏で行われます。会話履歴を管理し、システムの指示をチャットに組み込んで応答の柔軟性を高めることができます。
from langchain.chat_models import ChatOpenAIfrom langchain.schema import HumanMessage, AIMessage, SystemMessagechat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.01)conversation_history = [ HumanMessage(content="データサイエンティストのためのお誕生日プレゼントを3つ提案してください"), AIMessage(content="価格帯はいくらですか?"), HumanMessage(content="100ドル以下"),]print(chat(conversation_history).content)>>>1. データサイエンスの本:Wes McKinneyの「Python for Data Analysis」やTrevor Hastie、Robert Tibshirani、Jerome Friedmanの「The Elements of Statistical Learning」といったデータサイエンスに関する人気で高く評価されている本を贈ることを検討してください。これらの書籍は、データサイエンティストの専門的な成長のために貴重な洞察と知識を提供します。2. データ可視化ツール:データサイエンティストはしばしば大規模なデータセットを扱い、効果的にその結果を提示する必要があります。Tableau PublicやPlotlyなどのデータ可視化ツールを贈ることを検討してください。これらのツールは、インタラクティブで視覚的に魅力的なチャートやグラフを作成するのに役立ちます。3. データサイエンスプラットフォームへのサブスクリプション:KaggleやDataCampなどのデータサイエンスプラットフォームへのアクセスを提供してください。これらのプラットフォームは、データサイエンティストがスキルを向上させ、フィールドの最新トレンドに対応するためのさまざまなコース、チュートリアル、データセットを提供しています。このギフトは、貴重な学習リソースとプロフェッショナルな成長の機会を提供します。
ご覧の通り、異なるタイプのメッセージを使用して、会話を特定の方向にシフトできます:HumanMessage
、AIMessage
、およびSystemMessage
。
オープンソース
さて、オープンソースのモデルについて話しましょう。以下は、テキスト生成のための事前学習済み言語モデルの初期化と使用の典型的な例です。コードにはトークナイザの使用、モデルの設定、および量子化による効率的な推論(以下のいくつかのコードスニペット)、およびCUDAサポートが含まれています。
from auto_gptq import AutoGPTQForCausalLMfrom transformers import AutoTokenizerfrom torch import cuda# 事前学習済みモデルの名前model_name = "TheBloke/llama-2-13B-Guanaco-QLoRA-GPTQ"# モデルに対するトークナイザの初期化tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=True)# 特定の設定でAutoGPTQForCausalLMモデルを初期化します# このモデルは、効率的な推論に適したGPTモデルの量子化バージョンですmodel = AutoGPTQForCausalLM.from_quantized( model_name, use_safetensors=True, # セキュアなシリアル化のためのSafeTensorsを有効化 trust_remote_code=True, # リモートコードを信頼します(信頼できないソースでは推奨されません) device_map="auto", # 利用可能なデバイスにモデルを自動的にマップします quantize_config=None # 量子化の設定をカスタマイズします(デフォルトの場合はNone))# モデルに渡され、トークナイズされる入力クエリquery = "<ここに入力テキストを入力してください>"# 入力クエリをトークナイズし、CUDAと互換性のあるテンソル形式に変換しますinput_ids = tokenizer(query, return_tensors="pt").input_ids.cuda()# 指定した温度設定でモデルを使用してテキストを生成しますoutput = model.generate(input_ids=input_ids, temperature=0.1)
テキスト生成
テキスト生成中に、異なるパラメータを使用してテキスト生成のプロセスに大きく影響を与えることができます:
LLMはどのようにテキストを生成するのですか?
この記事では、トランスフォーマーや大規模言語モデルのトレーニングについては議論しません。代わりに、使用方法に焦点を当てます…
pub.towardsai.net
temperature
は、トークン生成のランダム性に影響を与えますTop-k
サンプリングはステップごとに最も可能性の高い上位k個のトークンにトークン生成を制限しますTop-p
(核)サンプリングは累積確率pによるトークン生成を制限しますmax_tokens
は生成されるトークンの長さを指定します
llm = OpenAI(temperature=0.5, top_k=10, top_p=0.75, max_tokens=50)
量子化
量子化を使用することは、パフォーマンス上重要です。
小さなメモリに大規模言語モデルを適合させる方法:量子化
ローカルマシンでLLMを実行する方法
pub.towardsai.net
以下では、4ビットの量子化を使用して効率的なパフォーマンスのために事前学習済み言語モデルを最適化します。これらの最適化は、モデルのサイズと速度が重要な要素である展開シナリオに特に有益です。
from transformers import BitsAndBytesConfig, AutoModelForCausalLMimport torch# モデル名またはパスを指定model_name_or_path = "your-model-name-or-path"# 4ビットの量子化に対するBitsAndBytesConfigを設定します# この設定は、モデルサイズと推論速度の最適化に使用されますbnb_config = BitsAndBytesConfig( load_in_4bit=True, # 4ビット精度でモデルを読み込むことを有効化 bnb_4bit_compute_dtype=torch.bfloat16, # 計算データ型をbfloat16に設定 bnb_4bit_quant_type="nf4", # 量子化タイプをnf4に設定 bnb_4bit_use_double_quant=True # より高い精度を得るために2重量子化を有効化します)# 4ビットの量子化を適用した事前学習済み因果言語モデルを読み込みますmodel_4bit = AutoModelForCausalLM.from_pretrained( model_name_or_path, quantization_config=bnb_config, # 4ビットの量子化設定を適用します device_map="auto", # 利用可能なデバイスにモデルを自動的にマップします trust_remote_code=True # リモートコードを信頼します(注意して使用してください))
微調整
いくつかの場合、事前学習済みの言語モデルを微調整する必要があります。通常、効率的なタスク固有の適応のために、低ランク適応(LoRA)を使用して達成されます。また、勾配チェックポイントの使用方法や、メモリおよび計算効率に関するトレーニングプロセスの最適化のためのkビットトレーニングの準備も示されています。
LangChain 101:第2c部。PEFT、LORA、およびRLを使用したFine-tuning LLMs
Fine-tuning llms、PEFT、LORA、および大規模言語モデルのトレーニングに関するすべての情報
pub.towardsai.net
LangChain 101:第2d部。人間のフィードバックを使用したFine-tuning LLMs
事前学習LLMsに人間のフィードバックを使用した強化学習の実装方法。悪い修正をしたい場合に考慮してください…
pub.towardsai.net
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_trainingfrom transformers import AutoModelForCausalLM, Trainer, TrainingArguments, DataCollatorForLanguageModeling# 事前学習済み因果言語モデルの読み込みpretrained_model = AutoModelForCausalLM.from_pretrained("your-model-name")# メモリ効率のために勾配チェックポイントを有効化pretrained_model.gradient_checkpointing_enable()# 低ビット幅トレーニングに最適化するためにモデルを準備するmodel = prepare_model_for_kbit_training(pretrained_model)# LoRa(Low-Rank Adaptation)設定を定義する# これはタスク固有の微調整にモデルを設定するconfig = LoraConfig( r=16, # 低ランク行列のランク lora_alpha=32, # LoRAレイヤーのスケール lora_dropout=0.05, # LoRAレイヤーのドロップアウト率 bias="none", # 使用するバイアスのタイプ target_modules=["query_key_value"], # LoRA適応の対象モデルコンポーネント task_type="CAUSAL_LM" # タスクタイプ、ここでは因果言語モデリング)# 指定したLoRa設定でモデルを適応するmodel = get_peft_model(model, config)# モデルトレーニングのためにトレーナーを初期化するtrainer = Trainer( model=model, train_dataset=train_dataset, # トレーニングデータセット args=TrainingArguments( num_train_epochs=10, per_device_train_batch_size=8, # その他のトレーニング引数... ), data_collator=DataCollatorForLanguageModeling(tokenizer) # データバッチのコレーター)# トレーニング中にメモリを節約するためにキャッシュを無効化するmodel.config.use_cache = False# トレーニングプロセスを開始するtrainer.train()
プロンプト
LangChainは、言語モデルのテキスト生成能力の動作をガイドすることができる動的プロンプトの作成を可能にします。LangChainのプロンプトテンプレートは、モデルから特定の応答を生成する方法を提供します。具体的な製品のSEOの説明を作成する必要がある実践的な例を見てみましょう。
from langchain.prompts import PromptTemplate, FewShotPromptTemplate# 簡単なプロンプトテンプレートを定義して使用するtemplate = "{product}のSEOエキスパートとして行動します。SEOの説明を提供してください。"prompt = PromptTemplate(input_variables=["product"], template=template)# 特定の製品でプロンプトをフォーマットするformatted_prompt = prompt.format(product="Perpetuum Mobile")print(llm(formatted_prompt))>>>Perpetuum Mobileは、革新的で持続可能なエネルギーのリーディングプロバイダーです。当社の製品とサービスは、企業や個人が炭素排出量を削減し、エネルギーコストを節約するのに役立つよう設計されています。ソーラー、風力、地熱エネルギーシステム、およびエネルギー蓄積ソリューションに特化しています。経験豊富なエンジニアと技術者からなるチームは、お客様に最高品質の製品とサービスを提供することに全力を注いでいます。産業界で最も信頼性が高く費用効果の高い再生可能エネルギーソリューションのプロバイダーでありたいと考えています。持続可能性と顧客満足度への取り組みを通じて、Perpetuum Mobileはエネルギー需要に最適な選択肢です。
タスクが実行される方法をいくつかの例を通じて示す数少ないデータセットがある場合もあります。テキスト分類タスクの例を見てみましょう:
# いくつかの例を使ってfew-shot学習プロンプトを定義します
examples = [
{"email_text": "無料でiPhoneをゲットしよう!", "category": "スパム"},
{"email_text": "次のSprint Planning Meetingです。", "category": "会議"},
{"email_text": "Yのバージョン2.1がリリースされました", "category": "プロジェクトのアップデート"}
]
# プロンプトテンプレートを定義します
prompt_template = PromptTemplate(
input_variables=["email_text", "category"],
template="メールを分類してください:{email_text} /n {category}"
)
# few-shot学習プロンプトを定義します
few_shot_prompt = FewShotPromptTemplate(
example_prompt=prompt_template,
examples=examples,
suffix="メールを分類してください:{email_text}",
input_variables=["email_text"]
)
# few-shot学習プロンプトを使ってフォーマットします
formatted_prompt = few_shot_prompt.format(email_text="こんにちは。明日のデイリースタンドアップを10時に変更します。")
print(llm(formatted_prompt))>>>/n 会議
インデックス
LangChainのインデックスは、大量のデータを効率的に処理および取得するために使用されます。LLMにテキスト全体をアップロードする代わりに、まずソース内の関連情報をインデックス化/検索し、トップk個の回答を見つけた後に応答を作成します。非常に便利です!
LangChainでは、インデックスを使用するには、さまざまなソースからドキュメントを読み込む、テキストを分割する、ベクトルストアを作成する、関連するドキュメントを取得するなどの手順が含まれます。
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
# Webソースからドキュメントを読み込みます
loader = WebBaseLoader("https://en.wikipedia.org/wiki/History_of_mathematics")
loaded_documents = loader.load()
# 読み込んだドキュメントを小さなテキストに分割します
text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=50)
texts = text_splitter.split_documents(loaded_documents)
# ベクトルストアを作成し、類似度検索を実行します
db = FAISS.from_documents(texts, embeddings)
print(db.similarity_search("アイザック・ニュートンの数学への貢献とは何ですか?"))>>>[Document(page_content="多くの先達者の先行研究を基にして、アイザック・ニュートンはケプラーの法則を説明する物理学の法則を発見し、微積分として知られる概念を結集させました。独立して、ゴットフリート・ヴィルヘルム・ライプニッツは微積分学を発展させ、今日まで使用されている微積分の表記法の多くを洗練しました。彼はまた、ほぼすべてのデジタル(電子)の基盤である2進数システムを改良しました。", metadata={'source': 'https://en.wikipedia.org/wiki/History_of_mathematics', 'title': 'History of mathematics - Wikipedia', 'language': 'en'}), Document(page_content='数学の発展は、新しい科学的発見と相互作用し、現代まで続く増加ペースで行われました。これには、17世紀の過程で微小計算法の開発におけるアイザック・ニュートンとゴットフリート・ヴィルヘルム・ライプニッツの画期的な業績も含まれています。', metadata={'source': 'https://en.wikipedia.org/wiki/History_of_mathematics', 'title': 'History of mathematics - Wikipedia', 'language': 'en'}), Document(page_content="13世紀には、ナーシル・アル=ディーン・トゥースィー(ナサレディン)が球面三角法をさらに発展させました。彼はまた、ユークリッドの平行公準に関する影響力のある著作を執筆しました。15世紀には、ギヤース・アル=カーシーは円周率の16桁までの値を計算しました。カーシーにはまた、nth次根を計算するアルゴリズムもありましたが、これは後世数世紀後にルフィーニとホーナーが与えた方法の一つの特殊なケースです。", metadata={'source': 'https://en.wikipedia.org/wiki/History_of_mathematics', 'title': 'History of mathematics - Wikipedia', 'language': 'en'}), Document(page_content='ホワイトヘッドは、数学の基礎に関する長期間にわたる論争を引き起こしました。', metadata={'source': 'https://en.wikipedia.org/wiki/History_of_mathematics', 'title': 'History of mathematics - Wikipedia', 'language': 'en'})]
similarity_search
の他に、ベクトルデータベースをリトリーバとして使用することもできます:
# リトリーバの初期化と使用
retriever = db.as_retriever()
print(retriever.get_relevant_documents("アイザック・ニュートンの数学への貢献とは何ですか?"))>>>[Document(page_content="多くの先達者の先行研究を基にして、アイザック・ニュートンはケプラーの法則を説明する物理学の法則を発見し、微積分として知られる概念を結集させました。独立して、ゴットフリート・ヴィルヘルム・ライプニッツは微積分学を発展させ、今日まで使用されている微積分の表記法の多くを洗練しました。彼はまた、ほぼすべてのデジタル(電子)の基盤である2進数システムを改良しました。", metadata={'source': 'https://en.wikipedia.org/wiki/History_of_mathematics', 'title': 'History of mathematics - Wikipedia', 'language': 'en'}), Document(page_content='数学の発展は、新しい科学的発見と相互作用し、現代まで続く増加ペースで行われました。これには、17世紀の過程で微小計算法の開発におけるアイザック・ニュートンとゴットフリート・ヴィルヘルム・ライプニッツの画期的な業績も含まれています。', metadata={'source': 'https://en.wikipedia.org/wiki/History_of_mathematics', 'title': 'History of mathematics - Wikipedia', 'language': 'en'}), Document(page_content="13世紀には、ナーシル・アル=ディーン・トゥースィー(ナサレディン)が球面三角法をさらに発展させました。彼はまた、ユークリッドの平行公準に関する影響力のある著作を執筆しました。15世紀には、ギヤース・アル=カーシーは円周率の16桁までの値を計算しました。カーシーにはまた、nth次根を計算するアルゴリズムもありましたが、これは後世数世紀後にルフィーニとホーナーが与えた方法の一つの特殊なケースです。", metadata={'source': 'https://en.wikipedia.org/wiki/History_of_mathematics', 'title': 'History of mathematics - Wikipedia', 'language': 'en'}), Document(page_content='ホワイトヘッドは、数学の基礎に関する長期間にわたる論争を引き起こしました。', metadata={'source': 'https://en.wikipedia.org/wiki/History_of_mathematics', 'title': 'History of mathematics - Wikipedia', 'language': 'en'})]
メモリ
LangChainのメモリは、モデルが前回の会話や文脈の一部を覚えている能力を指します。これはインタラクションの連続性を維持するために必要です。ConversationBufferMemory
を使用して、会話の履歴を保存して取り出すことができます。
from langchain.memory import ConversationBufferMemory# 会話のメモリを初期化するmemory = ConversationBufferMemory(memory_key="chat_history")# メッセージを会話のメモリに追加するmemory.chat_memory.add_user_message("こんにちは!")memory.chat_memory.add_ai_message("ようこそ!どのようにお手伝いできますか?")# メモリ変数をロードする(もしあれば)memory.load_memory_variables({})>>>{'chat_history': 'ユーザー: こんにちは!\nAI: ようこそ!どのようにお手伝いできますか?'}
次のセクションで、メモリの使用例をいくつか見ていきましょう。
チェーン
LangChainのチェーンは、入力を処理して出力を生成する操作のシーケンスです。提供されたフィードバックに基づいてメールの応答を開発するためのカスタムチェーンのビルド例を見てみましょう:
from langchain.prompts import PromptTemplatefrom langchain.chains import ConversationChain, summarize, question_answeringfrom langchain.schema import StrOutputParser# フィードバックの要約のためのチェーンを定義して使用するfeedback_summary_prompt = PromptTemplate.from_template( """あなたはカスタマーサービスのマネージャーです。お客様のフィードバックに基づいて、 メインのポイントを要約するのがあなたの仕事です。 顧客フィードバック:{feedback} 要約:""")# ビジネスのメール応答の下書きのためのテンプレートemail_response_prompt = PromptTemplate.from_template( """あなたはカスタマーサービス担当者です。 顧客フィードバックの要約が与えられた場合、 プロフェッショナルなメール応答を書くのがあなたの仕事です。フィードバックの要約:{summary}メール応答:""")feedback_chain = feedback_summary_prompt | llm | StrOutputParser()email_chain = ( {"summary": feedback_chain} | email_response_prompt | llm | StrOutputParser())# 実際の顧客フィードバックでフィードバックチェーンを使用するemail_chain.invoke( {"feedback": "配達が遅く、梱包が悪かったことにがっかりしました。"})>>>\n\n拝啓、[顧客名]様\n\nお時間を割いてフィードバックをいただき、ありがとうございます。配達の遅延と梱包の品質について、申し訳ありません。お客様の満足度を非常に重視しており、ご期待に添えなかったことをお詫び申し上げます。\n\n現在、問題について調査しており、今後同様のことが起こらないように必要な措置を講じます。お客様のビジネスを大切にしており、改めてお客様にご満足いただける体験を提供できる機会をいただけることを願っております。\n\nご質問やご不明な点がありましたら、お気軽にご連絡ください。\n\n敬具、\n[お名前]
ご覧の通り、2つのチェーンがあります:feedback_chain
はフィードバックの要約を生成し、email_chain
はその要約に基づいてメールの応答を生成します。上記のチェーンは、LangChainの推奨方法であるLangChain Expression Languageを使用して作成されました。
要約タスクやシンプルなQ&Aのような予め定義されたチェーンも使用することができます:
# 要約とQ&Aのための予め定義されたチェーンchain = summarize.load_summarize_chain(llm, chain_type="stuff")chain.run(texts[:30])>>>数学の歴史は、数学の発見の起源と、過去の数学の方法と表記法に関わる。 それは、紀元前6世紀のピタゴラス派から始まり、"数学"という言葉を作り出した名前である。 ギリシャの数学は、数学の方法を大幅に改良し、数学の対象範囲を拡大させた。 古代中国の数学は、位取り記数法や負の数の最初の使用などの早期の貢献を行った。 ヒンドゥー–アラビアの数字システムとその操作のルールは、1千年紀にインドで進化し、イスラム数学を経由して西洋に伝わった。 古代から中世にかけて、数学の発見の時代はしばしば停滞の世紀に続いた。 15世紀のルネサンス・イタリアを皮切りに、新たな数学的な発展が新しい科学的な発見と相互作用し、増加し続けている。
フィードバックの要約、質問の回答などの定義済みのチェーンに加えて、独自のConversationChain
をビルドして、メモリを統合することもできます。
# 対話チェーンでメモリを使用するmemory = ConversationBufferMemory()conversation = ConversationChain(llm=llm, memory=memory)conversation.run("世界で一番高い山の名前を教えてください")>>>世界で一番高い山はエベレスト山ですconversation.run("その高さは?")>>>エベレスト山は海抜8,848メートル(29,029フィート)です。
エージェントとツール
LangChainでは、特定のタスクに特化したカスタムツールやエージェントを作成することができます。カスタムツールには、APIの呼び出しからカスタムPython関数まで、さまざまなものを組み込むことができます。ここでは、任意の文をすべて小文字に変換するエージェントを作成してみましょう。
from langchain.tools import StructuredTool, BaseToolfrom langchain.agents import initialize_agent, AgentTypeimport re# カスタムテキスト処理ツールを定義して使用するdef text_processing(string: str) -> str: """テキストを処理する""" return string.lower()text_processing_tool = StructuredTool.from_function(text_processing)# カスタムツールを使用してエージェントを初期化して使用するagent = initialize_agent([text_processing_tool], llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)agent.run({"input": "テキストを処理する:ロンドンはイギリスの首都です"})>>>> 新しいエージェント実行チェーンに入る... テキスト処理ツールを使用する必要がありますアクション:text_processingアクションの入力:ロンドンはイギリスの首都です観察:ロンドンはイギリスの首都です考え:最終的な答えがわかりました最終的な答え:ロンドンはイギリスの首都です> チェーンの実行完了。'ロンドンはイギリスの首都です'
ご覧の通り、エージェントは定義したツールを使用し、文を小文字に変換しました。では、完全に機能するエージェントを作成してみましょう。そのために、テキスト内で単位(マイルからキロメートルなど)を変換するためのカスタムツールを作成し、LangChainフレームワークを使用して会話エージェントに統合します。 UnitConversionTool
クラスは、特定の変換ロジックを持つ基本機能の拡張の実用的な例を提供します。
import refrom langchain.tools import BaseToolfrom langchain.agents import initialize_agentclass UnitConversionTool(BaseTool): """ 米国の単位を国際単位に変換するツールです。 具体的には、マイルをキロメートルに変換します。 """ name = "単位変換ツール" description = "米国の単位を国際単位に変換します" def _run(self, text: str): """ テキスト内のマイルを同期的にキロメートルに変換します。 Args: text (str): 変換するマイルを含む入力テキスト。 Returns: str: キロメートルに変換されたテキスト。 """ def miles_to_km(match): miles = float(match.group(1)) return f"{miles * 1.60934:.2f} km" return re.sub(r'\\b(\\d+(\\.\\d+)?)\\s*(miles|mile)\\b', miles_to_km, text) def _arun(self, text: str): """ 変換関数の非同期バージョン。まだ実装されていません。 """ raise NotImplementedError("未実装")# Unit Conversion Toolを使用してエージェントを初期化するagent = initialize_agent( agent='chat-conversational-react-description', tools=[UnitConversionTool()], llm=llm, memory=memory)# エージェントを使用して単位を変換する例agent.run("5マイル")>>> 5マイルは約8キロメートルです。agent.run("ごめんなさい、15と言いたかった")>>> 15キロメートルは約9.3マイルです。
これで、LangChainのワンページに表示されたコードが完了しました。お役に立てればうれしいです!
お知らせ:PDFバージョンをダウンロードしたり、GitHubのワンページをチェックしたり、コードをColabで実行したりすることができます。
この記事に拍手して、フォローしていただけると嬉しいです!これによって、私は新しいパートや記事を書くやる気を得ることができます 🙂 その上、新しいパートが公開されると通知されます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles