ここ数カ月で確立された生成型 AI サービスの洪水のおかげで、大規模言語モデル(LLM) に基づくチャットボットや Web サイトがほぼどこにでも普及しています。ただし、ソフトウェア開発者は、目的の目標を達成するために自分で作業を行うことを好みます。アプリケーションが期待どおりに実行されたときに得られる満足感に加えて、直接プログラミング作業により、アプリケーションの設計と機能を必要に応じて最適化する機会も得られます。
このチュートリアルでは、開発者が生成人工知能(AI) を使い始めるのに役立つ 6 つのPythonコーディング プロジェクトを紹介します。
1. Llama 2、Streamlit、Replicate でチャットボットを作成する
OpenAI の GPT 3.5 または 4 に依存せずにチャットボットを実行したい場合は、Meta の Llama 2 言語モデルと Streamlit Web フレームワークを組み合わせることで簡単に実行できます。 Streamlit の上級開発者アドボケートである Chanin Nantasenamat が、 GitHub リポジトリ、 YouTube ビデオ、およびブログ投稿でこれがどのように機能するかを詳しく示しています。
このプロジェクトを実装するには、 Replicateアカウント (GitHub アカウントでのログインが可能) と API トークンが必要です。小規模なタスクで時々 Replicate を使用するだけであれば、無料オファーで十分です。大規模なモデルや多くのクエリが使用される場合、状況は異なって見えます。無料の Replicate アカウントには標準 API トークンが付属している必要があります。そうでない場合は、新しいものを生成できます。
プロジェクトのセットアップ
まず、Git を使用してコードをローカルにダウンロードします。これは次のコマンドで機能します。
git clone https://github.com/dataprofessor/llama2.git
Git を使用しない場合は、 GitHub 経由でデータを含む zip アーカイブをダウンロードし、ローカル コンピューターで解凍することもできます。作業ディレクトリをプロジェクト フォルダーに合わせた後、 venv
使用して Python 仮想環境を作成できます (これには任意のツールを使用できます)。
python -m venv env
次に、次のコマンドを使用してこの環境をアクティブ化します。
-
source env/bin/activate
(Mac) または -
envScriptsactivate
(Windows)。
次のステップは、必要なパッケージをインストールすることです。これを行うには、次を使用します。
pip install -r requirements.txt
API キーを使用して Streamlit ファイルをローカルで実行するには、ドキュメントでは、メイン プロジェクト ディレクトリの下の .streamlit ディレクトリにあるsecrets.toml
ファイルにファイルを保存することを推奨しています。 git
を使用する場合は、 .streamlit/secrets.toml
ファイルを.gitignore
ファイルに追加する必要があります。 secrets.toml
次のような形式になっている必要があります。
REPLICATE_API_TOKEN = "your_replicate_token"
これは、ユーザーがトークンを使用してリクエストを行う場合に機能します。アプリケーションをローカルで実行してみることもできます。こうすることで、ユーザーが自分のキーを入力する必要がある場合に何が起こるかを確認できます。私たちの Mac では、アプリケーションはsecrets.toml
がないと実行できません。これは、 REPLICATE_API_TOKEN
の値を設定せず、 secrets.toml
に小さな追加を追加することで修正できます。
FAKE_TOKEN = "some fake token"
したがって、次のターミナル コマンドを使用して、Streamlit アプリをローカルで実行できるようになります。
streamlit run streamlit_app_v2.py
アプリケーションを Web 上にデプロイする場合、無料のStreamlit Community Cloudアカウントは、これを実現するための最も簡単なオプションの 1 つです。 GitHub アカウントからアプリケーションを直接デプロイできるようになります。 セットアップと展開については、詳細な手順を参照してください。 Replicate API の露骨なコストを回避するには、必ず GitHub リポジトリを「プライベート」に設定するか、ユーザーに独自の API キーを使用するように依頼する必要があります。
Streamlit アプリケーションを共有するもう 1 つの簡単なオプションは、 Hugging Face Streamlit Spaces経由でアプリケーションを展開することです。 Dockerユーザーの場合は、Brian Hess (Snowflake のフィールド CTO および Amazon Web Services の分析スペシャリスト) によって開発されたDockerize ツールをお勧めします。
2. Matplotlib、Streamlit、OpenAI を使用してデータを視覚化する
次のチュートリアルでは、.csv ファイルをアップロードし、それらについて質問できるアプリケーションについて説明します。その代わりに、Matplotlib で生成されたチャートが返されます。アプリを実装するには、OpenAI API キーが必要です。下のボタンをクリックすると、アカウントを作成できます。
プロジェクトのセットアップ
完了したら、次のコマンドを使用してリポジトリの Git クローンを作成します。
git clone https://github.com/michaelweiss/chat-with-your-data.git
次に、プロジェクト ディレクトリに移動し、仮想 Python 環境を作成してアクティブ化します (前のプロジェクトを参照)。アプリケーションをローカルで実行している場合は、次のコマンドを使用して OpenAI キーを設定します。
export OPENAI_API_KEY="your_open_ai_key"
次に、必要なパッケージをインストールします。
pip install openai pandas streamlit matplotlib
最後に、次のようにしてアプリケーションを実行します。
streamlit run chat_data.py
大規模言語モデルがクエリから使用可能な Python コードを生成するには、出力に上記のスクリーンショットのような図が含まれている必要があります。すべての LLM 駆動アプリケーションと同様に、コードが適切に動作するようにプロンプトを最適化する必要がある場合があります。
プロジェクト作成者 Michael Weiss はMIT オープンソース ライセンスに基づいてリポジトリをリリースしているため、どのような目的でも使用または変更することができます。
3. OpenAI、LangChain、Chainlit を使用してドキュメントをクエリする
この Python プロジェクトを使用すると、テキスト ドキュメントをアップロードし、その内容について質問する簡単なアプリを作成できます。このアプリケーションは、たとえば、新しく受信した文書の 1 回限りの要約をできるだけ早く作成する場合に適しています。あるいは、この機会を他の人にも利用できるようにするためです。
このプロジェクトでは、LLM を利用したチャット アプリケーション用に特別に設計された、比較的新しいChainlitフレームワークを使用します。ドキュメントをアプリにアップロードするたびに、ドキュメントは大規模な言語モデルによって処理されます。これにより、文書がその意味を表す数値に変換されます。今後、ドキュメントを複数回クエリする場合 (ソフトウェア ドキュメントなど)、このアプリケーションは効率的ではありません。このシナリオでは、後で使用できるように入力を保存する次のプロジェクトをお勧めします。
プロジェクトのセットアップ
このアプリケーションには (アクティブ化された) 仮想 Python 環境も必要です。別の LLM を使用するようにソース コードを変更しない限り、OpenAI API キーも必要になります。要件が満たされている場合は、必要なパッケージをインストールします。
pip install python-dotenv langchain chromadb tiktoken chainlit openai
次のステップでは、Chainlit からサンプル コードをコピーします。これには、下のボタンをクリックしてアクセスできます。
次に、OpenAI キーを入力するか、別のより安全な方法でコードを更新してキーをロードします。たとえば、 python-dotenv
ライブラリと.env
ファイルを使用します。
Chainlit にはいくつかの特別な機能があります。デフォルトの Web アプリケーションには、ユーザーの質問に答えるために LLM が実行する手順と最終的な答えが表示されます。さらに、フレームワークにはチャットボットに焦点を当てたデコレータもあります。
-
@cl.on_message
ユーザーが質問を入力したときに実行する必要があるすべてのものを指定します。 -
@cl.on_chat_start
アプリの起動時に実行されるコードを担当します。
次のターミナル コマンドはアプリケーションを起動します (ローカルホスト上のブラウザで開く必要があります)。
chainlit run -w qa.py
-w
引数を指定すると、基礎となるapp.py
ファイルが更新され保存されるたびに、アプリが自動的に再読み込みされます。
アプリケーションを実行すると、Chainlit はプロジェクト ディレクトリに新しいchainlit.md
ファイルを作成します (まだ存在しない場合)。このファイルはアプリケーションの Readme タブに表示され、必要に応じて編集できます。さらに、アプリケーションの出力には、関連するソースドキュメントへのリンクも含まれています。こうすることで、答えが正しいかどうかを直接確認できます。
LangChain に精通している場合は、アプリケーションのコードを更新してファイル タイプのオプションを追加することもできます。 .pdf ファイルなど、いくつかの追加のLangChain ドキュメント ローダーをお勧めします。
Chainlit はまだ比較的新しいため、運用アプリケーションには推奨されません。ただし、単純で生成的なチャット インターフェイスを簡単にプログラムする方法を探しているだけであれば、このフレームワークは一見の価値があります。 Chainlit Cookbook Repositoryには、他にも数十のテスト対象アプリケーションがあります。
Chainlit アプリケーションを共有するためのクラウド サービスがまもなく利用可能になります。現時点では、導入に関する推奨事項は、いくつかのチュートリアル (たとえば、このYouTube ビデオ )に限定されています。
4. LangChain、OpenAI、Gradio を使用してドキュメントをクエリする
このセクションで説明するチャットボット アプリケーションでは、複数のドキュメントを処理および保存できます。その後、LLM はこの入力のみに基づいてユーザーの質問に回答します。この方法は、検索拡張生成(RAG) とも呼ばれます。
このアプリケーションのコードは、 LangChain の作成者である Harrison Chase の GitHub リポジトリから取得されており、デフォルトで、2022 年の米国政府の「一般教書」演説を含むテキスト ファイルが含まれています。開始するには、コードのクローンを作成します (または、下のボタンをクリックしてダウンロードします:
プロジェクトのセットアップ
次に、前のプロジェクトと同様に、仮想 Python 環境をセットアップし、 プロジェクトの README ファイルの手順 0、1、2 に従います。これで、次のコマンドを使用して、デフォルトのテキストを使用して Gradio Web アプリケーションをローカルで起動できるようになります。
python app.py
Gradio は、データ サイエンスを目的として設計された Web フレームワークであり、ストリーミングチャットボット用の機能が組み込まれています。 Gradio は使いやすさとカスタマイズ性のバランスが取れており、そのドキュメントは充実しているだけでなく、理解しやすいものでもあります。 Gradio UI に加えて、アプリにはドキュメントをクエリするためのコマンド ライン アプリケーションもあります。
python cli_app.py
デフォルトのアプリケーションが起動したら、選択したドキュメントを使用してカスタマイズできます。これを実装する 1 つの方法は、次の 5 つの手順を実行することです。
vectorstore.pkl
ファイルとstate_of_the_union.txt
ファイルを削除します。
2. docs フォルダーを作成し、そこにクエリする 1 つ以上のドキュメントを置きます。ここでは、Samuel Bowman 著の PDF ファイル「 大規模言語モデルについて知っておくべき 8 つのこと」および Nvidia の「 大規模言語モデルの初心者ガイド」を使用しました。
3. ingest_data_.py
ファイル内で、次の行 ( print("Loading data....")
) の直後の 9 行と 10 行) を変更します。
loader = UnstructuredFileLoader("state_of_the_union.txt")
raw_documents = loader.load()
に
raw_documents = []
for file in os.listdir('docs'):
if file.endswith('.pdf'):
pdf_path = './docs/' + file
loader = PyPDFLoader(pdf_path)
raw_documents.extend(loader.load())
elif file.endswith('.docx') or file.endswith('.doc'):
doc_path = './docs/' + file
loader = Docx2txtLoader(doc_path)
raw_documents.extend(loader.load())
elif file.endswith('.txt'):
doc_path = './docs/' + file
loader = TextLoader(doc_path)
raw_documents.extend(loader.load())
ファイルの先頭にも次のように追加します。
import os
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader
from langchain.document_loaders import TextLoader
4. query_data.py
ドキュメントがカバーするトピックを反映するように、「最新の組合の状況」または「組合の最新の状態」という各語句を変更します。
5. app.py
のタイトル (57 行目) も変更する必要があります。元のコード:
"
ここでも、取り上げたいトピックを入力します。また、71 行目のプレースホルダー テキストと 78 行目から始まる例も変更します。PDF ファイルも使用する場合は、 pypdf
ライブラリもインストールする必要があります。これは次のコマンドで機能します。
pip install pypdf
次に、 python ingest_data.py
を再度実行し、 python app.py
でアプリケーションを起動します。
Gradio アプリケーションを Hugging Face Spaces にデプロイするのは簡単です。 API キーを使用して公開サイトでアプリケーションにアクセスできるようにすることは避けてください。オプションの 1 つは、単純なパスワード保護を追加することです。これを行うには、次のコードを編集します。
gr.ChatInterface(predict).queue().launch()
次のようになります:
gr.ChatInterface(predict).queue().launch(auth=("theUserName", "thePassword"))
Hugging Face 以外にも、クラウド サービス経由やDockerコンテナーなどのデプロイメント オプションもあります。
5. LangChain、OpenAI、FastAPI を使用した LLM ベースの Web リサーチ
GPT Researcherプロジェクトは、イスラエルのウェブホスト Wix の研究開発責任者である Assaf Elovic 氏によるものです。結果として得られるアプリケーションは、LLM プロジェクト用に特別に設計された Tavily 検索エンジンを使用します。現在は無料ですが、担当者によると、入力はモデルとアルゴリズムを最適化するために使用されるとのことです。
プロジェクトのセットアップ
公式README ファイルの形式で、高品質のステップバイステップのインストール ガイドが提供されています。 ビデオチュートリアルも利用できます。重要: このプロジェクトを実行するには、少なくとも Python バージョン 3.11 が必要です。他の Python ディストリビューションも使用する場合は、必ず正しいバージョンで仮想環境を作成し、アクティブ化してください。
次に、必要なパッケージをインストールします。
pip install -r requirements.txt
次に、 .env
ファイルを作成し、次のように OpenAI API キーを追加します。
OPENAI_API_KEY="your-key-here"
次に、次のようにしてアプリケーションを起動します。
uvicorn main:app -reload
ブラウザ ( https://localhost:8000 ) に開始画面が表示され、「開始」ボタンをクリックして開始できます。クエリを入力すると、エージェントは複数のソースを検索し、レポートを生成します。後者のコンパイルには時間がかかります。このアプリには、レポートにソース リンクも含まれているという利点があります。
最近の出来事のため、私たちは LLM チャットボットに、キツツキが本能に従わないようにする方法を尋ねました。
クエリの結果は、概要、序文、いくつかのトピックセクション (「非致死的抑止方法」や「積極的なピッキング対策」など)、および結論と参考文献を含む、このテーマに関する詳細な論文でした。質問に答えるレポートに加えて、主要なリソースに関するさまざまな詳細を提供するソース レポートを要求することもできます。
さらに、GPT Researcher が使用する LLM を変更することもできます。ただし、OpenAI のモデルがこのタスクに最適であると考えられているため、これはお勧めできません。 GPT Researcher をローカルで実行する機能に加えて、 Docker コンテナーで GPT Researcher を実行するためのガイドもあります。
6. LlamaIndex、SQLAlchemy、OpenAI を使用して NLP から SQL へ
テキストを SQL に変換するにはさまざまな方法があります。 1 つは、Llamaindex と SQLAlchemy を使用するこのサンプル プロジェクトに関するものです。前者は、LLM アプリケーションをデータで強化するために開発されました。 SQLAlchemy は、Python データベース用のツールキットです。重要: このプロジェクトには Web フロントエンドが含まれておらず、コマンド ライン経由で実行されます。 Python コードに関しては、主にLlamaindex のサンプル ノートブックを使用しました。
プロジェクトのセットアップ
最初の 5 つのプロジェクトと同様に、まず新しいディレクトリを作成し、仮想 Python 環境を作成してアクティブ化してから、必要なパッケージをインストールする必要があります。
pip install openai sqlalchemy llama-index
OpenAI を使用したくない場合は、LlamaIndex が他の LLM API オプションを提供します。 標準 LLM をローカルで実行することもできます。サンプル ノートブックでは、API キーをメイン ファイルに明示的に保存します。これは Git リポジトリの一部であるため、GitHub でキーを公開したくない場合には不便です。代わりに、次のことをお勧めします。
pip install python-dotenv
次に、 .env
ファイルを作成します。
OPENAI_API_KEY="my_api_key"
次に、次のコードを新しいapp.py
スクリプトに貼り付けます。
import os
import openai
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
次のステップでは、サンプル コードの一部をapp.py
スクリプトに貼り付けました。
from llama_index.indices.struct_store.sql_query import NLSQLTableQueryEngine
from sqlalchemy import text
from sqlalchemy import insert
from llama_index.llms import OpenAI
from llama_index import SQLDatabase, ServiceContext
from sqlalchemy import (
create_engine,
MetaData,
Table,
Column,
String,
Integer,
select,
)
# Create a sample database and table
engine = create_engine("sqlite:///:memory:")
metadata_obj = MetaData()
table_name = "city_stats"
city_stats_table = Table(
table_name,
metadata_obj,
Column("city_name", String(16), primary_key=True),
Column("population", Integer),
Column("country", String(16), nullable=False),
)
metadata_obj.create_all(engine)
# Set up an LLM
llm = OpenAI(temperature=0.1, model="gpt-3.5-turbo")
service_context = ServiceContext.from_defaults(llm=llm)
# Create a database object from that table that sqlalchemy can use
sql_database = SQLDatabase(engine, include_tables=["city_stats"])
# Add some sample data to the table
sql_database = SQLDatabase(engine, include_tables=["city_stats"])
rows = [
{"city_name": "Toronto", "population": 2930000, "country": "Canada"},
{"city_name": "Tokyo", "population": 13960000, "country": "Japan"},
{"city_name": "Chicago", "population": 2679000, "country": "United States"},
{"city_name": "Seoul", "population": 9776000, "country": "South Korea"},
]
for row in rows:
stmt = insert(city_stats_table).values(**row)
with engine.begin() as connection:
cursor = connection.execute(stmt)
# Check to see if the table exists and is usable
stmt = select(
city_stats_table.c.city_name,
city_stats_table.c.population,
city_stats_table.c.country,
).select_from(city_stats_table)
with engine.connect() as connection:
results = connection.execute(stmt).fetchall()
print(results)
# Try running a basic SQL query on this table using sqlalchemy
with engine.connect() as con:
rows = con.execute(text("SELECT city_name, country from city_stats"))
for row in rows:
print(row)
# At last! Time to try a natural language query
query_engine = NLSQLTableQueryEngine(
sql_database=sql_database,
tables=["city_stats"],
)
query_str = "Which city has the largest population, and what is that population??"
response = query_engine.query(query_str)
print(f"Answer: {response}")
# You can also see the query in the sqlalchemy metadata
print("Generated from the following SQL:")
print(response.metadata["sql_query"])
ニーズに合わせてクエリとデータをカスタマイズした後、単純なpython app.py
ターミナル コマンドを使用してアプリケーションを実行できるようになりました。
その他の GenAI Python プロジェクト
Python でより生成的な AI プロジェクトに取り組みたい場合は、次のオンライン リソースを参照する価値があります。
(FM)