AIエージェント作成奮闘記(人のアサイン支援)

エンジニアって、プロだから、お願いするときに気を付けないといけない人もいますし、人間は機械ではないので、アサインするときに土日夜間ばっかりとか、静岡の翌日山梨にいってとか、そういうからだの疲れを考慮しないアサインは本当に嫌がられます。
では何をどの順番でどう考慮するのか?これは各アサイン担当が俗人的に頭のなかに組み立てています。考慮する事が多すぎて、可視化や引継ぎができないからです。

今回はそんなお悩みを解決する為のアイデアです。
まだ実際のデータすくないので、コンセプトだけ組み立てておきます。
週報や日報などで定期的に稼働(忙しさ)の連絡が来る、というのを前提にしています。
この辺システムで全自動化している会社さんには無縁ですが、まぁ、、システムで可視化できるのは表面的な部分だけなので、最後は俗人化する。。。よくある話かもしれません。

以下は具体的なアイデア実現の為の方法ですが、私の嫌いなPythonとLangChainつかってるので、これを後でカスタムインストラクションの日本語だけで操作できるようにアレンジします。(検証中)


エクセルの稼働データとスキル評価点をGPTのインプットデータとして使用し、RAG(Retrieval-Augmented Generation)やLangChainなどを活用して、チャットボットに質問を投げると最適なアサイン候補者が出てくるシステムの構築方法をご説明します。

---

### **1. データの準備**

**a. エクセルデータの整備**

- **稼働データ**と**スキル評価点**を一つのエクセルファイルにまとめます。

- 各行が一人のスタッフを表し、列には以下の情報を含めます:

  - 氏名

  - 稼働率

  - スキル評価点

  - スキルセット(具体的なスキルや経験)

  - その他必要な属性(部署、役職など)

**b. データのフォーマット変換**

- エクセルデータを**CSV**や**JSON**形式に変換します。

- データを構造化し、後で検索やエンベッディング生成に利用しやすい形にします。

### **2. データのエンベッディングとインデックス化**

**a. エンベッディングの生成**

- **OpenAIのエンベッディングAPI**を使用して、各スタッフの情報からエンベッディングを生成します。

- 各スタッフのデータをテキスト形式に変換します。例:

  ```

  "氏名: 山田太郎。稼働率: 80%。スキル評価点: 90。スキルセット: Python, データ分析, 機械学習。"

  ```

**b. ベクトルデータベースの構築**

- **FAISS**や**Pinecone**などのベクトルデータベースを使用して、エンベッディングをインデックス化します。

- これにより、高速な近似最近傍検索が可能となります。

### **3. チャットボットの構築**

**a. LangChainの利用**

- **LangChain**は、LLM(大規模言語モデル)とデータを組み合わせてアプリケーションを構築するフレームワークです。

- LangChainを使用して、ユーザーからの質問を処理し、適切なデータを取得し、GPTモデルに渡すワークフローを構築します。

**b. RAG(Retrieval-Augmented Generation)の実装**

- **ユーザーの質問**からクエリを生成し、ベクトルデータベースから関連するスタッフ情報を検索します。

- **検索結果**をコンテキストとしてGPTモデルに提供し、最適な候補者を生成します。

### **4. システムの実装ステップ**

**ステップ1:環境のセットアップ**

- **Python環境**を構築し、必要なライブラリをインストールします:

  ```bash

  pip install openai langchain faiss-cpu pandas

  ```

**ステップ2:データの読み込みとエンベッディング生成**

```python

import pandas as pd

from langchain.embeddings.openai import OpenAIEmbeddings

# OpenAI APIキーの設定

import os

os.environ['OPENAI_API_KEY'] = 'YOUR_API_KEY'

# データの読み込み

df = pd.read_csv('staff_data.csv')

# スタッフ情報をテキストに変換

df['text'] = df.apply(lambda row: f"氏名: {row['氏名']}。稼働率: {row['稼働率']}%。スキル評価点: {row['スキル評価点']}。スキルセット: {row['スキルセット']}。", axis=1)

# エンベッディングの生成

embeddings = OpenAIEmbeddings()

df['embedding'] = df['text'].apply(lambda x: embeddings.embed_query(x))

```

**ステップ3:ベクトルデータベースの構築**

```python

import faiss

import numpy as np

# エンベッディングの配列を作成

embedding_matrix = np.vstack(df['embedding'].values).astype('float32')

# ベクトルインデックスの作成

index = faiss.IndexFlatL2(embedding_matrix.shape[1])

index.add(embedding_matrix)

```

**ステップ4:ユーザーの質問を処理し、候補者を検索**

```python

def search_candidates(user_query, top_k=5):

    # ユーザーの質問からエンベッディングを生成

    query_embedding = embeddings.embed_query(user_query)

    # ベクトル検索

    D, I = index.search(np.array([query_embedding]).astype('float32'), top_k)

    results = df.iloc[I[0]]

    return results

```

**ステップ5:GPTモデルを使用して回答を生成**

```python

from langchain import OpenAI

from langchain.chains import LLMChain, RetrievalQA

# LLMの設定

llm = OpenAI(temperature=0.7)

def generate_response(user_query):

    # 候補者の検索

    candidates = search_candidates(user_query)

    # コンテキストの作成

    context = '\n'.join(candidates['text'].tolist())

    # プロンプトの作成

    prompt = f"""

    あなたは人材アサインのエキスパートです。

    以下のスタッフ情報を基に、ユーザーの要件に最適な候補者を提案し、その理由を詳しく説明してください。

    【スタッフ情報】

    {context}

    【ユーザーの要件】

    {user_query}

    """

    # 回答の生成

    response = llm(prompt)

    return response

```

**ステップ6:チャットボットとして動作させる**

```python

def chat():

    print("人材アサインサポートチャットボットへようこそ。ご要望をお聞かせください。")

    while True:

        user_query = input("ユーザー: ")

        if user_query.lower() in ['終了', 'exit', 'quit']:

            print("チャットを終了します。")

            break

        response = generate_response(user_query)

        print(f"ボット: {response}")

# チャットボットを起動

chat()

```

### **5. 注意点**

- **APIキーの管理**:

  - APIキーは機密情報です。コード内に直接記載せず、環境変数や設定ファイルから読み込むようにします。

- **コストの管理**:

  - OpenAI APIの利用には費用が発生します。予算を設定し、エンベッディングやモデルの使用回数を制御します。

- **データのプライバシー**:

  - 個人情報を扱う場合は、適切なデータ保護措置を講じ、法令を遵守します。

### **6. ユーザーインターフェースの改善**

- **Webアプリケーションの構築**:

  - **Streamlit**や**Gradio**を使用して、使いやすいWebベースのインターフェースを作成できます。

  - これにより、非技術者でも簡単にチャットボットを利用できます。

- **入力フォームの設置**:

  - ユーザーが必要な要件(スキル、稼働率など)を選択式や入力フォームで指定できるようにします。

### **7. システムの拡張**

- **定期的なデータ更新**:

  - エクセルのデータを定期的に更新し、最新の稼働率とスキル評価点を反映します。

- **自動化の強化**:

  - エクセルからデータベースへのデータ取り込みを自動化し、手動作業を減らします。

- **評価とフィードバック**:

  - システムの提案結果に対するユーザーのフィードバックを収集し、モデルの改善に役立てます。

### **まとめ**

エクセルの稼働データとスキル評価点をGPTのインプットデータとして活用し、RAGやLangChainを用いてチャットボットを構築することで、ユーザーの要件に最適なアサイン候補者を効率的に提案できます。このシステムは、データのエンベッディングとベクトル検索を組み合わせ、GPTモデルの自然言語生成能力を活用して、わかりやすく根拠のある回答を提供します。

---

いいなと思ったら応援しよう!