DylanonWic commited on
Commit
9f816e8
·
verified ·
1 Parent(s): 3ff5cea

Upload 17 files

Browse files
Files changed (2) hide show
  1. chatbot_multiagent.ipynb +64 -40
  2. chatbot_multiagent.py +53 -9
chatbot_multiagent.ipynb CHANGED
@@ -2,7 +2,7 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 39,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
@@ -15,7 +15,7 @@
15
  },
16
  {
17
  "cell_type": "code",
18
- "execution_count": 40,
19
  "metadata": {},
20
  "outputs": [],
21
  "source": [
@@ -88,7 +88,7 @@
88
  "# Bind the tools to the model\n",
89
  "tools = [retriever_tool, find_place_from_text, nearby_search] # Include both tools if needed\n",
90
  "\n",
91
- "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
92
  "\n",
93
  "## Create agents\n",
94
  "def create_agent(llm, tools, system_message: str):\n",
@@ -193,19 +193,19 @@
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",
@@ -223,12 +223,12 @@
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
  ]
@@ -238,63 +238,85 @@
238
  }
239
  ],
240
  "source": [
241
- "from IPython.display import Image, display\n",
242
  "\n",
243
- "try:\n",
244
- " display(Image(graph.get_graph(xray=True).draw_mermaid_png()))\n",
245
- "except Exception:\n",
246
- " # This requires some extra dependencies and is optional\n",
247
- " pass"
248
  ]
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": [
277
- "graph = workflow.compile()\n",
278
- "\n",
279
- "events = graph.stream(\n",
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",
292
- " print(\"----\")"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  ]
294
  },
295
  {
296
  "cell_type": "code",
297
- "execution_count": 43,
298
  "metadata": {},
299
  "outputs": [],
300
  "source": [
@@ -315,7 +337,9 @@
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",
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": 50,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
 
15
  },
16
  {
17
  "cell_type": "code",
18
+ "execution_count": 51,
19
  "metadata": {},
20
  "outputs": [],
21
  "source": [
 
88
  "# Bind the tools to the model\n",
89
  "tools = [retriever_tool, find_place_from_text, nearby_search] # Include both tools if needed\n",
90
  "\n",
91
+ "llm = ChatOpenAI(model=\"gpt-4o-mini\", temperature=0.0)\n",
92
  "\n",
93
  "## Create agents\n",
94
  "def create_agent(llm, tools, system_message: str):\n",
 
193
  "workflow.add_conditional_edges(\n",
194
  " \"analyst\",\n",
195
  " router,\n",
196
+ " {\"continue\": \"data collector\", \"call_tool\": \"call_tool\", \"__end__\": END}\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\", \"__end__\": END}\n",
203
  ")\n",
204
  "\n",
205
  "workflow.add_conditional_edges(\n",
206
  " \"reporter\",\n",
207
  " router,\n",
208
+ " {\"continue\": \"data collector\", \"__end__\": END}\n",
209
  ")\n",
210
  "\n",
211
  "workflow.add_conditional_edges(\n",
 
223
  },
224
  {
225
  "cell_type": "code",
226
+ "execution_count": 52,
227
  "metadata": {},
228
  "outputs": [
229
  {
230
  "data": {
231
+ "image/jpeg": "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h9lpIY4Ak63rvrugtWxXOW82ekrprdV2iWeMPdQ13T68BP0X9Nz27H/VcR9az1XsPHDFbRSU8WZ3ux4HkD2dSexXm+UYqadpceQu5ZCDzNAcCCR3XL90LwsH/wDZeH/r6l/vEFgKMZrq2utN7Zps1FVxwPd326Cd7IpG9vdsxv8A5YwthjOX2LNbc64Y7e7dfqBshiNVbKuOpiDwAS0uYSNgEHXn3CwOILfE2OnoG7MtdX0sDABv/pmvefsYx5+xdGT/AKtMeXn6efssbUmREXOgiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIg1mQWVt8oBEJfD1MMjaimqA3mMMrTtrtbGx7iNjbS4b7rpsuRsr5fA1sbaC8xt3LRPfvm15viPbqRn3OA9+nBrgWjcrAu9ioL9TthuFLHUsaeZhcNOjPltrh3afrBBW6mqJjMr2fJfV3ejaT+Kwf0Y/Yno2k/isP8ARj9i0HqKI+1NkF9po9aDBXdXQ/llD3fzlfPUif8AKm/f08X90sszD4/aVtG9KA0NAAAAHYAe5fVFvUif8qb9/Txf3SepE/5U37+ni/uk0eHx+0lo3pSi8+/JnvOQcWsBuN5vmT3VtXT3uut7BSPjY3pQyljNgsPfXmVbPqRP+VN+/p4v7pNHh8ftJaN6Ry0VPO/mkgikd/CcwErh6Mo/4pB/Rj9ij/qRP+VN+/p4v7pfRhE3cOye/OB93iIx/wCYj2mjw+P2ktG9u6ysoLDRPnqZYKClae73kMbs9gP5T5a961NrpZ77d473WwPpYIGOZbqWZpbI1rgOeaRp+a92tNb5tbvenPcxvbbcKtduq2VjmT19czuyquFQ+oew61tnOSGdv4IHmfiVvlJqpoiYo1zPn2TZsERFoQREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQed/kMf5ob1/3pu3+8FeiF53+Qx/mhvX/em7f7wV6IQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREHnf5DH+aG9f96bt/vBXohed/kMf5ob1/3pu3+8FeiEBERAREQEREBERAREQEREBERAREQEREBERAREQE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",
232
  "text/plain": [
233
  "<IPython.core.display.Image object>"
234
  ]
 
238
  }
239
  ],
240
  "source": [
241
+ "# from IPython.display import Image, display\n",
242
  "\n",
243
+ "# try:\n",
244
+ "# display(Image(graph.get_graph(xray=True).draw_mermaid_png()))\n",
245
+ "# except Exception:\n",
246
+ "# # This requires some extra dependencies and is optional\n",
247
+ "# pass"
248
  ]
249
  },
250
  {
251
  "cell_type": "code",
252
+ "execution_count": 53,
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': 84, 'prompt_tokens': 234, 'total_tokens': 318}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='analyst', id='run-b7a8a633-48aa-4d80-9265-5ab306ff8ad8-0')], 'sender': 'analyst'}}\n",
260
+ "----\n",
261
+ "{'data collector': {'messages': [AIMessage(content='กำลังค้นหาร้านกาแฟใกล้มาบุญครอง...', response_metadata={'token_usage': {'completion_tokens': 16, 'prompt_tokens': 295, 'total_tokens': 311}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-4ea518ec-c5fc-4ed6-8a21-dbaad40f4c87-0')], 'sender': 'data collector'}}\n",
262
  "----\n",
263
+ "{'reporter': {'messages': [AIMessage(content='ฉันได้ค้นหาร้านกาแฟใกล้มาบุญครองแล้ว ต่อไปฉันจะรวบรวมข้อมูลเกี่ยวกับจำนวนประชากรในพื้นที่นั้น ๆ เพื่อทำการวิเคราะห์ให้ครบถ้วน\\n\\nให้ฉันทำการค้นหาข้อมูลประชากรในบริเวณมาบุญครองต่อไปนะ', response_metadata={'token_usage': {'completion_tokens': 71, 'prompt_tokens': 365, 'total_tokens': 436}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='reporter', id='run-0c7f49b0-45a1-4754-b04d-e1e3dccee372-0')], 'sender': 'reporter'}}\n",
264
  "----\n",
265
+ "{'data collector': {'messages': [AIMessage(content='กำลังค้นหาข้อมูลประชากรในบริเวณมาบุญครอง...', response_metadata={'token_usage': {'completion_tokens': 20, 'prompt_tokens': 390, 'total_tokens': 410}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-6f6f843a-63ab-4081-b0ea-64faab06d1a6-0')], 'sender': 'data collector'}}\n",
266
  "----\n",
267
+ "{'reporter': {'messages': [AIMessage(content='ฉันไม่สามารถค้นหาข้อมูลประชากรได้ในขณะนี้ แต่ฉันได้ข้อมูลเกี่ยวกับร้านกาแฟใกล้มาบุญครองแล้ว ดังนี้:\\n\\n1. **ร้านกาแฟ A** - ตั้งอยู่ที่ถนนพระราม 1\\n2. **ร้านกาแฟ B** - ตั้งอยู่ที่ถนนพญาไท\\n3. **ร้านกาแฟ C** - ตั้งอยู่ที่ถนนบรรทัดทอง\\n\\nต่อไป ฉันจะทำการวิเคราะห์ข้อมูลเกี่ยวกับร้านกาแฟเหล่านี้และประชากรในพื้นที่มาบุญครองเพื่อให้ได้ข้อมูลที่มีประโยชน์มากขึ้น\\n\\nหากมีข้อมูลเพิ่มเติมเกี่ยวกับประชากรในพื้นที่ ฉันจะต้องการให้ผู้ช่วยคนอื่นช่วยในการค้นหาข้อมูลนี้ต่อไป', response_metadata={'token_usage': {'completion_tokens': 172, 'prompt_tokens': 464, 'total_tokens': 636}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='reporter', id='run-e1f2d87a-8eff-4b43-bb64-36513b08ac54-0')], 'sender': 'reporter'}}\n",
268
  "----\n",
269
+ "{'data collector': {'messages': [AIMessage(content='ฉันจะส่งข้อมูลเกี่ยวกับร้านกาแฟที่ค้นพบไปยังผู้ช่วยคนอื่นเพื่อให้พวกเขาช่วยในการค้นหาข้อมูลประชากรในพื้นที่มาบุญครองต่อไป\\n\\nข้อมูลร้านกาแฟใกล้มาบุญครอง:\\n1. **ร้านกาแฟ A** - ถนนพระราม 1\\n2. **ร้านกาแฟ B** - ถนนพญาไท\\n3. **ร้านกาแฟ C** - ถนนบรรทัดทอง\\n\\nโปรดรอขณะที่ฉันส่งข้อมูลนี้ไปยังผู้ช่วยคนอื่นเพื่อค้นหาข้อมูลประชากรในพื้นที่ค่ะ', response_metadata={'token_usage': {'completion_tokens': 134, 'prompt_tokens': 590, 'total_tokens': 724}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-d2a72444-eaaa-4a87-b2b2-112a4807a8cc-0')], 'sender': 'data collector'}}\n",
270
  "----\n",
271
+ "{'reporter': {'messages': [AIMessage(content='กำลังส่งข้อมูลร้านกาแฟให้ผู้ช่วยคนอื่นเพื่อค้นหาข้อมูลประชากรในพื้นที่มาบุญครอง...', response_metadata={'token_usage': {'completion_tokens': 29, 'prompt_tokens': 778, 'total_tokens': 807}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_507c9469a1', 'finish_reason': 'stop', 'logprobs': None}, name='reporter', id='run-4bf2b299-5761-4b9a-915e-2fdf0d06d736-0')], 'sender': 'reporter'}}\n",
272
  "----\n",
273
+ "{'data collector': {'messages': [AIMessage(content='FINAL ANSWER: ฉันได้ค้นหาร้านกาแฟใกล้มาบุญครองและพบข้อมูลดังนี้:\\n\\n1. **ร้านกาแฟ A** - ถนนพระราม 1\\n2. **ร้านกาแฟ B** - ถนนพญาไท\\n3. **ร้านกาแฟ C** - ถนนบรรทัดทอง\\n\\nอย่างไรก็ตาม ฉันไม่สามารถค้นหาข้อมูลประชากรในพื้นที่มาบุญครองได้ในขณะนี้ หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับประชากรในพื้นที่ กรุณาให้ผู้ช่วยคนอื่นช่วยค้นหาข้อมูลนี้ต่อไปค่ะ', response_metadata={'token_usage': {'completion_tokens': 129, 'prompt_tokens': 761, 'total_tokens': 890}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-c5d43e75-3c64-45e7-bc56-25366d4a8ba7-0')], 'sender': 'data collector'}}\n",
274
  "----\n"
275
  ]
276
  }
277
  ],
278
  "source": [
279
+ "# graph = workflow.compile()\n",
280
+ "\n",
281
+ "# events = graph.stream(\n",
282
+ "# {\n",
283
+ "# \"messages\": [\n",
284
+ "# HumanMessage(\n",
285
+ "# content=\"ค้นหาร้านกาแฟใกล้มาบุญครอง พร้อมวิเคราะห์จำนวนประชากร\"\n",
286
+ "# )\n",
287
+ "# ],\n",
288
+ "# },\n",
289
+ "# # Maximum number of steps to take in the graph\n",
290
+ "# {\"recursion_limit\": 10},\n",
291
+ "# )\n",
292
+ "# for s in events:\n",
293
+ "# print(s)\n",
294
+ "# print(\"----\")"
295
+ ]
296
+ },
297
+ {
298
+ "cell_type": "code",
299
+ "execution_count": 61,
300
+ "metadata": {},
301
+ "outputs": [
302
+ {
303
+ "data": {
304
+ "text/plain": [
305
+ "[AIMessage(content='FINAL ANSWER: ฉันได้ค้นหาร้านกาแฟใกล้มาบุญครองและพบข้อมูลดังนี้:\\n\\n1. **ร้านกาแฟ A** - ถนนพระราม 1\\n2. **ร้านกาแฟ B** - ถนนพญาไท\\n3. **ร้านกาแฟ C** - ถนนบรรทัดทอง\\n\\nอย่างไรก็ตาม ฉันไม่สามารถค้นหาข้อมูลประชากรในพื้นที่มาบุญครองได้ในขณะนี้ หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับประชากรในพื้นที่ กรุณาให้ผู้ช่วยคนอื่นช่วยค้นหาข้อมูลนี้ต่อไปค่ะ', response_metadata={'token_usage': {'completion_tokens': 129, 'prompt_tokens': 761, 'total_tokens': 890}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-c5d43e75-3c64-45e7-bc56-25366d4a8ba7-0')]"
306
+ ]
307
+ },
308
+ "execution_count": 61,
309
+ "metadata": {},
310
+ "output_type": "execute_result"
311
+ }
312
+ ],
313
+ "source": [
314
+ "list(s.values())[0][\"messages\"][0].content.replace(\"FINAL ANSWER: \", \"\")"
315
  ]
316
  },
317
  {
318
  "cell_type": "code",
319
+ "execution_count": 54,
320
  "metadata": {},
321
  "outputs": [],
322
  "source": [
 
337
  " \n",
338
  " events = [e for e in events]\n",
339
  " \n",
340
+ " response = list(events[-1].values())[0][\"messages\"][0]\n",
341
+ " response = response.content\n",
342
+ " response = response.replace(\"FINAL ANSWER: \", \"\")\n",
343
  " \n",
344
  " return response\n",
345
  "\n",
chatbot_multiagent.py CHANGED
@@ -1,29 +1,38 @@
 
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
@@ -66,7 +75,7 @@ retriever_tool = Tool(
66
  # Bind the tools to the model
67
  tools = [retriever_tool, find_place_from_text, nearby_search] # Include both tools if needed
68
 
69
- llm = ChatOpenAI(model="gpt-4o-mini")
70
 
71
  ## Create agents
72
  def create_agent(llm, tools, system_message: str):
@@ -171,19 +180,19 @@ workflow.add_node("call_tool", tool_node)
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(
@@ -198,6 +207,37 @@ workflow.add_conditional_edges(
198
  workflow.add_edge(START, "analyst")
199
  graph = workflow.compile()
200
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
  def submitUserMessage(user_input: str) -> str:
202
  graph = workflow.compile()
203
 
@@ -215,8 +255,12 @@ def submitUserMessage(user_input: str) -> str:
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("ค้นหาร้านกาแฟใกล้มาบุญครอง")
 
 
 
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 Dict, List, Tuple, Annotated, Sequence, TypedDict
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
 
75
  # Bind the tools to the model
76
  tools = [retriever_tool, find_place_from_text, nearby_search] # Include both tools if needed
77
 
78
+ llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.0)
79
 
80
  ## Create agents
81
  def create_agent(llm, tools, system_message: str):
 
180
  workflow.add_conditional_edges(
181
  "analyst",
182
  router,
183
+ {"continue": "data collector", "call_tool": "call_tool", "__end__": END}
184
  )
185
 
186
  workflow.add_conditional_edges(
187
  "data collector",
188
  router,
189
+ {"continue": "reporter", "call_tool": "call_tool", "__end__": END}
190
  )
191
 
192
  workflow.add_conditional_edges(
193
  "reporter",
194
  router,
195
+ {"continue": "data collector", "__end__": END}
196
  )
197
 
198
  workflow.add_conditional_edges(
 
207
  workflow.add_edge(START, "analyst")
208
  graph = workflow.compile()
209
 
210
+ # %%
211
+ # from IPython.display import Image, display
212
+
213
+ # try:
214
+ # display(Image(graph.get_graph(xray=True).draw_mermaid_png()))
215
+ # except Exception:
216
+ # # This requires some extra dependencies and is optional
217
+ # pass
218
+
219
+ # %%
220
+ # graph = workflow.compile()
221
+
222
+ # events = graph.stream(
223
+ # {
224
+ # "messages": [
225
+ # HumanMessage(
226
+ # content="ค้นหาร้านกาแฟใกล้มาบุญครอง พร้อมวิเคราะห์จำนวนประชากร"
227
+ # )
228
+ # ],
229
+ # },
230
+ # # Maximum number of steps to take in the graph
231
+ # {"recursion_limit": 10},
232
+ # )
233
+ # for s in events:
234
+ # print(s)
235
+ # print("----")
236
+
237
+ # %%
238
+ list(s.values())[0]["messages"][0].content.replace("FINAL ANSWER: ", "")
239
+
240
+ # %%
241
  def submitUserMessage(user_input: str) -> str:
242
  graph = workflow.compile()
243
 
 
255
 
256
  events = [e for e in events]
257
 
258
+ response = list(events[-1].values())[0]["messages"][0]
259
+ response = response.content
260
+ response = response.replace("FINAL ANSWER: ", "")
261
 
262
  return response
263
 
264
+ # submitUserMessage("ค้นหาร้านกาแฟใกล้มาบุญครอง")
265
+
266
+