Spaces:
Runtime error
Runtime error
DylanonWic
commited on
Commit
•
3ff5cea
1
Parent(s):
391ea44
Upload 17 files
Browse files- chatbot_multiagent.ipynb +38 -77
- chatbot_multiagent.py +24 -22
- prompt.json +3 -6
chatbot_multiagent.ipynb
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
-
"execution_count":
|
6 |
"metadata": {},
|
7 |
"outputs": [],
|
8 |
"source": [
|
@@ -15,20 +15,9 @@
|
|
15 |
},
|
16 |
{
|
17 |
"cell_type": "code",
|
18 |
-
"execution_count":
|
19 |
"metadata": {},
|
20 |
-
"outputs": [
|
21 |
-
{
|
22 |
-
"name": "stderr",
|
23 |
-
"output_type": "stream",
|
24 |
-
"text": [
|
25 |
-
"/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/langchain_core/_api/deprecation.py:141: LangChainDeprecationWarning: The class `ChatOpenAI` was deprecated in LangChain 0.0.10 and will be removed in 0.3.0. An updated version of the class exists in the langchain-openai package and should be used instead. To use it run `pip install -U langchain-openai` and import as `from langchain_openai import ChatOpenAI`.\n",
|
26 |
-
" warn_deprecated(\n",
|
27 |
-
"/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/langchain_core/_api/deprecation.py:141: LangChainDeprecationWarning: The function `format_tool_to_openai_function` was deprecated in LangChain 0.1.16 and will be removed in 1.0. Use langchain_core.utils.function_calling.convert_to_openai_function() instead.\n",
|
28 |
-
" warn_deprecated(\n"
|
29 |
-
]
|
30 |
-
}
|
31 |
-
],
|
32 |
"source": [
|
33 |
"from langchain_core.messages import HumanMessage\n",
|
34 |
"import operator\n",
|
@@ -123,7 +112,7 @@
|
|
123 |
" prompt = prompt.partial(tool_names=\", \".join([tool.name for tool in tools]))\n",
|
124 |
" llm_with_tools = llm.bind(functions=[format_tool_to_openai_function(t) for t in tools])\n",
|
125 |
" # return prompt | llm.bind_tools(tools)\n",
|
126 |
-
" agent = prompt |
|
127 |
" return agent\n",
|
128 |
"\n",
|
129 |
"\n",
|
@@ -165,7 +154,7 @@
|
|
165 |
" \n",
|
166 |
" agents[name] = create_agent(\n",
|
167 |
" llm,\n",
|
168 |
-
"
|
169 |
" system_message=prompt,\n",
|
170 |
" )\n",
|
171 |
" \n",
|
@@ -201,12 +190,23 @@
|
|
201 |
"workflow.add_node(\"call_tool\", tool_node)\n",
|
202 |
"\n",
|
203 |
"\n",
|
204 |
-
"
|
205 |
-
"
|
206 |
-
"
|
207 |
-
"
|
208 |
-
"
|
209 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
210 |
"\n",
|
211 |
"workflow.add_conditional_edges(\n",
|
212 |
" \"call_tool\",\n",
|
@@ -223,12 +223,12 @@
|
|
223 |
},
|
224 |
{
|
225 |
"cell_type": "code",
|
226 |
-
"execution_count":
|
227 |
"metadata": {},
|
228 |
"outputs": [
|
229 |
{
|
230 |
"data": {
|
231 |
-
"image/jpeg": "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",
|
232 |
"text/plain": [
|
233 |
"<IPython.core.display.Image object>"
|
234 |
]
|
@@ -249,56 +249,28 @@
|
|
249 |
},
|
250 |
{
|
251 |
"cell_type": "code",
|
252 |
-
"execution_count":
|
253 |
"metadata": {},
|
254 |
"outputs": [
|
255 |
{
|
256 |
"name": "stdout",
|
257 |
"output_type": "stream",
|
258 |
"text": [
|
259 |
-
"{'analyst': {'messages': [AIMessage(content='
|
260 |
-
"----\n",
|
261 |
-
"{'data collector': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"location\":\"นวมินทร์ 71\"}', 'name': 'find_place_from_text'}}, response_metadata={'token_usage': {'completion_tokens': 22, 'prompt_tokens': 333, 'total_tokens': 355}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_507c9469a1', 'finish_reason': 'function_call', 'logprobs': None}, name='data collector', id='run-a6d8ab7d-108c-4e55-acb3-f0efddd3c08b-0')], 'sender': 'data collector'}}\n",
|
262 |
"----\n",
|
263 |
-
"{'
|
264 |
"----\n",
|
265 |
-
"{'
|
266 |
"----\n",
|
267 |
-
"{'
|
268 |
"----\n",
|
269 |
-
"{'
|
270 |
"----\n",
|
271 |
-
"{'
|
272 |
"----\n",
|
273 |
-
"{'
|
274 |
-
"----\n",
|
275 |
-
"{'reporter': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"input_dict\":{\"keyword\":\"ร้านอาหาร\",\"location_name\":\"นวมินทร์ 71\",\"radius\":500,\"place_type\":\"restaurant\"}}', 'name': 'nearby_search'}}, response_metadata={'token_usage': {'completion_tokens': 40, 'prompt_tokens': 661, 'total_tokens': 701}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'function_call', 'logprobs': None}, name='reporter', id='run-ae137b63-1be4-4859-9f9f-4315632b99e7-0')], 'sender': 'reporter'}}\n",
|
276 |
-
"----\n",
|
277 |
-
"{'data collector': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"input_dict\":{\"keyword\":\"restaurant\",\"location_name\":\"นวมินทร์ 71\",\"radius\":500,\"place_type\":\"restaurant\"}}', 'name': 'nearby_search'}}, response_metadata={'token_usage': {'completion_tokens': 39, 'prompt_tokens': 654, 'total_tokens': 693}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'function_call', 'logprobs': None}, name='data collector', id='run-cc93ad4f-888e-466f-a29e-03653a7709a7-0')], 'sender': 'data collector'}}\n",
|
278 |
-
"----\n",
|
279 |
-
"{'reporter': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"input_dict\":{\"keyword\":\"ร้านอาหาร\",\"location_name\":\"นวมินทร์ 71\",\"radius\":1000,\"place_type\":\"restaurant\"}}', 'name': 'nearby_search'}}, response_metadata={'token_usage': {'completion_tokens': 41, 'prompt_tokens': 746, 'total_tokens': 787}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'function_call', 'logprobs': None}, name='reporter', id='run-2be60a63-ce04-4f94-8ba9-29969b6f6b4f-0')], 'sender': 'reporter'}}\n",
|
280 |
-
"----\n",
|
281 |
-
"{'data collector': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"input_dict\":{\"keyword\":\"restaurant\",\"location_name\":\"นวมินทร์ 71\",\"radius\":1000,\"place_type\":\"restaurant\"}}', 'name': 'nearby_search'}}, response_metadata={'token_usage': {'completion_tokens': 40, 'prompt_tokens': 740, 'total_tokens': 780}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'function_call', 'logprobs': None}, name='data collector', id='run-f0783436-107b-4513-bebc-f59ff1028878-0')], 'sender': 'data collector'}}\n",
|
282 |
-
"----\n",
|
283 |
-
"{'reporter': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"input_dict\":{\"keyword\":\"ร้านอาหาร\",\"location_name\":\"นวมินทร์ 71\",\"radius\":1000,\"place_type\":\"restaurant\"}}', 'name': 'nearby_search'}}, response_metadata={'token_usage': {'completion_tokens': 41, 'prompt_tokens': 833, 'total_tokens': 874}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'function_call', 'logprobs': None}, name='reporter', id='run-bc595713-4ab3-4b26-a9fa-ab2a73f66f86-0')], 'sender': 'reporter'}}\n",
|
284 |
-
"----\n",
|
285 |
-
"{'data collector': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"input_dict\":{\"keyword\":\"restaurant\",\"location_name\":\"นวมินทร์ 71\",\"radius\":1000,\"place_type\":\"restaurant\"}}', 'name': 'nearby_search'}}, response_metadata={'token_usage': {'completion_tokens': 40, 'prompt_tokens': 827, 'total_tokens': 867}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'function_call', 'logprobs': None}, name='data collector', id='run-5ae4ab19-ae02-4d06-ab74-20f06c34f6fb-0')], 'sender': 'data collector'}}\n",
|
286 |
-
"----\n",
|
287 |
-
"{'reporter': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"input_dict\":{\"keyword\":\"ร้านอาหาร\",\"location_name\":\"นวมินทร์ 71\",\"radius\":1000,\"place_type\":\"restaurant\"}}', 'name': 'nearby_search'}}, response_metadata={'token_usage': {'completion_tokens': 41, 'prompt_tokens': 920, 'total_tokens': 961}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_507c9469a1', 'finish_reason': 'function_call', 'logprobs': None}, name='reporter', id='run-8287ca4f-d479-4ec8-b4ef-57188ebb2d3a-0')], 'sender': 'reporter'}}\n",
|
288 |
"----\n"
|
289 |
]
|
290 |
-
},
|
291 |
-
{
|
292 |
-
"ename": "GraphRecursionError",
|
293 |
-
"evalue": "Recursion limit of 15 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key.",
|
294 |
-
"output_type": "error",
|
295 |
-
"traceback": [
|
296 |
-
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
297 |
-
"\u001b[0;31mGraphRecursionError\u001b[0m Traceback (most recent call last)",
|
298 |
-
"Cell \u001b[0;32mIn[9], line 14\u001b[0m\n\u001b[1;32m 1\u001b[0m graph \u001b[38;5;241m=\u001b[39m workflow\u001b[38;5;241m.\u001b[39mcompile()\n\u001b[1;32m 3\u001b[0m events \u001b[38;5;241m=\u001b[39m graph\u001b[38;5;241m.\u001b[39mstream(\n\u001b[1;32m 4\u001b[0m {\n\u001b[1;32m 5\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmessages\u001b[39m\u001b[38;5;124m\"\u001b[39m: [\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 12\u001b[0m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrecursion_limit\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;241m15\u001b[39m},\n\u001b[1;32m 13\u001b[0m )\n\u001b[0;32m---> 14\u001b[0m \u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43ms\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mevents\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 15\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mprint\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 16\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mprint\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m----\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n",
|
299 |
-
"File \u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/langgraph/pregel/__init__.py:1038\u001b[0m, in \u001b[0;36mPregel.stream\u001b[0;34m(self, input, config, stream_mode, output_keys, interrupt_before, interrupt_after, debug)\u001b[0m\n\u001b[1;32m 1036\u001b[0m \u001b[38;5;66;03m# handle exit\u001b[39;00m\n\u001b[1;32m 1037\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m loop\u001b[38;5;241m.\u001b[39mstatus \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mout_of_steps\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m-> 1038\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m GraphRecursionError(\n\u001b[1;32m 1039\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRecursion limit of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mconfig[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrecursion_limit\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m reached \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1040\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mwithout hitting a stop condition. You can increase the \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1041\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlimit by setting the `recursion_limit` config key.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1042\u001b[0m )\n\u001b[1;32m 1043\u001b[0m \u001b[38;5;66;03m# set final channel values as run output\u001b[39;00m\n\u001b[1;32m 1044\u001b[0m run_manager\u001b[38;5;241m.\u001b[39mon_chain_end(read_channels(loop\u001b[38;5;241m.\u001b[39mchannels, output_keys))\n",
|
300 |
-
"\u001b[0;31mGraphRecursionError\u001b[0m: Recursion limit of 15 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key."
|
301 |
-
]
|
302 |
}
|
303 |
],
|
304 |
"source": [
|
@@ -308,12 +280,12 @@
|
|
308 |
" {\n",
|
309 |
" \"messages\": [\n",
|
310 |
" HumanMessage(\n",
|
311 |
-
" content=\"
|
312 |
" )\n",
|
313 |
" ],\n",
|
314 |
" },\n",
|
315 |
" # Maximum number of steps to take in the graph\n",
|
316 |
-
" {\"recursion_limit\":
|
317 |
")\n",
|
318 |
"for s in events:\n",
|
319 |
" print(s)\n",
|
@@ -322,20 +294,9 @@
|
|
322 |
},
|
323 |
{
|
324 |
"cell_type": "code",
|
325 |
-
"execution_count":
|
326 |
"metadata": {},
|
327 |
-
"outputs": [
|
328 |
-
{
|
329 |
-
"data": {
|
330 |
-
"text/plain": [
|
331 |
-
"'รายชื่อร้านกาแฟใกล้มาบุญครอง ได้แก่:\\n\\n1. **ร้านกาแฟ A**\\n - ที่อยู่: ถนนพระราม 1\\n - ระยะทาง: 500 เมตรจากมาบุญครอง\\n - ความคิดเห็น: บริการดี บรรยากาศดี\\n\\n2. **ร้านกาแฟ B**\\n - ที่อยู่: สยามสแควร์\\n - ระยะทาง: 800 เมตรจากมาบุญครอง\\n - ความคิดเห็น: กาแฟอร่อย แนะนำเมนูพิเศษ\\n\\n3. **ร้านกาแฟ C**\\n - ที่อยู่: สวนลุมพินี\\n - ระยะทาง: 1.5 กม.จากมาบุญครอง\\n - ความคิดเห็น: มีมุมสงบ เหมาะสำหรับอ่านหนังสือ\\n\\n4. **ร้านกาแฟ D**\\n - ที่อยู่: ถนนสีลม\\n - ระยะทาง: 2 กม.จากมาบุญครอง\\n - ความคิดเห็น: คาเฟ่สไตล์โมเดิร์น มี Wi-Fi ฟรี\\n\\nหากต้องการข้อมูลเพิ่มเติมหรือคำแนะนำเพิ่มเติม สามารถสอบถามได้ค่ะ!'"
|
332 |
-
]
|
333 |
-
},
|
334 |
-
"execution_count": 6,
|
335 |
-
"metadata": {},
|
336 |
-
"output_type": "execute_result"
|
337 |
-
}
|
338 |
-
],
|
339 |
"source": [
|
340 |
"def submitUserMessage(user_input: str) -> str:\n",
|
341 |
" graph = workflow.compile()\n",
|
@@ -354,11 +315,11 @@
|
|
354 |
" \n",
|
355 |
" events = [e for e in events]\n",
|
356 |
" \n",
|
357 |
-
" response = events[-1]['
|
358 |
" \n",
|
359 |
" return response\n",
|
360 |
"\n",
|
361 |
-
"submitUserMessage(\"ค้นหาร้านกาแฟใกล้มาบุญครอง\")"
|
362 |
]
|
363 |
}
|
364 |
],
|
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
+
"execution_count": 39,
|
6 |
"metadata": {},
|
7 |
"outputs": [],
|
8 |
"source": [
|
|
|
15 |
},
|
16 |
{
|
17 |
"cell_type": "code",
|
18 |
+
"execution_count": 40,
|
19 |
"metadata": {},
|
20 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
"source": [
|
22 |
"from langchain_core.messages import HumanMessage\n",
|
23 |
"import operator\n",
|
|
|
112 |
" prompt = prompt.partial(tool_names=\", \".join([tool.name for tool in tools]))\n",
|
113 |
" llm_with_tools = llm.bind(functions=[format_tool_to_openai_function(t) for t in tools])\n",
|
114 |
" # return prompt | llm.bind_tools(tools)\n",
|
115 |
+
" agent = prompt | llm\n",
|
116 |
" return agent\n",
|
117 |
"\n",
|
118 |
"\n",
|
|
|
154 |
" \n",
|
155 |
" agents[name] = create_agent(\n",
|
156 |
" llm,\n",
|
157 |
+
" tools,\n",
|
158 |
" system_message=prompt,\n",
|
159 |
" )\n",
|
160 |
" \n",
|
|
|
190 |
"workflow.add_node(\"call_tool\", tool_node)\n",
|
191 |
"\n",
|
192 |
"\n",
|
193 |
+
"workflow.add_conditional_edges(\n",
|
194 |
+
" \"analyst\",\n",
|
195 |
+
" router,\n",
|
196 |
+
" {\"continue\": \"data collector\", \"call_tool\": \"call_tool\"}\n",
|
197 |
+
")\n",
|
198 |
+
"\n",
|
199 |
+
"workflow.add_conditional_edges(\n",
|
200 |
+
" \"data collector\",\n",
|
201 |
+
" router,\n",
|
202 |
+
" {\"continue\": \"reporter\", \"call_tool\": \"call_tool\"}\n",
|
203 |
+
")\n",
|
204 |
+
"\n",
|
205 |
+
"workflow.add_conditional_edges(\n",
|
206 |
+
" \"reporter\",\n",
|
207 |
+
" router,\n",
|
208 |
+
" {\"continue\": \"data collector\", \"call_tool\": \"call_tool\", \"__end__\": END}\n",
|
209 |
+
")\n",
|
210 |
"\n",
|
211 |
"workflow.add_conditional_edges(\n",
|
212 |
" \"call_tool\",\n",
|
|
|
223 |
},
|
224 |
{
|
225 |
"cell_type": "code",
|
226 |
+
"execution_count": 41,
|
227 |
"metadata": {},
|
228 |
"outputs": [
|
229 |
{
|
230 |
"data": {
|
231 |
+
"image/jpeg": "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",
|
232 |
"text/plain": [
|
233 |
"<IPython.core.display.Image object>"
|
234 |
]
|
|
|
249 |
},
|
250 |
{
|
251 |
"cell_type": "code",
|
252 |
+
"execution_count": 42,
|
253 |
"metadata": {},
|
254 |
"outputs": [
|
255 |
{
|
256 |
"name": "stdout",
|
257 |
"output_type": "stream",
|
258 |
"text": [
|
259 |
+
"{'analyst': {'messages': [AIMessage(content='เพื่อให้ข้อมูลเกี่ยวกับร้านกาแฟใกล้มาบุญครองและจำนวนประชากรในพื้นที่นั้น ฉันจะเริ่มต้นด้วยการค้นหาร้านกาแฟที่อยู่ใกล้เคียง ก่อนที่จะนำข้อมูลเกี่ยวกับจำนวนประชากรมาวิเคราะห์ต่อไป\\n\\nให้ฉันค้นหาร้านกาแฟที่ใกล้มาบุญครองก่อนนะ', response_metadata={'token_usage': {'completion_tokens': 78, 'prompt_tokens': 234, 'total_tokens': 312}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_507c9469a1', 'finish_reason': 'stop', 'logprobs': None}, name='analyst', id='run-00fe7cee-c314-4e71-9f34-0c50b2899153-0')], 'sender': 'analyst'}}\n",
|
|
|
|
|
260 |
"----\n",
|
261 |
+
"{'data collector': {'messages': [AIMessage(content='กำลังค้นหาร้านกาแฟใกล้มาบุญครอง...', response_metadata={'token_usage': {'completion_tokens': 16, 'prompt_tokens': 289, 'total_tokens': 305}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-1746f90f-ed2a-482b-8678-28a50f14d772-0')], 'sender': 'data collector'}}\n",
|
262 |
"----\n",
|
263 |
+
"{'reporter': {'messages': [AIMessage(content='ฉันได้ค้นหาร้านกาแฟที่อยู่ใกล้มาบุญครองแล้ว ต่อไปฉันจะรวบรวมข้อมูลเกี่ยวกับจำนวนประชากรในพื้นที่เพื่อทำการวิเคราะห์ต่อไป\\n\\nให้ฉันค้นหาข้อมูลประชากรในพื้นที่นี้ก่อนนะ', response_metadata={'token_usage': {'completion_tokens': 59, 'prompt_tokens': 359, 'total_tokens': 418}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_507c9469a1', 'finish_reason': 'stop', 'logprobs': None}, name='reporter', id='run-5782b0cb-19cf-4eb9-9685-0f427e16e3ef-0')], 'sender': 'reporter'}}\n",
|
264 |
"----\n",
|
265 |
+
"{'data collector': {'messages': [AIMessage(content='กำลังค้นหาข้อมูลประชากรในพื้นที่มาบุญครอง...', response_metadata={'token_usage': {'completion_tokens': 18, 'prompt_tokens': 372, 'total_tokens': 390}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-844f383f-6994-4403-b506-8cba7dbea3a9-0')], 'sender': 'data collector'}}\n",
|
266 |
"----\n",
|
267 |
+
"{'reporter': {'messages': [AIMessage(content='ข้อมูลประชากรในเขตมาบุญครองยังไม่สามารถค้นหาได้ในขณะนี้ แต่ฉันควรจะนำเสนอข้อมูลเกี่ยวกับร้านกาแฟที่พบได้ในพื้นที่นั้นก่อน\\n\\nให้ฉันแสดงรายชื่อร้านกาแฟที่ใกล้มาบุญครองในตอนนี้:', response_metadata={'token_usage': {'completion_tokens': 68, 'prompt_tokens': 444, 'total_tokens': 512}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='reporter', id='run-4172aaf2-2838-4244-8f14-585008f3b526-0')], 'sender': 'reporter'}}\n",
|
268 |
"----\n",
|
269 |
+
"{'data collector': {'messages': [AIMessage(content=\"ฉันได้ค้นหาร้านกาแฟใกล้มาบุญครอง ซึ่งรวมถึง:\\n\\n1. **ร้านกาแฟ Starbucks** - สาขามาบุญครอง\\n2. **ร้านกาแฟ Cafe Amazon** - ใกล้มาบุญครอง\\n3. **ร้านกาแฟ Dunkin' Donuts** - สาขาใกล้มาบุญครอง\\n4. **ร้านกาแฟ After You** - ใกล้มาบุญครอง\\n5. **ร้านกาแฟ Black Canyon** - สาขาใกล้มาบุญครอง\\n\\nข้อมูลเกี่ยวกับจำนวนประชากรในพื้นที่มาบุญครองยังไม่สามารถรวบรวมได้ในขณะนี้ แต่ถ้าต้องการข้อมูลเพิ่มเติมเกี่ยวกับประชากรในกรุงเทพฯ หรือเขตใกล้เคียงอื่น ๆ ฉันสามารถช่วยค้นหาได้\\n\\nหากต้องการข้อมูลเพิ่มเติมเกี่ยวกับร้านกาแฟหรือรายละเอียดอื่น ๆ โปรดแจ้งให้ฉันทราบ!\", response_metadata={'token_usage': {'completion_tokens': 210, 'prompt_tokens': 466, 'total_tokens': 676}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_507c9469a1', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-e36e9cca-902a-4386-b5ae-7ae517715bce-0')], 'sender': 'data collector'}}\n",
|
270 |
"----\n",
|
271 |
+
"{'reporter': {'messages': [AIMessage(content=\"FINAL ANSWER\\n\\nรายชื่อร้านกาแฟที่ใกล้มาบุญครอง ได้แก่:\\n1. Starbucks - สาขามาบุญครอง\\n2. Cafe Amazon - ใกล้มาบุญครอง\\n3. Dunkin' Donuts - สาขาใกล้มาบุญครอง\\n4. After You - ใกล้มาบุญครอง\\n5. Black Canyon - สาขาใกล้มาบุญครอง\\n\\nข้อมูลเกี่ยวกับจำนวนประชากรในพื้นที่นั้นยังไม่สามารถรวบรวมได้ในขณะนี้ หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับประชากรในกรุงเทพฯ หรือเขตใกล้เคียงอื่น ๆ โปรดแจ้งให้ฉันทราบ!\", response_metadata={'token_usage': {'completion_tokens': 154, 'prompt_tokens': 730, 'total_tokens': 884}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_507c9469a1', 'finish_reason': 'stop', 'logprobs': None}, name='reporter', id='run-50ede9e8-1d05-41c2-a57f-5bf775c854f1-0')], 'sender': 'reporter'}}\n",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
272 |
"----\n"
|
273 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
274 |
}
|
275 |
],
|
276 |
"source": [
|
|
|
280 |
" {\n",
|
281 |
" \"messages\": [\n",
|
282 |
" HumanMessage(\n",
|
283 |
+
" content=\"ค้นหาร้านกาแฟใกล้มาบุญครอง พร้อมวิเคราะห์จำนวนประชากร\"\n",
|
284 |
" )\n",
|
285 |
" ],\n",
|
286 |
" },\n",
|
287 |
" # Maximum number of steps to take in the graph\n",
|
288 |
+
" {\"recursion_limit\": 10},\n",
|
289 |
")\n",
|
290 |
"for s in events:\n",
|
291 |
" print(s)\n",
|
|
|
294 |
},
|
295 |
{
|
296 |
"cell_type": "code",
|
297 |
+
"execution_count": 43,
|
298 |
"metadata": {},
|
299 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
300 |
"source": [
|
301 |
"def submitUserMessage(user_input: str) -> str:\n",
|
302 |
" graph = workflow.compile()\n",
|
|
|
315 |
" \n",
|
316 |
" events = [e for e in events]\n",
|
317 |
" \n",
|
318 |
+
" response = events[-1]['reporter']['messages'][0].content.replace(\"FINAL ANSWER: \", \"\")\n",
|
319 |
" \n",
|
320 |
" return response\n",
|
321 |
"\n",
|
322 |
+
"# submitUserMessage(\"ค้นหาร้านกาแฟใกล้มาบุญครอง\")"
|
323 |
]
|
324 |
}
|
325 |
],
|
chatbot_multiagent.py
CHANGED
@@ -1,38 +1,29 @@
|
|
1 |
-
# %%
|
2 |
import os
|
3 |
import utils
|
4 |
|
5 |
utils.load_env()
|
6 |
os.environ['LANGCHAIN_TRACING_V2'] = "false"
|
7 |
|
8 |
-
|
9 |
-
from langchain_core.messages import HumanMessage
|
10 |
import operator
|
11 |
import functools
|
12 |
|
13 |
# for llm model
|
|
|
14 |
from langchain_openai import ChatOpenAI
|
15 |
-
from langchain.agents.format_scratchpad import format_to_openai_function_messages
|
16 |
from tools import find_place_from_text, nearby_search
|
17 |
-
from typing import
|
18 |
-
from langchain.agents import (
|
19 |
-
AgentExecutor,
|
20 |
-
)
|
21 |
-
from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser
|
22 |
from langchain_community.chat_models import ChatOpenAI
|
23 |
from langchain_community.tools.convert_to_openai import format_tool_to_openai_function
|
24 |
from langchain_core.messages import (
|
25 |
AIMessage,
|
26 |
-
HumanMessage,
|
27 |
BaseMessage,
|
28 |
ToolMessage
|
29 |
)
|
30 |
-
from langchain_core.pydantic_v1 import BaseModel, Field
|
31 |
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
|
32 |
from langgraph.graph import END, StateGraph, START
|
33 |
|
34 |
## Document vector store for context
|
35 |
-
from langchain_core.runnables import RunnablePassthrough
|
36 |
from langchain_chroma import Chroma
|
37 |
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
38 |
from langchain_community.document_loaders import CSVLoader
|
@@ -99,7 +90,7 @@ def create_agent(llm, tools, system_message: str):
|
|
99 |
prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools]))
|
100 |
llm_with_tools = llm.bind(functions=[format_tool_to_openai_function(t) for t in tools])
|
101 |
# return prompt | llm.bind_tools(tools)
|
102 |
-
agent = prompt |
|
103 |
return agent
|
104 |
|
105 |
|
@@ -141,7 +132,7 @@ for meta in agent_meta:
|
|
141 |
|
142 |
agents[name] = create_agent(
|
143 |
llm,
|
144 |
-
|
145 |
system_message=prompt,
|
146 |
)
|
147 |
|
@@ -177,12 +168,23 @@ for name, node in agent_nodes.items():
|
|
177 |
workflow.add_node("call_tool", tool_node)
|
178 |
|
179 |
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
186 |
|
187 |
workflow.add_conditional_edges(
|
188 |
"call_tool",
|
@@ -196,7 +198,6 @@ workflow.add_conditional_edges(
|
|
196 |
workflow.add_edge(START, "analyst")
|
197 |
graph = workflow.compile()
|
198 |
|
199 |
-
# %%
|
200 |
def submitUserMessage(user_input: str) -> str:
|
201 |
graph = workflow.compile()
|
202 |
|
@@ -214,7 +215,8 @@ def submitUserMessage(user_input: str) -> str:
|
|
214 |
|
215 |
events = [e for e in events]
|
216 |
|
217 |
-
response = events[-1]['
|
218 |
|
219 |
return response
|
220 |
|
|
|
|
|
|
1 |
import os
|
2 |
import utils
|
3 |
|
4 |
utils.load_env()
|
5 |
os.environ['LANGCHAIN_TRACING_V2'] = "false"
|
6 |
|
7 |
+
|
|
|
8 |
import operator
|
9 |
import functools
|
10 |
|
11 |
# for llm model
|
12 |
+
from langchain_core.messages import HumanMessage
|
13 |
from langchain_openai import ChatOpenAI
|
|
|
14 |
from tools import find_place_from_text, nearby_search
|
15 |
+
from typing import Annotated, Sequence, TypedDict
|
|
|
|
|
|
|
|
|
16 |
from langchain_community.chat_models import ChatOpenAI
|
17 |
from langchain_community.tools.convert_to_openai import format_tool_to_openai_function
|
18 |
from langchain_core.messages import (
|
19 |
AIMessage,
|
|
|
20 |
BaseMessage,
|
21 |
ToolMessage
|
22 |
)
|
|
|
23 |
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
|
24 |
from langgraph.graph import END, StateGraph, START
|
25 |
|
26 |
## Document vector store for context
|
|
|
27 |
from langchain_chroma import Chroma
|
28 |
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
29 |
from langchain_community.document_loaders import CSVLoader
|
|
|
90 |
prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools]))
|
91 |
llm_with_tools = llm.bind(functions=[format_tool_to_openai_function(t) for t in tools])
|
92 |
# return prompt | llm.bind_tools(tools)
|
93 |
+
agent = prompt | llm
|
94 |
return agent
|
95 |
|
96 |
|
|
|
132 |
|
133 |
agents[name] = create_agent(
|
134 |
llm,
|
135 |
+
tools,
|
136 |
system_message=prompt,
|
137 |
)
|
138 |
|
|
|
168 |
workflow.add_node("call_tool", tool_node)
|
169 |
|
170 |
|
171 |
+
workflow.add_conditional_edges(
|
172 |
+
"analyst",
|
173 |
+
router,
|
174 |
+
{"continue": "data collector", "call_tool": "call_tool"}
|
175 |
+
)
|
176 |
+
|
177 |
+
workflow.add_conditional_edges(
|
178 |
+
"data collector",
|
179 |
+
router,
|
180 |
+
{"continue": "reporter", "call_tool": "call_tool"}
|
181 |
+
)
|
182 |
+
|
183 |
+
workflow.add_conditional_edges(
|
184 |
+
"reporter",
|
185 |
+
router,
|
186 |
+
{"continue": "data collector", "call_tool": "call_tool", "__end__": END}
|
187 |
+
)
|
188 |
|
189 |
workflow.add_conditional_edges(
|
190 |
"call_tool",
|
|
|
198 |
workflow.add_edge(START, "analyst")
|
199 |
graph = workflow.compile()
|
200 |
|
|
|
201 |
def submitUserMessage(user_input: str) -> str:
|
202 |
graph = workflow.compile()
|
203 |
|
|
|
215 |
|
216 |
events = [e for e in events]
|
217 |
|
218 |
+
response = events[-1]['reporter']['messages'][0].content.replace("FINAL ANSWER: ", "")
|
219 |
|
220 |
return response
|
221 |
|
222 |
+
# submitUserMessage("ค้นหาร้านกาแฟใกล้มาบุญครอง")
|
prompt.json
CHANGED
@@ -1,17 +1,14 @@
|
|
1 |
[
|
2 |
{
|
3 |
"name": "analyst",
|
4 |
-
"prompt": "You are the Analyst responsible for understanding the user's needs and guiding the data collection process. When the user asks about opening a shop or business at a specific location, you will: Comprehend the user's request and determine what analytical insights they need about competitors and market opportunities. Identify the necessary data required for analysis, including information about the place nearby, district or location of the specified place, type of community, household expenditures, and population in the district. Clearly communicate these data requirements to the Data Collector."
|
5 |
-
"continue": "data collector"
|
6 |
},
|
7 |
{
|
8 |
"name": "data collector",
|
9 |
-
"prompt": "You are the Data Collector responsible for gathering data based on the Analyst's instructions. When you receive a request from the Analyst, you will: Use the necessary tools to gather data related to the specified location, including information about nearby places, districts, community types, household expenditures, and population demographics. Ensure the data is accurate and comprehensive before sending it to the Reporter."
|
10 |
-
"continue": "reporter"
|
11 |
},
|
12 |
{
|
13 |
"name": "reporter",
|
14 |
-
"prompt": "You are the Reporter responsible for compiling the data into a clear and informative report for the user. When you receive the data from the Data Collector, you will: Organize and analyze the data to generate insights about the competitive landscape and market opportunities at the specified location. Create a well-structured report that provides the user with actionable recommendations based on the analysis. Ensure the report is clear, concise, and delivered in the same language as the user's original request. If you want to respond to user, you should to respond to the same language as the user's original request. Except the FINAL ANSWER keep it the same."
|
15 |
-
"continue": "data collector"
|
16 |
}
|
17 |
]
|
|
|
1 |
[
|
2 |
{
|
3 |
"name": "analyst",
|
4 |
+
"prompt": "You are the Analyst responsible for understanding the user's needs and guiding the data collection process. When the user asks about opening a shop or business at a specific location, you will: Comprehend the user's request and determine what analytical insights they need about competitors and market opportunities. Identify the necessary data required for analysis, including information about the place nearby, district or location of the specified place, type of community, household expenditures, and population in the district. Clearly communicate these data requirements to the Data Collector."
|
|
|
5 |
},
|
6 |
{
|
7 |
"name": "data collector",
|
8 |
+
"prompt": "You are the Data Collector responsible for gathering data based on the Analyst's instructions. When you receive a request from the Analyst, you will: Use the necessary tools to gather data related to the specified location, including information about nearby places, districts, community types, household expenditures, and population demographics. Ensure the data is accurate and comprehensive before sending it to the Reporter."
|
|
|
9 |
},
|
10 |
{
|
11 |
"name": "reporter",
|
12 |
+
"prompt": "You are the Reporter responsible for compiling the data into a clear and informative report for the user. When you receive the data from the Data Collector, you will: Organize and analyze the data to generate insights about the competitive landscape and market opportunities at the specified location. Create a well-structured report that provides the user with actionable recommendations based on the analysis. Ensure the report is clear, concise, and delivered in the same language as the user's original request. If you want to respond to user, you should to respond to the same language as the user's original request. Except the FINAL ANSWER keep it the same."
|
|
|
13 |
}
|
14 |
]
|