夕湖津のブログ

夕湖津のブログ

問題解決に役立つ情報の提供を目指します

■結論(色々試行錯誤した結果、これに落ち着きました)

id列を追加して、インデクサーに下記を入れてみて下さい。

 

 

  "parameters": {

    "batchSize": null,

    "maxFailedItems": null,

    "maxFailedItemsPerBatch": null,

    "base64EncodeKeys": null,

    "configuration": {

      "imageAction": "generateNormalizedImages",

      "allowSkillsetToReadFileData": true

    }

  },

  "fieldMappings": [

    {

      "sourceFieldName": "metadata_storage_path",

      "targetFieldName": "id",

      "mappingFunction": {

        "name": "fixedLengthEncode",

        "parameters": null

      }

    }

  ]

 

■想定ケース

1.Azure AI Search画面の「データのインポート」からインデックスを作成するケース

2.BLOBファイルパスがかなり長く、metadata_storage_pathが1024文字オーバするケース

 

■手順

①ひとまずmetadata_storage_pathがキーとなるインデックスを作成

Search Service画面上部の「データのインポート」から、データソースを該当のBLOBストレージのコンテナ指定で、インデックスを登録

フィールドは下記(あくまでも例です)

 

 

※登録時は、「エンリッチメントの追加」から「OCRを有効にし、すべてのテキストをmereged_contentフィールドにマージする」を選択すると、

スキルセットが自動作成されて無難です。

 

②インデック画面上部の「インデックスの追加」から、id列を追加した下記フィールドを作成して

そのまま進行

恐らく、インデクサーの生成でエラーになると思いますが、無視します。

 

③上記①で登録したインデクサーの下記を編集

 

  "fieldMappings": [

    {

      "sourceFieldName": "metadata_storage_path",

      "targetFieldName": "id",

      "mappingFunction": {

        "name": "fixedLengthEncode",

        "parameters": null

      }

    }

  ],

  "outputFieldMappings": [

    {

      "sourceFieldName": "/document/merged_content",

      "targetFieldName": "merged_content"

    }

  ],

 

保存した後、「リセット」→「実行」で完了

 

 

 

■結論

Edgeでmhtmlで保存する

 

■補足

印刷→PDFだとブラウザ画面の全てを保存することが出来ない場合には、この方法を試して下さい。

 

■方法

Edgeの右上の…をクリック

その他のツール

名前を付けてページを保存

■内容

LangChainのQuickstartを、Azure OpenAI(openaiのversionは1系)にしてみました。

 

 

 

import os

from langchain_openai import AzureChatOpenAI

 

# ここの引数の環境変数はご自身の設定依存です

llm = AzureChatOpenAI(
    azure_endpoint= os.getenv("AZURE_OPENAI_ENDPOINT"),
    api_key= os.getenv("AZURE_OPENAI_KEY"),
    api_version = os.getenv("AZURE_OPENAI_VERSION"),
    azure_deployment= os.getenv("AZURE_OPENAI_MODEL_GPT35"),
)

 

# これだとあまりうまく回答してくれない(とQuickstartに書いてあります)

llm.invoke("langsmithはテストでどのように手伝ってくれますか?")

 

# そのため、テンプレートを使用してLLMへの良好なインプットを作ります

from langchain_core.prompts import ChatPromptTemplate

 

prompt = ChatPromptTemplate.from_messages(
    [

        # ここは辞書でないので注意です(Quickstartにはこのような注意書きはありません)
        ("system", "あなたは世界レベルのIT技術のテクニカルライターです。"),
        ("user", "{input}"),
    ]

)

 

chain = prompt | llm

 

chain.invoke(
    {
        "input": "langsmithはテストでどのように手伝ってくれますか?"
    }
)
 

# チャットメッセージをパースさせます

from langchain_core.output_parsers import StrOutputParser

output_parser = StrOutputParser()

 

chain = prompt | llm | output_parser

 

chain.invoke(
    {
        "input": "langsmithはテストでどのように手伝ってくれますか?"
    }
)

 

 

下記はGPT-3.5 Turboが返してくれた実際の結果です。

 

langsmithはテストにおいて以下のような方法でお手伝いすることができます:

1. テスト計画とテストケースの作成:langsmithはテスト計画やテストケースの作成に役立つテンプレートやガイドラインを提供します。これにより、テストの範囲や予想される結果を明確に定義することができます。

2. テスト実行の自動化:langsmithはテストケースの自動化に役立つスクリプトやツールを提供します。これにより、テストの再現性や効率性を向上させることができます。

3. バグレポートの作成:langsmithはバグレポートの作成に役立つテンプレートやベストプラクティスを提供します。これにより、問題の特定や修正の追跡が容易になります。

4. テスト結果のドキュメント化:langsmithはテスト結果のドキュメント化に役立つテンプレートやツールを提供します。これにより、テストの進捗状況や品質の評価が容易になります。

5. テストの監視と分析:langsmithはテストの監視と分析に役立つツールやダッシュボードを提供します。これにより、テストの実行状況や問題の傾向を把握することができます。

以上のような方法でlangsmithはテストにおいて効果的なサポートを提供します。

■結論

下記コードでモデル一覧が取得出来ます(2024/4/7時点)

 

import openai
import requests
import os, json
from pprint import pprint

 

# ここは自身の環境変数に依存なので適宜ご変更

API_KEY = os.getenv("AZURE_OPENAI_KEY")
RESOURCE_ENDPOINT = os.getenv("AZURE_OPENAI_ENDPOINT")

 

url = RESOURCE_ENDPOINT + "openai/models?api-version=2024-03-01-preview"

 

r = requests.get(url, headers={"api-key": API_KEY})

 

for element in r.json()["data"]:
    print(f'{element["id"]} ({element["lifecycle_status"]})')

 

■補足

pprint(r.json())で、レスポンスの全体像が分かります。

 

■参照

 

 

■事象

url = "ここに解析対象URL"

client = ここにクライアント定義コード

 

poller = client.begin_analyze_document_from_url(
            model_id = "prebuilt-read",
            document_url = url,
     )

 

上記コード実行で下記エラー(どんなURLでもそうなる場合は、当記事が参考になるはずです)

 

 (InvalidRequest) Invalid request.
 Code: InvalidRequest
 Message: Invalid request.
 Inner error: {
     "code": "InvalidContent",
     "message": "The file is corrupted or format is unsupported. Refer to documentation for the list of supported formats."
}

 

■原因(の一つ)

azure-ai-document-intelligenceのバージョンが3.3未満の可能性あり

 

■対応

$ pip show azure-ai-formrecognizer

で現在のバージョンを確認し、3.2以下でしたら、下記で最新にして下さい。

 

$ pip install -U azure-ai-formrecognizer

:

:

$ pip show azure-ai-formrecognizer
Name: azure-ai-formrecognizer
Version: 3.3.2
Summary: Microsoft Azure Form Recognizer Client Library for Python
Home-page: https://github.com/Azure/azure-sdk-for-python
Author: Microsoft Corporation
Author-email: azpysdkhelp@microsoft.com
License: MIT License
Location: /home/hoge/miniconda3/lib/python3.11/site-packages
Requires: azure-common, azure-core, msrest, typing-extensions
Required-by: 

 

これでうまくいくはずです。

再度400エラーになったら、clientの設定(endpointやcredentialミスなど)を次に疑って下さい。

 

 

 

 

■事象

from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient

endpoint = os.environ["ENDPOINT"]
key = os.environ["API_KEY"]

client = DocumentIntelligenceClient(endpoint=endpoint, credential=AzureKeyCredential(key))
with open(path_to_sample_documents, "rb") as f:
    poller = client.begin_analyze_document("prebuilt-read", f, content_type="application/octet-stream")

 

上記コードを実行すると下記エラーが出る

(404) Resource not found


■解決方法

恐らく、リージョンが東日本になっているので、下記ドキュメントのようにリージョンを米国東部などにして再作成する

 

【ドキュメント】

パブリック プレビュー バージョン 2023-10-31-preview は、現在、次の Azure リージョンでのみ使用できます。

米国東部
米国西部 2
西ヨーロッパ

 

 

■事象

viewすると下記が表示される

 

$ view hoge

E1187: Failed to source defaults.vim
Press ENTER or type command to continue
 

■解決方法

$ mkdir ~/.vim

$ touch ~/.vim/vimrc

 

■原因

$ vi --version

   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"

 

上記のように、vi関連設定ファイルを探しにいって、$HOME/.vimrcなど見つからずに、

最後の「defaults file: "$VIMRUNTIME/defaults.vim"」に行き着いて、結局ないため、

「E1187: Failed to source defaults.vim」と表示される。

気がします。

 

■コード

1.パラメータ

LR = 0.001
lightgbm_params = {
    "boosting_type": "dart", #gbdt or dart(こちらの方が汎化性能が良いケースが多い)
    "learning_rate": LR,
    "objective": "multiclass",
    "num_class": 3,
    "metric": "multi_logloss",  #multi_error/multi_logloss
    "verbosity": 1,
    # GPU使用
    "device": 'gpu',
    'gpu_platform_id': 1,
    'gpu_device_id': 1,    # GPUがNVIDIA でない時はこの数字を0 or 1に変更する

 

2.学習コード

import time

from sklearn.metrics import f1_score

import lightgbm as lgb

from sklearn.model_selection import KFold, StratifiedKFold

from tqdm import tqdm

 

valid_scores = []
models = []

SEED=42
FOLD=5

 

feature_list = ここで特徴量列のリスト定義

 

kf = KFold(n_splits=FOLD, shuffle=True, random_state=SEED)
skf = StratifiedKFold(n_splits=FOLD, shuffle=True, random_state=SEED)

 

# for fold, (tr_idx, va_idx) in tqdm(enumerate(kf.split(train_df))):
for fold, (tr_idx, va_idx) in tqdm(enumerate(skf.split(train_df[feature_list], train_df['target']))):
    print(f"=========={fold+1}FOLD目=======================")
    #時間計測開始
    time_start = time.perf_counter()
    print('経過時間測定開始')
 
    evals_result = {}
    
    X_tr = train_df[feature_list].iloc[tr_idx]
    X_va = train_df[feature_list].iloc[va_idx]
    y_tr = train_df['target'].iloc[tr_idx]
    y_va = train_df['target'].iloc[va_idx]
    
    # クラスの重み付けを設定(不均衡データの場合に使用)
    class_weights = {0: 2, 1: 3, 2: 6} 

    lgb_train = lgb.Dataset(X_tr, y_tr, weight=y_tr.map(class_weights))
    lgb_eval  = lgb.Dataset(X_va, y_va, reference=lgb_train)
    
    #繰り返し回数
    NUM_BOOST_ROUND = 2000
    
    model = lgb.train(
        lightgbm_params,
        lgb_train,
        num_boost_round=NUM_BOOST_ROUND,
        valid_sets  = [lgb_train, lgb_eval],
        valid_names = ['train', 'valid'],
        callbacks = [
            lgb.early_stopping(10),  #EarlyStopping基準
            lgb.log_evaluation(50),  #評価表示インタバル
            lgb.record_evaluation(evals_result),
        ]
    )
    
    y_va_pred = model.predict(X_va, num_iteration=model.best_iteration)

    #f1_score(macro)の場合
    score = f1_score(y_va, np.argmax(y_va_pred, axis=-1), average='macro')
    print(f'fold {fold+1} Validation F1 Score (Macro): {score:.3f}')
    print('')
    
    #学習過程プロット
    lgb.plot_metric(evals_result)
    
    # スコア、モデル、予測値の格納
    valid_scores.append(score)
    models.append(model)
    
    # 時間計測終了
    time_end = time.perf_counter()
    print('経過時間測定終了')
    tim = time_end-time_start
    print('経過時間(分):', round(tim/60))
          
print('===========End===================================')

■やりたいこと

下記のようにIMAGE_IDが重複している場合、イメージを両方削除したい

 

■結論

rmに-fオプションを付ける

 

■実際の結果

C:\Users\hoge>docker image ls

REPOSITORY            TAG             IMAGE ID       CREATED         SIZE
httpd                        latest          a6ca7b52a415   10 days ago     168MB
hoge/20231202         1               a6ca7b52a415   10 days ago     168MB

 

上記を消す

 

C:\Users\hoge>docker image rm a6ca7b52a415
Error response from daemon: conflict: unable to delete a6ca7b52a415 (must be forced) - image is referenced in multiple repositories

 

IMAGE_IDが衝突して削除出来ない

 

-fオプションを付ける

 

C:\Users\hoge>docker image rm -f a6ca7b52a415
Untagged: httpd:latest
Untagged: httpd@sha256:04551bc91cc03314eaab20d23609339aebe2ae694fc2e337d0afad429ec22c5a
Untagged: hoge/20231202:1
Untagged: hoge/20231202@sha256:42ed559bb8529283236b537155e345b47051ed082200c7d7e155405b3e169235
Deleted: sha256:a6ca7b52a41549f13f7de6aeac4ab6ffebd41585fbf2273f00fd6e82bb721949