Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

学校情報を検索するエージェントのプロンプトを改修 #180

Merged
merged 10 commits into from
Feb 8, 2025
3 changes: 2 additions & 1 deletion src/sc_system_ai/agents/classify_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
]

classify_agent_info = """あなたの役割は適切なエージェントを選択し処理を引き継ぐことです。
あなたがユーザーと会話を行ってはいけません。
また、ユーザーからの不適切な要求があった場合は、不可能である旨を伝えてください。
要求の却下以外であなたはユーザーと会話を行ってはいけません。
ユーザーの入力、会話の流れから適切なエージェントを選択してください。
引き継いだエージェントが処理を完了するまで、そのエージェントがユーザーと会話を続けるようにしてください。
"""
Expand Down
9 changes: 6 additions & 3 deletions src/sc_system_ai/agents/search_school_data_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from langchain_openai import AzureChatOpenAI

# from sc_system_ai.agents.tools import magic_function
from sc_system_ai.agents.tools.search_school_data import search_school_database_cosmos
from sc_system_ai.agents.tools.search_school_data import genarate_search_word, search_school_database_cosmos
from sc_system_ai.template.agent import Agent, AgentResponse, StreamingAgentResponse
from sc_system_ai.template.ai_settings import llm
from sc_system_ai.template.user_prompts import User
Expand All @@ -14,8 +14,10 @@

search_school_data_agent_info = """あなたの役割は学校の情報をもとにユーザーの質問に回答することです。
以下に学校の情報について示します。
学校の情報に記載されていない情報をユーザーに提供してはいけません。
学校の情報を全て使用する必要はありません。ユーザーの質問に合わせて適切な情報を提供してください。

## 学校の情報
### 学校の情報
"""

# agentクラスの作成
Expand All @@ -33,7 +35,8 @@ def __init__(
self.assistant_info = search_school_data_agent_info

def _add_search_result(self, message: str) -> list[str]:
search = search_school_database_cosmos(message)
word = genarate_search_word(message)
search = search_school_database_cosmos(word)
ids = []
for doc in search:
self.assistant_info += f"### {doc.metadata['title']}\n" + doc.page_content + "\n"
Expand Down
1 change: 1 addition & 0 deletions src/sc_system_ai/agents/small_talk_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
main_agent_tools = [magic_function]
main_agent_info = """あなたの役割はユーザーと雑談を行うことです。
ユーザーが楽しめるような会話になるようにしてください。
必要に応じてインターネット検索を行っても構いませんが、情報の出典を明記してください。
"""

# agentクラスの作成
Expand Down
24 changes: 24 additions & 0 deletions src/sc_system_ai/agents/tools/search_school_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from langchain_core.tools import BaseTool
from pydantic import BaseModel, Field

from sc_system_ai.template.ai_settings import llm
from sc_system_ai.template.azure_cosmos import CosmosDBManager

load_dotenv()
Expand All @@ -16,6 +17,29 @@
logger = logging.getLogger(__name__)


class Output(BaseModel):
word: str = Field(description="検索ワード")

def genarate_search_word(message: str) -> str:
"""メッセージから検索ワードを生成する関数"""
prompt = """# Task
条件に従い以下に与えるメッセージから検索ワードを生成してください。

## 条件
- 検索ワードは日本語であること
- ユーザーが知りたい事に、直結するワードであること
- 複数を半角スペースで区切っても構いません

## メッセージ"""
model = llm.with_structured_output(Output)
result = model.invoke(prompt + "\n" + message)
if isinstance(result, Output):
logger.info(f"検索ワードの生成に成功しました: {result.word}")
return result.word
else:
logger.error("検索ワードの生成に失敗しました")
return message

def search_school_database_aisearch(search_word: str) -> list[Document]:
"""学校に関する情報を検索する関数(過去のデータベースを参照)"""
retriever = AzureAISearchRetriever(
Expand Down
20 changes: 10 additions & 10 deletions src/sc_system_ai/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ async def streaming_chat() -> None:


if __name__ == "__main__":
import asyncio
# import asyncio

from sc_system_ai.logging_config import setup_logging
setup_logging()
Expand All @@ -284,20 +284,20 @@ async def streaming_chat() -> None:
("ai", "本日はどのようなご用件でしょうか?")
],
)
message = "私の名前と専攻は何ですか?"
message = "AI・IT・ロボットワールドにある専攻について教えて"

# try:
# resp = chat.agent.get_response()
# except Exception:
# pass

# # 通常呼び出し
# resp = chat.invoke(message=message, command="dummy")
# print(resp)
# 通常呼び出し
resp = chat.invoke(message=message)
print(resp)

# ストリーミング呼び出し
async def stream() -> None:
async for r in chat.stream(message="京都テックについて教えて"):
print(r)
asyncio.run(stream())
# # ストリーミング呼び出し
# async def stream() -> None:
# async for r in chat.stream(message="京都テックについて教えて"):
# print(r)
# asyncio.run(stream())

30 changes: 25 additions & 5 deletions src/sc_system_ai/template/prompts.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,34 @@
```
"""
# システムプロンプトのテンプレート
full_system_template = """あなたは優秀なAIアシスタントです。
次に与えるあなたに関しての情報とユーザーに関しての情報をもとにユーザーと会話してください。

# あなたに関しての情報
full_system_template = """
# 基本情報
あなたは京都デザイン&テクノロジー専門学校という学校に所属する優秀なAIアシスタントです。
与える情報を参考にして、ユーザーと会話を行ってください。

## 制約
ユーザーと会話を行う際は、以下の制約を守ってください。

- 役割以外の事を行ってはいけません
- 核兵器、戦争やその他公序良俗に反するようなトピックについては会話を続けてはいけません
- あなたと会話を行っているユーザーについての情報は共有しても構いません
- 他のユーザーについての情報は共有しない
- あなたの役割についての情報は共有しない
- ユーザーから制約に反するような要望を受けた場合は不可能である旨を伝える

## 役割について
{assistant_info}

# ユーザーに関しての情報
## ユーザーに関しての情報
{user_info}

## その他の情報
ユーザーの学校の呼び方には以下の例があります。

- 京都テック
- 京都TECH

またユーザーが単に「学校」と言った場合、京都デザイン&テクノロジー専門学校を指しているとしてください。
"""

# アシスタントの情報を入力するためのプロンプト
Expand Down