Reference:Datawhale wow agent day05
本地インストール Ollama#
Reference:Datawhale wow rag class02
私たちは 4 番目の方法を採用します:Ollama をローカルにインストールし、ローカルにモデルをインストールした後、Llama-index で Ollama のサービスを使用します。
- https://ollama.com にアクセスし、対応するバージョンをダウンロードします。
- モデルを D ドライブに移動したいと思います。C:\Users\XX\AppData\Local\Programs\Ollama と C:\Users\XX.ollama を D ドライブに移動し、同じフォルダーに置きます。次に、環境変数を変更します:元の C:\Users\XX\AppData\Local\Programs\Ollama パスを新しい位置に更新し、システム変数に OLLAMA_MODELS という名前の変数を新しく作成し、その値をモデルファイルの新しい位置に設定します。例えば D:\Ollama\models。私たちは、ローカルネットワーク内のどのコンピュータからでもアクセスできることを望んでいます。これも新しい環境変数を作成することで解決します。 変数名: OLLAMA_HOST 変数値: 0.0.0.0:11434 。
- 成功したかどうかを確認します。コマンドプロンプトを開き、ollama と入力します。Usage: Available Commands: のような情報が表示されれば、インストールは成功です。
- qwen2:7b をインストールします。 ollama run qwen2:7b を実行します。success が表示されれば、インストールは成功です。ブラウザに 127.0.0.1:11434 と入力し、Ollama is running が表示されれば、ポートは正常に動作しています。
jupyternotebook で ollama を設定する#
%pip install llama-index-core
%pip install llama-index-embeddings-ollama
%pip install llama-index-llms-ollama
%pip install llama-index-readers-file
%pip install llama-index-vector-stores-faiss
%pip install llamaindex-py-client
ここでは、チュートリアルに比べて base_url を変更しました。
# 対話モデルを設定する
from llama_index.llms.ollama import Ollama
llm = Ollama(base_url="http://127.0.0.1:11434", model="qwen2:7b")
# Embeddingモデルを設定する
from llama_index.embeddings.ollama import OllamaEmbedding
embedding = OllamaEmbedding(base_url="http://127.0.0.1:11434", model_name="qwen2:7b")
# 対話モデルをテストする
response = llm.complete("あなたは誰ですか?")
print(response)
# 埋め込みモデルをテストする
emb = embedding.get_text_embedding("こんにちは")
len(emb), type(emb)
Output:
私はアリババクラウドが開発した超大規模言語モデルで、通義千問と呼ばれています。AI アシスタントとして、私の目標はユーザーが正確で有用な情報を得る手助けをし、さまざまな問題に答え、問題解決の思考や手順を提供することです。私は科学、技術、教育、文化など、さまざまな分野の質問に答えることができ、多言語でコミュニケーションを取ることができます。知りたいことがあれば、いつでもお知らせください。できる限りお手伝いします!
(3584, list)
データベースを作成する#
import sqlite3
# データベースを作成する
sqllite_path = 'llmdb.db'
con = sqlite3.connect(sqllite_path)
# テーブルを作成する
sql = """
CREATE TABLE `section_stats` (
`部門` varchar(100) DEFAULT NULL,
`人数` int(11) DEFAULT NULL
);
"""
c = con.cursor()
cursor = c.execute(sql)
c.close()
con.close()
このコードスニペットの主な機能は、SQLite データベースを初期化し、部門と人数情報を保存するためのテーブルを作成することです。
いくつかのデータを埋め込む:
con = sqlite3.connect(sqllite_path)
c = con.cursor()
data = [
["特許部",22],
["商標部",25],
]
for item in data:
sql = """
INSERT INTO section_stats (部門,人数)
values('%s','%d')
"""%(item[0],item[1])
c.execute(sql)
con.commit()
c.close()
con.close()
対話モデルと埋め込みモデルを設定する#
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, Settings
from llama_index.core.tools import QueryEngineTool
from llama_index.core import SQLDatabase
from llama_index.core.query_engine import NLSQLTableQueryEngine
from sqlalchemy import create_engine, select
# デフォルトの大モデルを設定する
Settings.llm = llm
Settings.embed_model = embedding
## データベースクエリエンジンを作成する
engine = create_engine("sqlite:///llmdb.db")
# データを準備する
sql_database = SQLDatabase(engine, include_tables=["section_stats"])
query_engine = NLSQLTableQueryEngine(
sql_database=sql_database,
tables=["section_stats"],
llm=Settings.llm
)
コードの詳細:
- create_engine は SQLAlchemy が提供する関数で、データベースエンジンを作成します。
- SQLDatabase はデータベース接続をカプセル化するためのクラスです。engine は前のステップで作成したデータベースエンジンです。include_tables=["section_stats"] は、私たちが興味のあるテーブル、つまり section_stats テーブルを指定します。
- NLSQLTableQueryEngine は自然言語クエリを SQL クエリに変換するためのクラスです。sql_database=sql_database は、以前に作成した SQLDatabase オブジェクトをクエリエンジンに渡します。tables=["section_stats"] は、クエリを実行するテーブルを指定します。llm=Settings.llm は、自然言語を SQL クエリに変換するために使用する言語モデル(LLM)を指定します。
このコードの目的は、自然言語で SQLite データベースと対話できるシステムを設定することです。この方法により、ユーザーは SQL 文を直接書くことなく、自然言語を使用してデータベース内のデータをクエリできます。
ツールを作成する#
# ツール関数を作成する
def multiply(a: float, b: float) -> float:
"""2つの数字を掛け算して積を返します。"""
return a * b
multiply_tool = FunctionTool.from_defaults(fn=multiply)
def add(a: float, b: float) -> float:
"""2つの数字を加算して合計を返します。"""
return a + b
add_tool = FunctionTool.from_defaults(fn=add)
# データベースクエリエンジンをツール関数オブジェクトにカプセル化する
staff_tool = QueryEngineTool.from_defaults(
query_engine,
name="section_staff",
description="部門の人数をクエリします。"
)
テスト#
# ReActAgentを構築し、多くの関数を追加できますが、ここでは加算関数と部門人数クエリ関数だけを追加しました。
agent = ReActAgent.from_tools([add_tool, staff_tool], verbose=True)
# agentに指示を与える
response = agent.chat("データベーステーブルから`特許部`と`商標部`の人数を取得し、これら2つの部門の人数を合計してください!")
Output:
Running step 98f2e8d3-b1e4-4d1d-899d-494cbfb7d92d. Step input: データベーステーブルから
特許部
と商標部
の人数を取得し、これら 2 つの部門の人数を合計してください!
Thought: 私は section_staff ツールを使用して部門の人数をクエリし、2 つの部門の合計人数を計算する必要があります。
Action: section_staff
Action Input: {'input': ' 特許部 '}
Observation: 提供されたデータによると、"特許部" の部門には合計 22 人います。
Running step 075f2870-1484-4882-81df-220dfacebc59. Step input: None
Thought: "商標部" の人数も取得する必要があります。
Action: section_staff
Action Input: {'input': ' 商標部 '}
Observation: SQL クエリの結果は、' 商標部 ' に関連する 25 のエントリがあることを示しています。これは、この部門に関連する 25 の特定のタスク、文書、または活動があることを意味するかもしれません。
Running step 89a9b7df-6b2b-4baa-8054-047aefc7f48f. Step input: None
Thought: 2 つの部門の人数を合計する必要があります。
Action: add
Action Input: {'a': 22, 'b': 25}
Observation: 47
Running step 467a2f45-3cc8-455f-8136-c5f5cb85a34d. Step input: None
Thought: これ以上のツールを使用せずに答えることができます。
Answer:特許部
と商標部
の合計人数は 47 人です。
特許部
と商標部
の合計人数は 47 人です。