AI
基本概念
AIGC と AGI
AIGC(AI-Generated Content、AI 生成コンテンツ) とは、人工知能技術を使って各種コンテンツを自動生成することです。典型的な応用は次の通りです。
- テキスト生成:ニュース記事、広告文、商品説明など。
- 画像生成:画像素材、アート制作、デザインなど。
- 音声生成:音楽、ラジオ放送など。
- 動画生成:動画編集、映画予告など。
例:ChatGPT、Grok、元宝、千問などは AIGC ツールです。
AGI(Artificial General Intelligence、汎用人工知能) の目標は、人間のように思考、学習、複数タスクの実行ができるシステムを作ることです。現在はまだ実現していません。
大規模モデル分類(入力モダリティ別)
| 種類 | 説明 | 典型タスク |
|---|---|---|
| 言語大規模モデル | NLP を基礎にし、テキストを処理します | 対話、文章作成、翻訳 |
| 視覚大規模モデル | CV を基礎にし、画像を処理します | 画像認識、物体検出、画像生成 |
| マルチモーダル大規模モデル | テキスト、画像、音声などを同時に処理します | 画像文理解、動画説明、クロスモーダル検索 |
Transformer アーキテクチャ
現代の大規模モデル(例:GPT、BERT、Qwen)は、ほぼ Transformer アーキテクチャを基礎にしています。
Transformer は深層学習アーキテクチャの一つです。中心の考え方は、Attention によって系列内の異なる部分の関係を捉えることです。以前のモデル(例:RNN)のように、順番に一歩ずつ処理する方式ではありません。
特徴:
- 並列計算:RNN のように一歩ずつ計算する必要がなく、すべての入力を同時に処理できます。
- 長距離依存の捕捉:Attention により、系列内で遠く離れた部分どうしの関係を捉えられます。
- 高い拡張性:多くの層を積み重ね、大規模なモデルを作れます。
Self-Attention
Self-Attention(自己注意)は、系列データを処理するための仕組みです。特に深層学習の Transformer モデルで広く使われます。直感的には次のように理解できます。
- 自分自身に注目する能力: Self-Attention は、入力系列を処理する時、各位置どうしの関係に注目できます。単純に順番に一つずつ処理するだけではありません。
- 自己注意重み: 各入力位置について、Self-Attention は他の位置との関連度を計算します。これを自己注意重みと呼びます。これらの重みは、各位置が系列全体の中でどれだけ重要かを表します。
- 情報の集約: 各位置の自己注意重みを、対応する位置の特徴ベクトルと掛け合わせ、その結果を加重和にすることで、入力系列の情報を集約し、新しい表現を作ります。
- 並列計算: Self-Attention は各位置の自己注意重みを並列に計算できるため、実用上は効率が高いです。
まとめると、Self-Attention は系列データを処理する時に、異なる位置の情報を同時に見ます。そして位置どうしの関係に基づいて情報を抽出、集約することで、系列データをよりよく理解し、モデル性能を改善します。
Embeddings モデル
Embeddings(埋め込み)は自然言語処理(NLP)で重要な役割を持ちます。目的は、単語やフレーズなどの高次元で離散的なテキストデータを、低次元で連続的なベクトル表現に変換することです。これらのベクトルは単語自体の意味だけでなく、単語間の意味関係や構文関係も表します。Embeddings により、そのままでは扱いにくいテキストデータを、機械学習モデルが理解し操作できる形にできます。各社はそれぞれ自社の Embeddings モデルを持っています。
非構造化テキストを計算可能なベクトルへ変換し、意味情報を保持します。
ある単語がいくつかの文脈で別の単語とよく一緒に出現する場合、この二つの単語の埋め込みベクトルはベクトル空間内で近い位置になります。これは、似た意味や意味関係を持つことを表します。たとえば、queen と king は近く、man と woman も近くなります。
コサイン類似度
コサイン類似度は、二つの非ゼロベクトルのなす角を測る指標です。二つのベクトルがどの程度同じ方向を向いているかを表します。値の範囲は [-1, 1] です。
- 1:完全に同じ方向(高い類似)
- 0:直交(無関係)
- -1:完全に反対方向
公式:
ここで:
- A・B はベクトル A とベクトル B の dot product です。
np.dot(a, b)で計算します。 - ||A|| と ||B|| は、それぞれベクトル A とベクトル B の L2 ノルム(ユークリッド長)です。
np.linalg.norm(a)とnp.linalg.norm(b)で計算します。
各種大規模モデル API 呼び出しに慣れる
OpenAI の API は、開発者がインテリジェントなアプリケーションを作るための強力なツールです。AI 分野の初心者でも経験ある開発者でも、Python から OpenAI ライブラリを使う方法は必須スキルです。
OpenAI ライブラリを使って中国国内の大規模モデルへ接続する方法は、千問、智譜、百川、文心一言など、複数分野で広く使われています。
コードを書く前に、新しい Python 環境(3.11 以上)と OpenAI ライブラリがインストールされていることを確認します。次のコマンドでインストールできます。
pip install openaiOpenAI のパラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
model | str | 必須。モデル名を指定します(例:gpt-4o, glm-4) |
messages | list | 必須。対話履歴です。role(system/user/assistant)と content を含みます |
max_tokens | int | 出力長を制御します(token 数) |
temperature | float (0–2) | ランダム性を制御します。低い値(<0.5)は決定性が強く、論理/数学に向きます。高い値(≥1)は創造性が強く、文章作成に向きます |
top_p | float (0–1) | 別のランダム性制御です。通常は temperature とどちらか一方を使います |
n | int | 独立した回答を何個返すかを指定します(デフォルト 1) |
stream | bool | ストリーム出力するかどうかです(逐次返却) |
stop | str/list | 指定文字列に到達した時に生成を停止します |
presence_penalty | float [-2,2] | 新しい話題の導入を促します(同じテーマの重複を防ぐ) |
frequency_penalty | float [-2,2] | 同じ語句の重複を抑えます(冗長さを防ぐ) |
tools / tool_choice | dict | Function Calling をサポートします |
推奨値:
- 創作文章 →
temperature=1.0~1.5 - 論理推論/コード →
temperature=0.2~0.5
コードで ChatGPT と対話する
client = OpenAI(
base_url='',
api_key='your_apikey',
)
completion = client.chat.completions.create(
model="gpt-40-mini",
messages=[
{"role": "system", "content": "あなたは賢いアシスタントです"},
{"role": "user", "content": "200字の保護者会の感想を生成してください。"}
]
)
print(completion.choices[0].message)例:Embeddings で指定情報をベクトル化する
要件:コメントの csv ファイルがあり、id,time,userId,goodId,Score,Summary,Text フィールドを持っています。Summary と Text をベクトル化します。
from openai import OpenAI
import pandas as pd
# データを読み込む
df = pd.read_csv('datas/file.csv', index_col=0)
df = df[['Time', 'UserId', 'Score', 'Summary', 'Text']].dropna()
df['Text_content'] = 'Summary:' + df['Summary'].str.strip() + "; Text:" + df['Text'].str.strip()
# クライアントを初期化
client = OpenAI(base_url="https://open.bigmodel.cn/api/paas/v4", api_key="your_api_key")
# テキストを Embedding へ変換
def text_to_embedding(text, model="embedding_model"):
return client.embeddings.create(input=text, model=model).data[0].embedding
df['embedding'] = df['Text_content'].apply(lambda x: text_to_embedding(x))
df.to_csv('datas/output.csv')例:キーワード/一文から似ているユーザーコメントを検索する
import numpy as np
import ast
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def search_similar_text(df, query, top_n=3):
# 文字列 embedding をベクトルへ変換
df['embedding_vector'] = df['embedding'].apply(ast.literal_eval)
query_vec = text_to_embedding(query)
# 類似度を計算
df['similarity'] = df['embedding_vector'].apply(
lambda v: cosine_similarity(v, query_vec)
)
# 最も似ている top_n 件のコメントを返す
results = (df.sort_values('similarity', ascending=False)
.head(top_n)['Text_content'])
for r in results:
print(r.replace('Summary:', '').replace('; Text:', ''))
print('-' * 30)