OpenAI の APIからRAG(File Search)をつかえるようにExcel VBA を修正した話

前回、下記の通り Excel VBA から OpenAI の Response API を使えるようにしました。

そこで今回は1歩先に進めて、Excel VBAからRAG連携するように改修しましたのでここにその内容を記録しておきます。

主に修正したのは下記の4箇所です。

修正①:RAGで使用するVector Store IDの設定

Vector Store IDについては以下の回で取得したものを設定しています。

修正②:max_output_tokensの変更

Response APIにてRAGを使うようになりOpenAIからのレスポンスが大きくなってきたので値を2000から10000に大きくしています。

修正③:OpenAIへのリクエストに tools を追加

OpenAIへのリクエストの中に以下のJSONを追加し、file_search を行うようにしています。

  "tools": [
{
"type": "file_search",
"vector_store_ids": [
"vs_xxxxxxxxx"
]
}
]

修正④:JsonConverterを使う形に変更

Response APIにてRAGを使うようになりOpenAIからのJSONが複雑、かつUnicodeエスケープ化されて返ってくるようになったので、JsonConverterを利用するように変更しています。

上記3つを修正した結果は以下の通りです。

Option Explicit

Const API_URL As String = "https://api.openai.com/v1/responses"

'★①RAGで使用するVector Store ID
Const VECTOR_STORE_ID As String = "vs_xxxxxxxxxx"

Sub ApplyAddressCorrection()
Dim apiKey As String
Dim text As String
Dim response As String
Dim responseArray() As String
Dim ws As Worksheet
Dim i As Long

Set ws = ActiveSheet
ws.Range("B5").CurrentRegion.ClearContents

apiKey = Environ("OPENAI_API_KEY")

If apiKey = "" Then
MsgBox "OpenAI APIキーが設定されていません。", vbCritical
Exit Sub
End If


text = ws.Range("B2").Value & ws.Range("B3").Value

'★②max_output_tokensを2000から10000に変更
'★③OpenAIへのリクエストに tools を追加
text = _
"{""model"":""gpt-5-nano""," & _
"""max_output_tokens"":10000," & _
"""input"":""" & text & """," & _
"""tools"":[{" & _
"""type"":""file_search""," & _
"""vector_store_ids"":[""" & VECTOR_STORE_ID & """]" & _
"}]}"

response = sendAPIRequest(API_URL, text, apiKey)

Debug.Print response

response = ExtractResponseText(response)

ws.Range("B5").Value = response

response = Replace(response, "\n", vbLf)
If ws.Range("D5").Value = "する" Then response = Replace(response, "。", "。" & vbLf)
responseArray = Split(response, vbLf)
For i = 0 To UBound(responseArray)
ws.Range("B" & 5 + i).Value = responseArray(i)
Next i
End Sub

Function sendAPIRequest(url As String, text As String, apiKey As String) As String
Dim request As Object
Set request = CreateObject("MSXML2.XMLHTTP")
request.Open "POST", url, False
request.setRequestHeader "Content-Type", "application/json"
request.setRequestHeader "Authorization", "Bearer " & apiKey
request.send text
sendAPIRequest = request.responseText
End Function

'★④JsonConverterを使う形に変更
Function ExtractResponseText(response As String) As String

Dim json As Object
Dim outputItem As Variant
Dim contentItem As Variant

On Error GoTo ErrorHandler

'JSON文字列を解析
Set json = JsonConverter.ParseJson(response)

'output配列を順番に確認
For Each outputItem In json("output")

'messageタイプを探す
If outputItem("type") = "message" Then

'content配列を確認
For Each contentItem In outputItem("content")

'output_textを探す
If contentItem("type") = "output_text" Then

'textを取得
ExtractResponseText = contentItem("text")
Exit Function

End If

Next contentItem

End If

Next outputItem

'output_textが見つからなかった場合
ExtractResponseText = response
Exit Function

ErrorHandler:

ExtractResponseText = response

End Function

実際にこれを実行したところ、以下のような結果となりました。

OpenAIのAPIをつかってRAGを行う為に検索対象のファイルを準備してみた

題名のとおり、OpenAIのAPIをつかってRAGを行う為に検索対象のファイルを準備してみました。

大まかな流れは以下の通りです。

① 検索対象ファイルを作成

② File APIへアップロード

  File IDを取得

③ Vector Storeを作成

  Vector Store IDを取得

④ File IDをVector Storeへ登録

   Responses APIからFile Search

1.検索対象ファイルを作成

とりあえず今回は以下の料理レシピを作成し、RAGとして登録してみることにしました。なお最初、別のデータをcsvで登録しようとしたのですがなぜかうまくいかなかったので、マークダウンファイル(recipe.md)として作成しました。

# 鶏の照り焼き

##材料
鶏もも肉 300g
しょうゆ 大さじ2
みりん 大さじ2
砂糖 大さじ1

##所要時間
約20分


# 親子丼

##材料
鶏もも肉 150g
卵 2個
玉ねぎ 1/2個
しょうゆ 大さじ1
みりん 大さじ1

##所要時間
約15分

2.File APIへアップロード

対象ファイルを作成したら、まずは下記の curl コマンドを利用し、OpenAIのFile APIにアップロードします。

このコマンドは Power Shell上で実行してください。cmdでは環境変数の指定の仕方などが違ってきます。

なお、$OPENAI_API_KEYでは環境編集として設定した API_Keyを読み込んでいます。また、purposeのところは色々な指定ができるようですが、今回は user_data (RAGなどの一般的なファイル利用に使える目的)としています。

curl https://api.openai.com/v1/files \
-H "Authorization: Bearer $env:OPENAI_API_KEY" \
-F purpose="user_data" \
-F file="@recipe.md"

うまくいくと以下のような回答が返ってきますので、”file-xxxxxxxxxxxxxxxx”(File ID)をメモしておきます。

{
"id": "file-xxxxxxxxxxxxxxxx",
"object": "file",
"bytes": 1234,
"created_at": 1750000000,
"filename": "recipe.md",
"purpose": "user_data"
}

3.Vector Storeを作成

次に以下の curlコマンドを実行し、Vector Storeを作ります。

curl.exe https://api.openai.com/v1/vector_stores `
-H "Authorization: Bearer $env:OPENAI_API_KEY" `
-H "Content-Type: application/json" `
-d '{\"name\":\"料理レシピRAG\"}'

こちらもうまくいくと以下のような回答が返ってくるので”vs_xxxxxxxxxxxxx”(Vector Store ID)をメモしておきます。

{
"id": "vs_xxxxxxxxxxxxx",
"object": "vector_store",
"name": "料理レシピRAG",
...
}

4.File IDをVector Storeへ登録

最後にこれまでで取得した”file-xxxxxxxxxxxxxxxx”(File ID)と”vs_xxxxxxxxxxxxx”(Vector Store ID)を使い、File IDをVector Storeへ登録します。

curl.exe https://api.openai.com/v1/vector_stores/vs-xxxxxxxx/files `
-H "Authorization: Bearer $env:OPENAI_API_KEY" `
-H "Content-Type: application/json" `
-d '{\"file_id\":\"file-xxxxxxxx\"}'

成功すると以下のような回答が返ってきます。

{
"id": "file-xxxxxxxxx",
"object": "vector_store.file",
"status": "in_progress",
"vector_store_id": "vs_xxxxxxxxx",
"created_at": 1750000000
}

なお、このとき大概の場合 “status”: “in_progress”となっているので、完了を確認するには以下のコマンドを続けて実行します。

curl.exe https://api.openai.com/v1/vector_stores/vs-xxxxxxxx/files/file-xxxxxxxx `
-H "Authorization: Bearer $env:OPENAI_API_KEY"

これで”status”: “completed”となっていれば完了です。

ちなみに冒頭で書いたように最初 csvで登録しようとしたら failed となったので、正しく登録できたかどうか”status”: “completed”になるまで確認したほうがよさそうです。

補足

OpenAI APIにはVector Storeに登録されたファイル一覧を取得したり、削除したりするAPIがあります。

1.Vector Storeに登録されたファイル一覧を取得する

curl.exe https://api.openai.com/v1/vector_stores/vs-xxxxxxxx/files `
-H "Authorization: Bearer $env:OPENAI_API_KEY"

これを実行すると以下のような回答が得られ、Vector Store内のファイル一覧を取得することが可能です。

{
"object": "list",
"data": [
{
"id": "file-xxxxxxxx",
"object": "vector_store.file",
"status": "completed"
}
]
}

2.Vector Storeに登録されたファイルを削除する

curl.exe -X DELETE "https://api.openai.com/v1/vector_stores/vs_XXXXXXXXXX/files/file-XXXXXXXXXX" -H "Authorization: Bearer $env:OPENAI_API_KEY"

正常に削除された場合、以下のメッセージが表示されます。

{
"id": "file-XXXXXXXXXX",
"object": "vector_store.file.deleted",
"deleted": true
}

Excel VBAから呼び出すOpenAIの APIをChat CompletionsからResponse APIに書き換えた話

前回、ExcelのVBAからOpenAIのChat Completions Responses APIを利用することで、質問に対するテキスト生成を行なってみました。

しかし、Response APIというものを使えば、単純なテキスト生成だけではなく、
・Web検索
・ファイル検索
・Function Calling
・Computer Use
・MCP
・複数ステップの処理
など、AIにツールを使わせる方向へ発展させやすいという話を聞いたのでそちらに書き換えてみることにしました。

1.主な変更点

Chat Completions APIとResponse APIはいろいろと違いがあるようですが、特に大きな違いは OpenAIからのレスポンスです。

Chat Completions APIでのレスポンスは、

"output_text": "回答"

のような単純なものでした。

一方で、Response APIのレスポンスの構造は以下のようになっており、その中の output 配列にメッセージやテキスト出力が入るようです。

response
├─ id
├─ object
├─ status
└─ output
└─ message
└─ content
└─ output_text
└─ text

2.Response APIへ書き換え

以下、書き換えた結果を記載しておきます。

Option Explicit

'★Response APIを利用する為にURLを変更
'Const API_URL As String = "https://api.openai.com/v1/chat/completions"
Const API_URL As String = "https://api.openai.com/v1/responses"

Sub ApplyAddressCorrection()
Dim apiKey As String
Dim text As String
Dim response As String
Dim responseArray() As String
Dim ws As Worksheet
Dim i As Long

Set ws = ActiveSheet
ws.Range("B5").CurrentRegion.ClearContents

apiKey = Environ("OPENAI_API_KEY")

If apiKey = "" Then
MsgBox "OpenAI APIキーが設定されていません。", vbCritical
Exit Sub
End If


text = ws.Range("B2").Value & ws.Range("B3").Value

  '★max_completion_tokensをmax_output_tokens変更
  '★messagesをinputに変更
'text = "{""model"": ""gpt-5-nano"", ""max_completion_tokens"": 2000" & ", ""messages"": [{""role"": ""user"", ""content"": """ & text & """}]}"
text = _
"{""model"":""gpt-5-nano""," & _
"""max_output_tokens"":2000," & _
"""input"":""" & text & """}"
response = sendAPIRequest(API_URL, text, apiKey)

Debug.Print response

  '★レスポンスの受け取り方(関数)を変更→①
'response = extractContent(response)
response = ExtractResponseText(response)

ws.Range("B5").Value = response

response = Replace(response, "\n", vbLf)
If ws.Range("D5").Value = "する" Then response = Replace(response, "。", "。" & vbLf)
responseArray = Split(response, vbLf)
For i = 0 To UBound(responseArray)
ws.Range("B" & 5 + i).Value = responseArray(i)
Next i
End Sub

Function sendAPIRequest(url As String, text As String, apiKey As String) As String
Dim request As Object
Set request = CreateObject("MSXML2.XMLHTTP")
request.Open "POST", url, False
request.setRequestHeader "Content-Type", "application/json"
request.setRequestHeader "Authorization", "Bearer " & apiKey
request.send text
sendAPIRequest = request.responseText
End Function

'①レスポンスを受け取る関数
Function ExtractResponseText(response As String) As String
Dim startPos As Integer
Dim endPos As Integer
Dim searchText As String

'"text"を検索
searchText = """type"": ""output_text"""
  ' InStr(開始位置, 検索対象, 検索文字列)
startPos = InStr(1, response, searchText)

If startPos = 0 Then
'extractContent = response
ExtractResponseText = response
Exit Function
End If

'output_textの後ろから"text"を検索
startPos = InStr(startPos, response, """text"": """)
If startPos = 0 Then
ExtractResponseText = response
Exit Function
End If

'"""text"": """ の文字数分だけ進める
startPos = startPos + Len("""text"": """)
'次のダブルクォーテーションを探す
endPos = InStr(startPos, response, """")

If endPos = 0 Then
'extractContent = response
ExtractResponseText = response
Exit Function
End If

'Mid(文字列, 開始位置, 文字数)
ExtractResponseText = Mid(response, startPos, endPos - startPos)


End Function

Excel のVBA(マクロ)から OpenAI の API を使ってみた

ExcelのVBAで作成したマクロから OpenAI の API が使えればいろいろと AI の活用範囲が広がりそうだったので、試してみることにしました。

なお、VBAの作成にあたっては、わちょんさんの以下の Youtubeを参考にさせていただきました。大変ありがとうございました。

ちなみに、この動画自体は3年前のもので、概要欄に書かれているコードをそのまま実行させても今の OpenAIでは動作しないようでしたので、「1.VBAの修正」の通り少し修正させていただきました。

1.VBAの修正

わちょんさんの概要欄に記載されているコードからの主な修正点は”★”の部分です。

Option Explicit
'★Chat Completions APIを使う場合のURLを変更
Const API_URL As String = "https://api.openai.com/v1/chat/completions"

Sub ApplyAddressCorrection()
Dim apiKey As String
Dim text As String
Dim response As String
Dim responseArray() As String
Dim ws As Worksheet
Dim i As Long

Set ws = ActiveSheet
ws.Range("B5").CurrentRegion.ClearContents

'★Windowsの環境変数にAPIキーを保存し、VBAから読み込む方法に変更
apiKey = Environ("OPENAI_API_KEY")

If apiKey = "" Then
MsgBox "OpenAI APIキーが設定されていません。", vbCritical
Exit Sub
End If

'★現行モデル"gpt-5-nano"の利用に変更
'★temperature = ws.Range("D3").Valueを削除
'★"max_tokens": 2000から"max_completion_tokens": 2000に変更
text = ws.Range("B2").Value & ws.Range("B3").Value
text = "{""model"": ""gpt-5-nano"", ""max_completion_tokens"": 2000" & ", ""messages"": [{""role"": ""user"", ""content"": """ & text & """}]}"
response = sendAPIRequest(API_URL, text, apiKey)

'★responseの中身を確認
Debug.Print response

'★extractContentの処理を2回→1回に変更し効率化
response = extractContent(response)
ws.Range("B5").Value = response

response = Replace(response, "\n", vbLf)
If ws.Range("D5").Value = "する" Then response = Replace(response, "。", "。" & vbLf)
responseArray = Split(response, vbLf)
For i = 0 To UBound(responseArray)
ws.Range("B" & 5 + i).Value = responseArray(i)
Next i
End Sub

Function sendAPIRequest(url As String, text As String, apiKey As String) As String
Dim request As Object
Set request = CreateObject("MSXML2.XMLHTTP")
request.Open "POST", url, False
request.setRequestHeader "Content-Type", "application/json"
request.setRequestHeader "Authorization", "Bearer " & apiKey
request.send text
sendAPIRequest = request.responseText
End Function

Function extractContent(response As String) As String
Dim startPos As Integer
Dim endPos As Integer

'★JSONの解析方法を変更
startPos = InStr(1, response, """content"": """)

If startPos = 0 Then
extractContent = response
Exit Function
End If

startPos = startPos + 12

endPos = InStr(startPos, response, """")

If endPos = 0 Then
extractContent = response
Exit Function
End If

extractContent = Mid(response, startPos, endPos - startPos)


End Function

2.Windowsの環境変数にAPIキーを保存

「1.VBAの修正」の中で記載の通り、Windowsの環境変数にAPIキーを保存し、VBAから読み込む方法にVBAを変更していますので、Windows11にて以下の操作を実行しています。

1.スタートボタンをクリック
2.「環境変数」と検索
3.「システム環境変数の編集」を開く
4.「システムのプロパティ」が開いたら、「環境変数」をクリック
5.「ユーザー環境変数」のところで 「新規」をクリック

上記の5.まで実施すると以下のウィンドウが表示されるので、
・変数名:OPENAI_API_KEY
・変数値:OpenAIで取得したAPIキー(sk-… )
を入力し、「OK」ボタンを押します。

Windows11のユーザ環境変数設定画面

この後、コマンドプロンプトを開いて下記のように入力し、APIキーが表示されれば登録成功です。(set コマンドで確認してもOK)

echo %OPENAI_API_KEY%

3.VBAの実行

ExcelにてセルのB2 および B3に OpenAIに質問したい事項を記入後、[ALT]+[F11]にてVBAの編集画面を起動し実行すれば、B5に OpenAIからの回答が出力されました。

ExcelからOpenAIのAPIにアクセスし回答が返ってきたところ

OpenAIのAPI利用条件が非常にわかりづらかった件と利用設定について

普段、私は ChatGPT を無料枠で使っているのですが、ふと OpenAI の APIを使ってみたくなりました。

ところがそのAPIの利用条件を調べてみてもいまいちわかりづらかったのでここで整理しておきます。

結論としては、
・ChatGPTの有料プランを購入しなくても OpenAI の API 利用は可能
・OpenAIのAPI利用はプランではなく完全に従量課金制
ということがわかりました。

また上記踏まえて、OpenAIのAPI利用設定を実施しましたので下記のとおり整理しておきます。

1.OpenAI API Platformにアクセス

下記のURLにアクセスしアカウントを作成後、ログインします。

OpenAI API Platform
https://openai.com/ja-JP/api/

2.API keyの作成

すると以下のような画面が表示されるので Get started のところに表示されている「1. Create an API key」をクリックし、API key を作成します。

OpenAI API Platform

なお、この時に作成したskから始まるAPI key は一度しか表示されないようですので、作成したら安全なところに保管してください。

3.クレジットの登録と支払い上限設定

API key を作成しただけでは API へアクセスできませんでした(自分の場合、無料枠はつきませんでした)ので、API を利用する為にクレジットの登録を行います。

上図の通り最上部のプルダウンから「Manage Projects」を選択後、左ペインの「Billing」を選択すると「Add payment details」のボタンが表示されるので、ここからクレジットカードを登録します。

OpenAI API Platform

なお、クレジットカードを登録した後に、下図の通り最初の購入額が設定できます。
ここで Use auto-reloadを OFF にすると最初の購入額を超えた API利用はできなくなり安心です。

OpenAI API Platform

実際にUse auto-reloadを OFF にするとこうなります。

OpenAI API Platform

最後に下記の画面で支払いの確認をすれば完了です。

OpenAI API Platform

4.支払い設定の確認

「Billing」にて auto-reload が OFF になっていることをあらためて確認します。
なおこの場合、残価が0円になるとAPIが自動的に利用できなくなりますので業務で定期的に利用している場合などは注意が必要ですね。

OpenAI API Platform

OpenAIのAPIを使った最初の PythonプログラムをMacで動かしてみたら意外とてこずった件

AIの本を読んでいて、OpenAIのAPIを使ってみたくなったので、Mac上で環境を用意し、PythonプログラムからOpenAI のAPIを呼び出してみました。

単純なプログラムを動かすだけなのですぐにできるだろうと思いましたが意外と手こずったので、ここにその時の記録を残しておきます。

エラー1.cannot import name ‘OpenAI’ from ‘openai’

まず Mac上で作成した Pythonのプログラム(test.py)を動かそうとして最初に発生したのがこのエラーでした。

% python test.py
Traceback (most recent call last):
File "/Users/XXX/tmp/test.py", line 1, in <module>
from openai import OpenAI
ImportError: cannot import name 'OpenAI' from 'openai' ・・・

原因はどうやら自分のMAC上の openai のライブラリが古いようで、以下のコマンドでバージョンアップしてあげることで解消しました。

% pip install --upgrade openai
Requirement already satisfied: openai in /Users/XXX/.pyenv/versions/3.10.0/lib/python3.10/site-packages (0.27.10)
Collecting openai
Downloading openai-2.52.0-py3-none-any.whl.metadata (40 kB)
 ・・・

エラー2.NameError: name ‘sk’ is not defined

そして次に遭遇したのがこのエラーです。

エラーの理由は単純で、あらかじめ取得しておいた api_keyをプログラム内に設定する際に””で括ってあげていない為でした。

ただしくは以下の通りに記述する必要があります。(本当はプログラム内に直接 APIキーを書かない方がいいですが。)

client = OpenAI(
api_key ="sk・・・・・"
)

エラー3.openai.RateLimitError

そして最後に遭遇したのがこのエラーです。詳しくは以下の通り出力されていました。

openai.RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}

このエラーの原因も単純で、まだこの時点ではOpenAI のWeb上から api_key を入手しただけで、支払い処理(クレジットカードの登録)を実施していなかった為でした。

OpenAI の APIの作成手続きを済ませた直後は無料枠が使えるのかと思っていましたが、そんなに甘くはないようです。(2027.8.1時点)

ついに成功

その後、支払いを済ませて再度プログラムを実行すると、正常動作しました。

% python test.py
こんにちは!元気ですか?何かお手伝いできることはありますか?

たとえばこんなことができます。
- 日本語↔英語の翻訳・添削
- 文章の要約・ブラッシュアップ
- アイデア出しや企画の構成作成
- 技術的な質問・コーディングのサポート
- 日常の相談・学習サポート

話したいトピックを教えてください。最近の話題でもOKです。

Mac OSにてpandocとpbpaste、pbcopyを利用して、ChatGPTの回答をコピペでいい感じに WordPressに貼り付けてみた

最近たまにChatGPTを利用することがあるのですが、そのChatGPTの回答をWordpressに貼り付けたいことってありませんか?

私は最近、それができたらいいなあとおもっていたところ、pandocというアプリケーションと Mac 標準の?pbpaste、pbcopyコマンドを利用して、比較的簡単に実現する方法を見つけたのでここに共有しておきます。

流れとしては、

1.pandocをMacにインストール
2.ChatGPTに質問し、その回答をコピー
3.コンソールで pandoc、pbpaste、pbcopyコマンドを実行
4.WordpressにてカスタムHTMLの部品を作成
5.カスタムHTMLにクリップボードの内容を貼り付け

といった感じです。

1.pandocをMacにインストール

HomebrewでMac OSに pandocをインストールしてもいいらしいのですが、私の環境ではうまくいかなかった(インストールはできたのかもしれませんが、PATHがうまく設定できず断念)したので、パッケージをダウンロードしてインストールしました。

jgm /pandoc 
https://github.com/jgm/pandoc/releases

2.ChatGPTに質問し、その回答をコピー

ChatGPTが回答すると、最後に以下のようなマークが出力されると思います。その中から左から2番目(赤枠部分)をクリックします。

そうすると、ChatGPTの回答がクリップボードに貼り付けられます。

3.コンソールで pandoc、pbpaste、pbcopyコマンドを実行

そしたら、Mac OSのコンソールから以下のコマンドを実行します。

 % pbpaste | pandoc --to=html | pbcopy

すると、自動的に クリップボードのデータがHTMLのタグ付きデータに変換されます。うーん、便利。

4.WordpressにてカスタムHTMLの部品を作成

クリップボードのHTMLのタグ付きデータを貼り付けたいので、WordPress の部品から、以下の通り「カスタムHTML」を選択します。

5.カスタムHTMLにクリップボードの内容を貼り付け

最後に、「カスタムHTML」の中にクリップボードの内容をペーストすれば完了です。

貼り付けた後、プレビュー でみてみれば完成イメージが確認できます。なお、このプレビュー は簡易的なので、実際にどう見えるかは実際に記事をアップロードして確認したほうが良いと思います。

参考サイト:

PandocのインストールとPDF生成(macOS)
https://blog.machine-powers.net/2018/07/02/install-pandoc-and-generate-pdf/#pandocのインストール
ChatGPTの回答をWordPressに整形テキストとして貼り付ける方法
https://flogics.com/wp/2024/09/chatgpt-markdown-to-wordpress/

3種類のCSVを読み込んで1つのJSONデータにするpythonをChatGPTに作成してもらった

以下の3つのファイルを1つのJSONデータにするPythonプログラムをChatGPTに作成してもらいました。

mail-src,mail-subject
aaa@yyy.com,"test ay1"
aaa@yyy.com,"test ay2"
aaa@zzz.com,"test az1"
bbb@yyy.com,"test by1"
bbb@zzz.com,"test bz1"
ccc@yyy.com,"test cy1"
ccc@zzz.com,"test cz1"

uid,mail-src
user-a,"aaa@yyy.com,aaa@zzz.com"
user-b,"bbb@yyy.com,bbb@zzz.com"
user-c,"ccc@yyy.com,ccc@zzz.com"

dest,state,category,black,pc,uid,mail
https://aaa.com:9001/aaa,pass,phishing,no,pc-a,user-a,aaa@xxx.com
https://bbb.com:9001/bbb,block,c2,yes,pc-b,user-b,bbb@xxx.com
https://ccc.com:9001/ccc,pass,c2,yes,pc-c,user-c,ccc@xxx.com

出来上がりのJSONイメージは以下の通りです。

[
  {
    "dest": "https://aaa.com:9001/aaa",
    "state": "pass",
    "category": "phishing",
    "black": "no",
    "pc": "pc-a",
    "uid": "user-a",
    "mail": "aaa@xxx.com",
    "mail-src": {
      "aaa@yyy.com": [
        "test ay1",
        "test ay2"
      ],
      "aaa@zzz.com": [
        "test az1"
      ]
    }
  },
  {
    "dest": "https://bbb.com:9001/bbb",
    "state": "block",
    "category": "c2",
    "black": "yes",
    "pc": "pc-b",
    "uid": "user-b",
    "mail": "bbb@xxx.com",
    "mail-src": {
      "bbb@yyy.com": [
        "test by1"
      ],
      "bbb@zzz.com": [
        "test bz1"
      ]
    }
  },
  {
    "dest": "https://ccc.com:9001/ccc",
    "state": "pass",
    "category": "c2",
    "black": "yes",
    "pc": "pc-c",
    "uid": "user-c",
    "mail": "ccc@xxx.com",
    "mail-src": {
      "ccc@yyy.com": [
        "test cy1"
      ],
      "ccc@zzz.com": [
        "test cz1"
      ]
    }
  }
]

そして実際にChatGPTに作成してもらった Pythonプログラムは以下の通りです。(すこし自分の環境に合わせて修正はしていますが。)

import csv
import json

# CSVファイルを読み込み、データを取得
# 
# 最初の部分では、mail_src.csv、mail_data.csv、url_data.csv という
# 3つのファイルをそれぞれ辞書形式に読み込みます。
# これにより、各ファイルのデータが辞書のリストとして取得されます。
# それぞれの辞書内には、CSVのヘッダーがキーとして使用され、
# 各行のデータがそれぞれの辞書として格納されます。

with open('mail_src.csv', 'r') as file:
    mail_src_data = list(csv.DictReader(file))
    
with open('mail_data.csv', 'r') as file:
    uid_data = list(csv.DictReader(file))

with open('url_data.csv', 'r') as file:
    dest_data = list(csv.DictReader(file))

# メールアドレスと件名をマッピングする辞書を作成
# 
# mail_src.csv ファイルの内容から、メールアドレスと件名のマッピングを
# 作成します。mail_subject_map という辞書を作成し、
# メールアドレスをキーにして、それに関連する件名をリストとして格納します。

mail_subject_map = {}
for entry in mail_src_data:
    mail = entry['mail-src']
    subject = entry['subject'].replace('\u201d', '').replace('\"', '')
    if mail in mail_subject_map:
        mail_subject_map[mail].append(subject)
    else:
        mail_subject_map[mail] = [subject]

# JSONデータを構築
#
# dest_data の情報を元にして新しい JSON データを構築します。
# 各行の情報を元に、dest_entry という辞書を作成し、'dest'、'state'、
# 'category'、'black'、'pc'、'uid'、'mail'というキーを持たせます。

json_data = []
for entry in dest_data:
    uid = entry['uid']
    mail = entry['mail']
    dest_entry = {
        'dest': entry['dest'],
        'state': entry['state'],
        'category': entry['category'],
        'black': entry['black'],
        'pc': entry['pc'],
        'uid': uid,
        'mail': mail,
        'mail-src': {}
    }
    # mail-src内のデータを整形
    #
    # 'mail-src' キーに関連する情報を整形します。
    # これは、mail_data.csv と mail_src.csv の情報を組み合わせ、
    # 指定された形式で'mail-src' キーの中身を構築するための処理です。

    if uid in [row['uid'] for row in uid_data]:
        mail_src = [x.strip() for x in next(row['mail-src'] for row in uid_data if row['uid'] == uid).split(',')]
        for src in mail_src:
            if src in mail_subject_map:
                dest_entry['mail-src'][src] = mail_subject_map[src]
    json_data.append(dest_entry)

# JSON形式に変換して出力
#
# json.dumps() を使用して json_output に JSON 形式のデータを出力します。
# これにより、json_output には指定された形式の JSON データが格納されます。
# そして、print(json_output) により、この JSON データが出力されます。

json_output = json.dumps(json_data, indent=2)
print(json_output)

人間が作るとなるとPythonに詳しい人でも数時間はかかりそうですが、ChatGPT は一瞬で作ってしまうところがすごいですね。

また、私はPython初心者なので、見たことないような関数を使われていると勉強になります。

CAMBLY で AI とのレッスンが無料で受けられると聞いてアカウント登録してみた

最近、Youtube や ブログなどで CAMBLY の AI との英語レッスンがすごい!との噂を聞きました。

しかもその AI レッスンは、CAMBLY のアカウントを作成するだけで無料で使えるとのことなので、試しにアカウントを作成しました。その時の記録をここに残しておきます。

結論としては、アカウントを登録する際にクレジットカードの情報を入れる必要もなく、手軽に使えることがわかりました。

以下にアカウント作成時の手順を記載しておきます。

CAMBLY のアカウント作成手順

まず以下のサイトにアクセスします。

CAMBLY
https://www.cambly.com/

するとCAMBLYのトップページが表示されますので、右上の「登録する」ボタンを押します。

CAMBLY トップページ

1.アカウントを登録する

アカウントの登録方法を選択する画面が表示されますので、好きな方法をアカウント登録を行います。

私は、お試しでアカウントを作成してみたいだけなので、右下のメールのアイコンを選択しました。

CAMBLY登録画面1

次にメールアドレスをパスワードを選択します。

CAMBLY登録画面2

最後に名前(ニックネーム)を登録します。

CAMBLY登録画面3

2.個人の情報を入力

ここから2ページに渡り、個人の情報をいれていきます。

まずは自分の英語力についてです。

CAMBLYパーソナライズ画面1

次に学習目標などを聞いてきます。

CAMBLYパーソナライズ画面2

3.勧誘ページをスキップ

最後に勧誘の画面が表示されます。

ここは興味がなければどんどんスキップしていきましょう。

CAMBLY勧誘画面1

次も勧誘ですのでスキップします。

CAMBLY勧誘画面2

4.CAMBLY ミニレッスンを選択

ここまでログインが完了したので、画面左下の「Camblyミニレッスン」を選択します。

CAMBLYログイン後トップ画面

するとAIとのレッスン画面に無事アクセスすることができました。

CAMBLY AI レッスン画面

こらから実際に使ってみたいと思います。

Open Interpreter を Macにインストールしようとしたらエラーがでた話

最近 Open Interpreterの記事をいろいろ見つけたので自分のMacにもインストールしようとしてみたところ、以下のようなエラーが出ました。

エラーが大量発生

% pip install open-interpreter
ERROR: Ignored the following versions that require a different python version: 0.0.1 Requires-Python >=3.10,<4.0; 0.0.2 Requires-Python >=3.10,<4.0; 0.0.21 Requires-Python >=3.10,<4.0; 0.0.22 Requires-Python >=3.10,<4.0; 0.0.221 ・・・
・・・
Requires-Python >=3.10,<4.0; 0.1.4 Requires-Python >=3.10,<4.0
ERROR: Could not find a version that satisfies the requirement open-interpreter (from versions: none)
ERROR: No matching distribution found for open-interpreter

Pythonのバージョンを3.10.0にアップして成功

結論としては、どうやら Macの Pythonのバージョンが Python 3.8.3 のままになっていたのが原因のようでした。

以下の要領で 3.10.0 にアップしたところ、Open Interpreterを正常にインストールすることができました。

% python --version
Python 3.8.3
% pyenv install -list
Available versions:
・・・
  3.10.0
  3.10-dev
  3.11-dev
・・・
  stackless-3.7.5
% pyenv install 3.10.0
python-build: use openssl@1.1 from homebrew
・・・
Installed Python-3.10.0 to /・・・/.pyenv/versions/3.10.0
% pyenv local 3.10.0
% Python -V
Python 3.10.0
% pip install open-interpreter
Collecting open-interpreter
  Downloading open_interpreter-0.1.4-py3-none-any.whl (35 kB)
・・・
WARNING: You are using pip version 21.2.3; however, version 23.2.1 is available.
You should consider upgrading via the '/Users/katsuhiro.kurita/.pyenv/versions/3.10.0/bin/python3.10 -m pip install --upgrade pip' command.