1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

前回はGUIからRAGを試してみましたが、今回はコードを実装して試してみました!

ChromaDBのチュートリアルはこちらです。

コード

sample.py
import chromadb
import os
from dotenv import load_dotenv
import google.generativeai as genai

load_dotenv()

genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
chroma_client = chromadb.Client()

collection = chroma_client.create_collection(name="japanese_documents")

documents = [
    "みかんは美味しい果物だゾ",
    "りんごは赤い",
    "スマイルカンパニーのシステムにログインするためには笑顔認証が必要です",
    "スマイルカンパニーのシステムはスマホ対応していません。",
]

ids = ["id1", "id2", "id3", "id4"]

collection.add(documents=documents, ids=ids)

def search_similar_documents(query_text):
    results = collection.query(
        query_texts=[query_text],
        n_results=2
    )
    return results

def get_gemini_response(question, context):
    try:
        model = genai.GenerativeModel("gemini-1.5-flash")
        response = model.generate_content(
            f"以下の情報をもとに質問に答えてください:\n{context}\n質問: {question}"
        )
        return response.text
    except Exception as e:
        print(f"Error: {e}")
        return "Sorry, I couldn't fetch an answer at the moment."

if __name__ == "__main__":
    query_with_info = "美味しい果物について教えてください"
    query_without_info = "バナナの栄養について教えてください"
    
    results_with_info = search_similar_documents(query_with_info)
    results_without_info = search_similar_documents(query_without_info)

    sorted_results_with_info = sorted(zip(results_with_info["documents"], results_with_info["distances"]), key=lambda x: x[1], reverse=True)
    sorted_results_without_info = sorted(zip(results_without_info["documents"], results_without_info["distances"]), key=lambda x: x[1], reverse=True)

    similar_docs_with_info = "\n".join([doc if isinstance(doc, str) else "\n".join(doc) for doc, _ in sorted_results_with_info]) if sorted_results_with_info else "関連する情報が見つかりませんでした。"
    similar_docs_without_info = "\n".join([doc if isinstance(doc, str) else "\n".join(doc) for doc, _ in sorted_results_without_info]) if sorted_results_without_info else "関連する情報が見つかりませんでした。"

    gemini_response_with_info = get_gemini_response(query_with_info, similar_docs_with_info)
    gemini_response_without_info = get_gemini_response(query_without_info, similar_docs_without_info)

    print("質問:", query_with_info)
    print("Geminiの回答:", gemini_response_with_info)

    print("\n質問:", query_without_info)
    print("Geminiの回答:", gemini_response_without_info)

GEMINI_API_KEYは.envファイルに記載し、sample.pyと同階層に置いてください。

起動

$ python3 -m venv .venv
$ source .venv/bin/activate
$ python3 sample.py

事前にデータを登録する

"みかんは美味しい果物だゾ",
"りんごは赤い",
"スマイルカンパニーのシステムにログインするためには笑顔認証が必要です",
"スマイルカンパニーのシステムはスマホ対応していません。",

質問①

"美味しい果物について教えてください"
"バナナの栄養について教えてください"

結果①

質問: 美味しい果物について教えてください
Geminiの回答: テキストからは、みかんが美味しい果物であることがわかります。


質問: バナナの栄養について教えてください
Geminiの回答: 提示された情報からは、バナナの栄養について何も読み取れません。  みかんと笑顔認証システムの情報は、バナナの栄養とは全く関係ありません。  バナナの栄養については、別の情報源を参照する必要があります。

事前に登録したデータに対して関連する内容が見つかる場合は、適切な回答をしていますね!

次は事前データに"似ている"内容を質問してみます。

質問②

"スマイルカンパニーのシステムにログインする方法について教えてください"
"スマイルカンパニーシステムの管理者ページにアクセスする方法を教えてください"

結果②

質問: スマイルカンパニーのシステムにログインする方法について教えてください
Geminiの回答: スマイルカンパニーのシステムにログインするには、笑顔認証が必要です。  ただし、システムはスマホには対応していませんので、パソコンなどの対応機器から笑顔認証を行う必要があります。


質問: スマイルカンパニーシステムの管理者ページにアクセスする方法を教えてください
Geminiの回答: スマイルカンパニーのシステムにアクセスするには、笑顔認証が必要です。  しかし、スマホではアクセスできません。  管理者ページへのアクセス方法については、笑顔認証に対応したパソコン等からアクセスする必要があります。具体的なアクセス方法は記載されていませんので、それ以上の情報は提供できません。

"管理者ページ"のアクセス方法は登録していないのですが、笑顔認証を行う必要があると回答されてしまっていますね。

おわりに

今後は登録するデータを増やしたときに回答精度がどうなるか検証してみたいです:thinking:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?