Spaces:
Running
Running
File size: 5,958 Bytes
1c2e898 6943e36 1c2e898 6943e36 1c2e898 6092837 1c2e898 6092837 1c2e898 6092837 1c2e898 aac8442 1c2e898 8e578f1 1c2e898 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
import streamlit as st
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain.memory import ConversationBufferWindowMemory
from langchain_core.prompts import MessagesPlaceholder, ChatPromptTemplate
from langchain_core.runnables import RunnableConfig
from langchain_community.callbacks import StreamlitCallbackHandler
# models
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_google_genai import ChatGoogleGenerativeAI
# custom tools
from tools.search_ddg import search_ddg
from tools.fetch_page import fetch_page
import datetime
now = datetime.datetime.now()
CUSTOM_SYSTEM_PROMPT = f"""
あなたは、ユーザーのリクエストに基づいてインターネットで調べ物を行うアシスタントです。
利用可能なツールを使用して、調査した情報を説明してください。
既に知っていることだけに基づいて答えないでください。回答する前にできる限り検索を行ってください。
(ユーザーが読むページを指定するなど、特別な場合は、検索する必要はありません。)
検索結果ページを見ただけでは情報があまりないと思われる場合は、次の2つのオプションを検討して試してみてください。
- 検索結果のリンクをクリックして、各ページのコンテンツにアクセスし、読んでみてください。
- 1ページが長すぎる場合は、3回以上ページ送りしないでください(メモリの負荷がかかるため)。
- 検索クエリを変更して、新しい検索を実行してください。
- ユーザーは日本に住んでいます。情報は日本の地域に限定してください。
- 時期の指定がない場合は、最新情報を検索ください。今日の日付:{now}。
ユーザーは非常に忙しく、あなたほど自由ではありません。
そのため、ユーザーの労力を節約するために、直接的な回答を提供してください。
=== 悪い回答の例 ===
- これらのページを参照してください。
- これらのページを参照してコードを書くことができます。
- 次のページが役立つでしょう。
=== 良い回答の例 ===
- これはサンプルコードです。 -- サンプルコードをここに --
- あなたの質問の答えは -- 回答をここに --
回答の最後には、参照したページのURLを**必ず**記載してください。(これにより、ユーザーは回答を検証することができます)
ユーザーが使用している言語で回答するようにしてください。
ユーザーが日本語で質問した場合は、日本語で回答してください。ユーザーがスペイン語で質問した場合は、スペイン語で回答してください。
"""
def init_page():
st.set_page_config(
page_title="最新情報Web調査エージェント",
page_icon="🤗"
)
st.header("最新情報Web調査エージェント 🤗")
# st.sidebar.title("Options")
def init_messages():
# clear_button = st.button("Clear Conversation", key="clear")
if "messages" not in st.session_state:
st.session_state.messages = [
{"role": "assistant", "content": "こんにちは!なんでも質問をどうぞ!"}
]
st.session_state['memory'] = ConversationBufferWindowMemory(
return_messages=True,
memory_key="chat_history",
k=10
)
def select_model(temperature=0):
models = ("GPT-4o","GPT-4o-mini", "Claude 3.5 Sonnet", "Gemini 1.5 Pro")
model_choice = st.radio("Choose a model:", models)
if model_choice == "GPT-4o":
return ChatOpenAI(temperature=temperature, model_name="gpt-4o")
elif model_choice == "GPT-4o-mini":
return ChatOpenAI(temperature=temperature, model_name="gpt-4o-mini")
elif model_choice == "Claude 3.5 Sonnet":
return ChatAnthropic(temperature=temperature, model_name="claude-3-5-sonnet-20240620")
elif model_choice == "Gemini 1.5 Pro":
return ChatGoogleGenerativeAI(temperature=temperature, model="gemini-1.5-pro-latest")
def create_agent():
tools = [search_ddg, fetch_page]
prompt = ChatPromptTemplate.from_messages([
("system", CUSTOM_SYSTEM_PROMPT),
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
llm = select_model()
agent = create_tool_calling_agent(llm, tools, prompt)
return AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
memory=st.session_state['memory']
)
def main():
init_page()
# Style adjustments (optional, remove if not needed)
st.markdown("""<style>.st-emotion-cache-15ecox0 { display: none !important; }
@media (max-width: 50.5rem) {.st-emotion-cache-13ln4jf {max-width: calc(0rem + 100vw);}}
</style>""",unsafe_allow_html=True,)
init_messages()
web_browsing_agent = create_agent()
for msg in st.session_state['memory'].chat_memory.messages:
st.chat_message(msg.type).write(msg.content)
if prompt := st.chat_input(placeholder="渋谷に近くて、コスパがいいボーリング場を3つ教えて。"):
st.chat_message("user").write(prompt)
with st.chat_message("assistant"):
# コールバック関数の設定 (エージェントの動作の可視化用)
st_cb = StreamlitCallbackHandler(
st.container(), expand_new_thoughts=True)
# エージェントを実行
response = web_browsing_agent.invoke(
{'input': prompt},
config=RunnableConfig({'callbacks': [st_cb]})
)
st.write(response["output"])
if __name__ == '__main__':
main() |