AI・生成AIの中核に、高校数学で習った「ベクトルの内積」が居座っている――と聞くと、意外に思われるかもしれません。しかしGIS技術者にとって、内積はむしろ馴染み深い計算です。座標、方位、傾斜、ポリゴンの判定…日常的に裏で動いています。
本記事では、GIS実務を入り口に、内積がどうやってChatGPTやRAGの中核になっているかを、Pythonコードを交えて解説します。
1. そもそも「内積」とは
2つのベクトルから、1つの数値(スカラー)を返す計算です。やることは単純で、同じ位置の要素を掛けて、すべて足す。それだけ。
import numpy as np
a = np.array([3, 4])
b = np.array([1, 2])
dot = np.dot(a, b) # 3*1 + 4*2 = 11
print(dot) # → 11
幾何学的には次の関係があります。
a・b = |a| × |b| × cos(θ)
ここから、2つのベクトルがどれだけ同じ方向を向いているかが分かります。
| 内積の値 | 角度θ | 意味 |
|---|---|---|
| 正(大) | 0°に近い | 同方向・類似 |
| 0 | 90° | 直交・無関係 |
| 負 | 180°に近い | 逆方向・対立 |
2. GISでの内積:斜面方位・進行方向・斜面解析
GIS技術者にとって、内積は地味だが頻出の道具です。
例1:斜面の向きと太陽方位の一致度
DEMから求めた斜面の方位ベクトルと、太陽方位ベクトルの内積を取れば、日射の当たりやすさが一発で出ます。
# 斜面方位(南向き)と太陽方位(南南東)
slope_vec = np.array([0, -1]) # 南
sun_vec = np.array([0.34, -0.94]) # 南南東
similarity = np.dot(slope_vec, sun_vec)
print(round(similarity, 3)) # → 0.94 (よく当たる)
例2:進行方向と目標方位の一致度
道路中心線に対して、ポイントが左右どちらにあるか――は外積で判定しますが、進行方向との一致度は内積で判ります。
heading = np.array([1, 0]) # 東向きに進行中
to_target = np.array([0.7, 0.7]) # 目標は北東
cos_sim = np.dot(heading, to_target) / (
np.linalg.norm(heading) * np.linalg.norm(to_target)
)
print(round(cos_sim, 3)) # → 0.707 (45°ズレ)
これ、コサイン類似度そのものです。GISの方位計算と、AIの意味類似度計算が、同じ数式で繋がる瞬間です。
3. AIは「言葉」を座標に変える
ここからがAIの話です。ChatGPTのようなAIは、文字そのものは理解できません。そこで単語・文・画像を、高次元の数値ベクトルに変換(Embedding) します。
"森林" → (0.21, -0.05, 0.88, ..., 0.12) # 1536次元
"林業" → (0.19, -0.03, 0.85, ..., 0.10)
"コンビニ" → (-0.42, 0.71, -0.11, ..., 0.55)
設計思想は、意味が近いものは、ベクトルも近くなること。GISで言えば、属性空間における座標みたいなものです。
4. 「意味の近さ」を内積で測る
意味の近さは、ベクトル間の角度――つまりコサイン類似度(内積) で測ります。
from numpy.linalg import norm
def cos_sim(a, b):
return np.dot(a, b) / (norm(a) * norm(b))
forest = np.array([0.21, -0.05, 0.88])
forestry = np.array([0.19, -0.03, 0.85])
conveni = np.array([-0.42, 0.71, -0.11])
print(cos_sim(forest, forestry)) # → 0.999 (ほぼ同義)
print(cos_sim(forest, conveni)) # → -0.4 (無関係〜対立)
これだけのことです。掛けて、足して、ノルムで割る。それで意味の類似度が出る。
5. ChatGPTの中身:Attentionも内積の塊
ChatGPTの中核は Transformer、そのまた中核は Attention(注意機構) という仕組みです。Attentionが何をしているかというと、
いま処理している単語は、文中の他のどの単語と関係が深いか?
を、全単語ペアの内積で計算しています。
たとえば「林齢の高い人工林を伐採し、再造林する」という文を処理する際、AIは内部で
- 「林齢」と「人工林」の内積 → 高い
- 「伐採」と「再造林」の内積 → 高い(対の概念)
- 「林齢」と「再造林」の内積 → 中
…という関連度マップを毎回作っています。1回の応答で、何百万〜何億回の内積が走っている計算です。
6. RAGとPostGIS:ベクトル検索という新潮流
GIS技術者として注目したいのが RAG(検索拡張生成) です。社内文書や条例、地域資料をAIに参照させて回答させる技術ですが、その根幹も内積。
[ユーザー質問] → ベクトル化
↓
[文書DB内の全ベクトルと内積計算]
↓
[上位N件を取得 → LLMに渡す]
しかも嬉しいことに、PostgreSQLの拡張 pgvector を使えば、PostGISと同じDB上でベクトル検索ができます。
-- pgvector で類似文書検索
SELECT title, content
FROM documents
ORDER BY embedding <#> '[0.21, -0.05, 0.88, ...]'::vector
LIMIT 5;
<#> は内積演算子。PostGISで ST_Distance を使うのと、感覚的にはほぼ同じです。空間検索とセマンティック検索が、同じDBで共存できる時代になりました。
7. まとめ:GIS技術者にとってAIは「遠くない」
整理するとこうなります。
| 用途 | ベクトルの中身 | 内積で分かること |
|---|---|---|
| GIS(方位) | (x, y) 座標差分 | 進行方向との一致度 |
| GIS(斜面) | 法線ベクトル | 日射・視認性 |
| AI(言語) | 1536次元の意味埋め込み | 単語・文の意味類似度 |
| RAG | 文書埋め込み | 質問と文書のマッチ度 |
数式は全部同じ。掛けて、足す。
GISをやってきた技術者にとって、AIは決して遠い世界の話ではありません。座標が「位置」を表すのと同じ要領で、ベクトルが「意味」を表す。それだけの話です。
次回は、pgvector + PostGIS で、地理情報と意味検索を組み合わせたハイブリッド検索の実装例を紹介する予定です。
#GIS #生成AI #ChatGPT #ベクトル #内積 #コサイン類似度 #Embedding #RAG #PostGIS #pgvector #Python #空間情報 #G空間 #地理情報システム


コメント