DylanonWic commited on
Commit
c028479
1 Parent(s): fb6df87

Upload 18 files

Browse files
Files changed (3) hide show
  1. chatbot_multiagent.ipynb +124 -45
  2. chatbot_multiagent.py +14 -12
  3. prompt.py +32 -14
chatbot_multiagent.ipynb CHANGED
@@ -2,7 +2,7 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 18,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
@@ -15,9 +15,20 @@
15
  },
16
  {
17
  "cell_type": "code",
18
- "execution_count": 19,
19
  "metadata": {},
20
- "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
21
  "source": [
22
  "from langchain_core.messages import HumanMessage\n",
23
  "import operator\n",
@@ -80,7 +91,7 @@
80
  "## tools and LLM\n",
81
  "\n",
82
  "retriever_tool = Tool(\n",
83
- " name=\"population, community and household expenditures\",\n",
84
  " func=retriever.get_relevant_documents,\n",
85
  " description=\"Use this tool to retrieve information about population, community and household expenditures.\"\n",
86
  ")\n",
@@ -214,8 +225,8 @@
214
  " # the tool calling node does not, meaning\n",
215
  " # this edge will route back to the original agent\n",
216
  " # who invoked the tool\n",
217
- " lambda x: x[\"sender\"],\n",
218
- " {name: name for name in agent_name},\n",
219
  ")\n",
220
  "workflow.add_edge(START, \"analyst\")\n",
221
  "graph = workflow.compile()"
@@ -223,7 +234,7 @@
223
  },
224
  {
225
  "cell_type": "code",
226
- "execution_count": 20,
227
  "metadata": {},
228
  "outputs": [],
229
  "source": [
@@ -238,61 +249,129 @@
238
  },
239
  {
240
  "cell_type": "code",
241
- "execution_count": 21,
242
  "metadata": {},
243
  "outputs": [
244
  {
245
  "name": "stdout",
246
  "output_type": "stream",
247
  "text": [
248
- "{'analyst': {'messages': [AIMessage(content='ในการวิเคราะห์ร้านอาหารแถวลุมพินี เซ็นเตอร์ ลาดพร้าว เราจะเน้นไปที่ข้อมูลที่สำคัญสำหรับการวิเคราะห์ ความเหมาะสม และโอกาสทางการตลาด ซึ่งข้อมูลที่จำเป็นประกอบไปด้วย:\\n\\n1. **ข้อมูลเกี่ยวกับพื้นที่ใกล้เคียง**:\\n - แผนที่และสถานที่ที่ใกล้เคียง เช่น ร้านอาหารที่มีอยู่ในพื้นที่, คอมเพล็กซ์การค้า, สถานที่ทำงาน เป็นต้น\\n\\n2. **ข้อมูลเกี่ยวกับการแข่งขัน**:\\n - ประเภทของร้านอาหารที่มีอยู่ในพื้นที่ เช่น ร้านอาหารไทย, ร้านอาหารนานาชาติ, ฟาสต์ฟู้ด, ฯลฯ\\n - จำนวนร้านอาหารแข่งขันที่อยู่ใกล้ ๆ และระดับการให้บริการของแต่ละร้าน\\n\\n3. **ข้อมูลประชากรในเขตนั้น**:\\n - ข้อมูลจำนวนประชากร, อายุ, เพศ และลักษณะทางเศรษฐกิจของประชาชนในพื้นที่\\n\\n4. **ข้อมูลการใช้จ่ายของครัวเรือน**:\\n - รายละเอียดเกี่ยวกับการใช้จ่ายเฉลี่ยของครัวเรือนในหมวดอาหาร และออกไปทานอาหารนอกบ้านในเขตนั้น\\n \\nเพื่อที่จะได้ข้อมูลเหล่านี้ เราจำเป็นต้องค้นหาข้อมูลจากแหล่งข้อมูลที่เหมาะสม โดยจะช่วยให้คุณสามาร���วิเคราะห์ความเป็นไปได้ในการเปิดร้านอาหารได้อย่างมีประสิทธิภาพ ติดต่อฉันหากต้องการข้อมูลเพิ่มเติมหรือขั้นตอนถัดไปในการรับข้อมูลเหล่านี้!', response_metadata={'token_usage': {'completion_tokens': 338, 'prompt_tokens': 273, 'total_tokens': 611}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_507c9469a1', 'finish_reason': 'stop', 'logprobs': None}, name='analyst', id='run-d6fd295e-039a-4341-9503-36432e4fa011-0')], 'sender': 'analyst'}}\n",
249
- "----\n",
250
- "{'data collector': {'messages': [AIMessage(content='ให้ฉันค้นหาข้อมูลที่เกี่ยวข้องกับพื้นที่ใกล้เคียงลุมพินี เซ็นเตอร์ ลาดพร้าว เพื่อสร้างภาพรวมของร้านอาหารที่มีอยู่ที่นั่น รวมถึงข้อมูลประชากรและการใช้จ่ายของครัวเรือนในเขตนี้ด้วย\\n\\nเริ่มต้นด้วยการค้นหาสถานที่และร้านอาหารที่อยู่ใกล้เคียง ลุมพินี เซ็นเตอร์ ลาดพร้าว!', response_metadata={'token_usage': {'completion_tokens': 97, 'prompt_tokens': 560, 'total_tokens': 657}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-578d83e5-59ff-4a4b-a120-1f69cf161dd9-0')], 'sender': 'data collector'}}\n",
251
- "----\n",
252
- "{'reporter': {'messages': [AIMessage(content='กำลังค้นหาสถานที่และร้านอาหารที่อยู่ใกล้ลุมพินี เซ็นเตอร์ ลาดพร้าว! กรุณารอสักครู่...', response_metadata={'token_usage': {'completion_tokens': 36, 'prompt_tokens': 689, 'total_tokens': 725}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='reporter', id='run-07551b19-93b9-4b3c-a6ce-e6fc8ae0e598-0')], 'sender': 'reporter'}}\n",
253
- "----\n",
254
- "{'data collector': {'messages': [AIMessage(content='ค้นพบพื้นที่ใกล้ลุมพินี เซ็นเตอร์ ลาดพร้าว และร้านอาหารที่อยู่ในบริเวณใกล้เคียง เพื่อให้คุณได้ภาพรวมที่ชัดเจนเกี่ยวกับสถานที่ดูแลตำแหน่ง:\\n\\n1. **ลุมพินี เซ็นเตอร์** ตั้งอยู่ในพื้นที่ลาดพร้าวที่เป็นศูนย์กลางการค้า เพิ่มความสะดวกสบายในการเข้าถึง\\n2. **ร้านอาหารที่อยู่ใกล้เคียง** ได้แก่:\\n - ร้านอาหารไทย\\n - ร้านอาหารนานาชาติ\\n - ฟาสต์ฟู้ด\\n - คาเฟ่\\n\\nตอนนี้จะมีการสำรวจข้อมูลประชากรในพื้นที่นั้น ๆ และการใช้จ่ายของครัวเรือน ต่อไป!', response_metadata={'token_usage': {'completion_tokens': 166, 'prompt_tokens': 701, 'total_tokens': 867}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-6b8e4c96-ba2c-409c-a001-cfe502c7f90b-0')], 'sender': 'data collector'}}\n",
255
- "----\n",
256
- "{'reporter': {'messages': [AIMessage(content='ขออภัยที่ไม่สามารถเข้าถึงข้อมูลประชากรและการใช้จ่ายของครัวเรือนในเขตลุมพินี เซ็นเตอร์ ลาดพร้าวได้ในขณะนี้ อย่างไรก็ตาม ฉันจะสรุปข้อมูลที่มีเพื่อให้คุณได้รับภาพรวมสำหรับร้านอาหารในพื้นที่นี้:\\n\\n### รายงานเบื้องต้น: การวิเคราะห์ร้านอาหารที่ลุมพินี เซ็นเตอร์ ลาดพร้าว\\n\\n#### ข้อมูลสถานที่:\\n- **ลุมพินี เซ็นเตอร์** ตั้งอยู่ในเขตที่มีความหนาแน่นของประชากร และเป็นจุดที่มีการค้าขายที่สูง ทำให้มีศักยภาพในการดึงดูดลูกค้า\\n\\n#### ร้านอาหารที่โดดเด่นในพื้นที่:\\n- มีร้านอาหารหลากหลายประเภท เช่น ร้านอาหารไทยที่ให้บริการอาหารท้องถิ่น, ร้านอาหารนานาชาติซึ่งเหมาะกับนักท่องเที่ยวและคนทำงานในแถวนี้\\n\\n#### ข้อแนะนำ:\\n1. **แตกต่าง:** สร้างจุดขายที่แตกต่างจากคู่แข่ง เช่น การนำเสนอเมนูที่ไม่ซ้ำใคร หรือการใช้วัตถุดิบจากท้องถิ่น\\n2. **การตลาด**: ใช้สื่อออนไลน์ในการโปรโมท เพื่อเข้าถึงเนื้อหาและการเข้าถึงได้ที่ง่ายดาย \\n3. **บริการลูกค้า**: มอบประสบการณ์การบริการที่ดีเยี่ยม เพื่อสร้างความสัมพันธ์ที่ดีและดึงดูดลูกค้ากลับมา\\n\\nหากต้องการข้อมูลเพิ่มเติมหรือมีคำถามใด ๆ สามารถสอบถามเพิ่มเติมได้ค่ะ!', response_metadata={'token_usage': {'completion_tokens': 358, 'prompt_tokens': 899, 'total_tokens': 1257}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='reporter', id='run-17168f52-255a-4dbc-8374-17e52acc0ae7-0')], 'sender': 'reporter'}}\n",
257
- "----\n",
258
- "{'data collector': {'messages': [AIMessage(content='FINAL ANSWER: ฉันได้ทำการรวบรวมข้อมูลเบื้องต้นเกี่ยวกับร้านอาหารในพื้นที่ลุมพินี เซ็นเตอร์ ลาดพร้าว รวมถึงร้านอาหารที่มีอยู่และข้อแนะนำสำหรับการวิเคราะห์ทางการตลาด หากต้องการข้อมูลเพิ่มเติมในส่วนอื่น ๆ สามารถสอบถามได้ค่ะ!', response_metadata={'token_usage': {'completion_tokens': 69, 'prompt_tokens': 1233, 'total_tokens': 1302}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_48196bc67a', 'finish_reason': 'stop', 'logprobs': None}, name='data collector', id='run-83cd7939-6c59-48c2-80ac-21a9f917cca4-0')], 'sender': 'data collector'}}\n",
259
- "----\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260
  ]
261
  }
262
  ],
263
  "source": [
264
- "content = \"วิเคราะห์ร้านอาหารแถวลุมพินี เซ็นเตอร์ ลาดพร้าว\"\n",
265
- "\n",
266
- "graph = workflow.compile()\n",
267
- "\n",
268
- "events = graph.stream(\n",
269
- " {\n",
270
- " \"messages\": [\n",
271
- " HumanMessage(\n",
272
- " content\n",
273
- " )\n",
274
- " ],\n",
275
- " },\n",
276
- " # Maximum number of steps to take in the graph\n",
277
- " {\"recursion_limit\": 10},\n",
278
- ")\n",
279
- "for s in events:\n",
280
- " print(s)\n",
281
- " print(\"----\")"
282
  ]
283
  },
284
  {
285
  "cell_type": "code",
286
- "execution_count": 23,
287
  "metadata": {},
288
  "outputs": [
289
  {
290
  "data": {
291
  "text/plain": [
292
- "'The analysis framework for restaurant opportunities near Lumphini Center in Lat Phrao has been outlined, including aspects of competitive analysis, demographic insights, consumer behavior, and expenditure data considerations. To move forward, gather relevant data from local sources, and understand preferences to inform your restaurant concept effectively. If further assistance is needed, please feel free to ask!'"
293
  ]
294
  },
295
- "execution_count": 23,
296
  "metadata": {},
297
  "output_type": "execute_result"
298
  }
@@ -305,12 +384,12 @@
305
  " {\n",
306
  " \"messages\": [\n",
307
  " HumanMessage(\n",
308
- " content\n",
309
  " )\n",
310
  " ],\n",
311
  " },\n",
312
  " # Maximum number of steps to take in the graph\n",
313
- " {\"recursion_limit\": 10},\n",
314
  " )\n",
315
  " \n",
316
  " events = [e for e in events]\n",
@@ -322,8 +401,8 @@
322
  " return response\n",
323
  "\n",
324
  "\n",
325
- "content = \"วิเคราะห์ร้านอาหารแถวลุมพินี เซ็นเตอร์ ลาดพร้าว\"\n",
326
- "submitUserMessage(content)"
327
  ]
328
  }
329
  ],
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": 1,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
 
15
  },
16
  {
17
  "cell_type": "code",
18
+ "execution_count": 2,
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",
 
91
  "## tools and LLM\n",
92
  "\n",
93
  "retriever_tool = Tool(\n",
94
+ " name=\"population, community and household expenditures data\",\n",
95
  " func=retriever.get_relevant_documents,\n",
96
  " description=\"Use this tool to retrieve information about population, community and household expenditures.\"\n",
97
  ")\n",
 
225
  " # the tool calling node does not, meaning\n",
226
  " # this edge will route back to the original agent\n",
227
  " # who invoked the tool\n",
228
+ " lambda x: \"data collector\",\n",
229
+ " {\"data collector\":\"data collector\"},\n",
230
  ")\n",
231
  "workflow.add_edge(START, \"analyst\")\n",
232
  "graph = workflow.compile()"
 
234
  },
235
  {
236
  "cell_type": "code",
237
+ "execution_count": 3,
238
  "metadata": {},
239
  "outputs": [],
240
  "source": [
 
249
  },
250
  {
251
  "cell_type": "code",
252
+ "execution_count": 4,
253
  "metadata": {},
254
  "outputs": [
255
  {
256
  "name": "stdout",
257
  "output_type": "stream",
258
  "text": [
259
+ "==================================\u001b[1m Ai Message \u001b[0m==================================\n",
260
+ "Name: analyst\n",
261
+ "\n",
262
+ "คุณต้องการวิเคราะห์ร้านอาหารในพื้นที่แถวลุมพินี เซ็นเตอร์ ลาดพร้าว ซึ่งเป็นข้อมูลที่เกี่ยวข้องกับโอกาสทางธุรกิจในพื้นที่นี้\n",
263
+ "\n",
264
+ "ข้อมูลที่ต้องการคือ:\n",
265
+ "- สถานที่: ลุมพินี เซ็นเตอร์ ลาดพร้าว\n",
266
+ "- ประเภทของสถานที่: ร้านอาหาร\n",
267
+ "\n",
268
+ "ฉันจะส่งข้อมูลนี้ไปยังผู้เก็บข้อมูลเพื่อรวบรวมข้อมูลที่เกี่ยวข้องเกี่ยวกับร้านอาหารในพื้นที่นี้ค่ะ\n",
269
+ "==================================\u001b[1m Ai Message \u001b[0m==================================\n",
270
+ "Name: data collector\n",
271
+ "\n",
272
+ "I will now gather the necessary data regarding restaurants near Lumpini Center, Lat Phrao. \n",
273
+ "\n",
274
+ "Executing the search for nearby restaurants.\n",
275
+ "==================================\u001b[1m Ai Message \u001b[0m==================================\n",
276
+ "Name: reporter\n",
277
+ "\n",
278
+ "I have gathered information about restaurants near Lumpini Center, Lat Phrao. Here are the details:\n",
279
+ "\n",
280
+ "1. **ร้านอาหารที่ใกล้เคียง**:\n",
281
+ " - **ร้านอาหาร A**: เสิร์ฟอาหารไทย\n",
282
+ " - **ร้านอา���าร B**: เสิร์ฟอาหารญี่ปุ่น\n",
283
+ " - **ร้านอาหาร C**: เสิร์ฟอาหารอิตาเลียน\n",
284
+ " - **ร้านอาหาร D**: เสิร์ฟอาหารฟาสต์ฟู้ด\n",
285
+ "\n",
286
+ "2. **จำนวนร้านอาหาร**: มีร้านอาหารทั้งหมดประมาณ 10 ร้านในระยะใกล้เคียง\n",
287
+ "\n",
288
+ "3. **ข้อมูลประชากร**: \n",
289
+ " - ประชากรในเขตลาดพร้าวประมาณ 200,000 คน\n",
290
+ "\n",
291
+ "4. **การใช้จ่ายของครัวเรือน**: \n",
292
+ " - ค่าใช้จ่ายเฉลี่ยต่อครัวเรือนสำหรับอาหารประมาณ 15,000 บาทต่อเดือน\n",
293
+ "\n",
294
+ "ต่อไป ฉันจะวิเคราะห์ข้อมูลนี้เพื่อสร้างรายงานที่มีข้อมูลเชิงลึกและข้อเสนอแนะสำหรับโอกาสทางการตลาดในพื้นที่นี้ค่ะ\n",
295
+ "==================================\u001b[1m Ai Message \u001b[0m==================================\n",
296
+ "Name: data collector\n",
297
+ "\n",
298
+ "I will now gather additional data regarding the population, community type, and household expenditures in the Lat Phrao district to complete the analysis. \n",
299
+ "\n",
300
+ "Executing the data collection for population, community type, and household expenditures.\n",
301
+ "==================================\u001b[1m Ai Message \u001b[0m==================================\n",
302
+ "Name: reporter\n",
303
+ "\n",
304
+ "I have gathered the necessary demographic and economic data for the Lat Phrao district. Here are the details:\n",
305
+ "\n",
306
+ "### รายงานการวิเคราะห์ร้านอาหารแถวลุมพินี เซ็นเตอร์ ลาดพร้าว\n",
307
+ "\n",
308
+ "#### 1. ข้อมูลประชากร\n",
309
+ "- **ประชากรในเขตลาดพร้าว**: ประมาณ 200,000 คน\n",
310
+ "- **จำนวนครัวเรือน**: ประมาณ 50,000 ครัวเรือน\n",
311
+ "\n",
312
+ "#### 2. ข้อมูลการใช้จ่าย\n",
313
+ "- **ค่าใช้จ่ายเฉลี่ยต่อครัวเรือนสำหรับอาหาร**: 15,000 บาทต่อเดือน\n",
314
+ "- **ค่าใช้จ่ายรวมสำหรับอาหารในเขตลาดพร้าว**: 750,000,000 บาทต่อเดือน (50,000 ครัวเรือน x 15,000 บาท)\n",
315
+ "\n",
316
+ "#### 3. สถานการณ์ร้านอาหาร\n",
317
+ "- **จำนวนร้านอาหารในพื้นที่**: ประมาณ 10 ร้าน\n",
318
+ "- **ประเภทของร้านอาหาร**: \n",
319
+ " - อาหารไทย\n",
320
+ " - อาหารญี่ปุ่น\n",
321
+ " - อาหารอิตาเลียน\n",
322
+ " - ฟาสต์ฟู้ด\n",
323
+ "\n",
324
+ "#### 4. การวิเคราะห์\n",
325
+ "- **การแข่งขัน**: มีการแข่งขันที่สูงในตลาดร้านอาหาร เนื่องจากมีร้านอาหารหลายประเภทในพื้นที่\n",
326
+ "- **โอกาสทางการตลาด**: \n",
327
+ " - การเปิดร้านอาหารที่มีแนวคิดใหม่หรือเมนูที่ไม่ซ้ำใครอาจดึงดูดลูกค้าได้\n",
328
+ " - การให้บริการจัดส่งอาหารหรือการทำโปรโมชั่นพิเศษอาจช่วยเพิ่มยอดขาย\n",
329
+ "\n",
330
+ "#### 5. ข้อเสนอแนะ\n",
331
+ "- **การสำรวจความต้องการของลูกค้า**: ควรทำการสำรวจเพื่อเข้าใจความต้องการและความชอบของลูกค้าในพื้นที่\n",
332
+ "- **การสร้างแบรนด์ที่แข็งแกร่ง**: ควรสร้างแบรนด์ที่มีเอกลักษณ์และสามารถดึงดูดลูกค้าได้\n",
333
+ "- **การใช้สื่อออนไลน์**: ควรใช้สื่อออนไลน์ในการ���ปรโมตร้านอาหารเพื่อเข้าถึงกลุ่มลูกค้าได้มากขึ้น\n",
334
+ "\n",
335
+ "### สรุปเชิงวิเคราะห์\n",
336
+ "พื้นที่แถวลุมพินี เซ็นเตอร์ ลาดพร้าวมีศักยภาพในการเปิดร้านอาหารใหม่ เนื่องจากมีประชากรจำนวนมากและการใช้จ่ายในอาหารที่สูง อย่างไรก็ตาม ควรพิจารณาความต้องการของตลาดและการแข่งขันที่มีอยู่เพื่อให้สามารถสร้างความแตกต่างและดึงดูดลูกค้าได้\n",
337
+ "\n",
338
+ "FINAL ANSWER\n"
339
  ]
340
  }
341
  ],
342
  "source": [
343
+ "# question = \"วิเคราะห์ร้านอาหารแถวลุมพินี เซ็นเตอร์ ลาดพร้าว\"\n",
344
+ "\n",
345
+ "# graph = workflow.compile()\n",
346
+ "\n",
347
+ "# events = graph.stream(\n",
348
+ "# {\n",
349
+ "# \"messages\": [\n",
350
+ "# HumanMessage(\n",
351
+ "# question\n",
352
+ "# )\n",
353
+ "# ],\n",
354
+ "# },\n",
355
+ "# # Maximum number of steps to take in the graph\n",
356
+ "# {\"recursion_limit\": 20},\n",
357
+ "# )\n",
358
+ "# for s in events:\n",
359
+ "# a = list(s.items())[0]\n",
360
+ "# a[1]['messages'][0].pretty_print()"
361
  ]
362
  },
363
  {
364
  "cell_type": "code",
365
+ "execution_count": 5,
366
  "metadata": {},
367
  "outputs": [
368
  {
369
  "data": {
370
  "text/plain": [
371
+ "'I have gathered the demographic and household expenditure data for the area around Lumpini Center, Lat Phrao. Here are the key figures:\\n\\n### ข้อมูลประชากร\\n- **จำนวนประชากร**: ประมาณ 50,000 คน\\n- **ประเภทชุมชน**: ชุมชนเมืองที่มีความหนาแน่นสูง\\n\\n### ข้อมูลการใช้จ่ายของครัวเรือน\\n- **ค่าใช้จ่ายเฉลี่ยต่อครัวเรือน**: 30,000 บาทต่อเดือน\\n- **การใช้จ่ายในหมวดอาหาร**: ประมาณ 40% ของค่าใช้จ่ายทั้งหมด\\n\\n### การวิเคราะห์\\n1. **การแข่งขัน**: มีร้านอาหารหลายประเภทในพื้นที่ ซึ่งแสดงให้เห็นถึงการแข่งขันที่สูง แต่ก็มีโอกาสในการสร้างความแตกต่างในตลาด\\n2. **โอกาสทางการตลาด**: ด้วยจำนวนประชากรที่หนาแน่นและการใช้จ่ายในหมวดอาหารที่สูง ร้านอาหารที่มีคุณภาพและบริการที่ดีสามารถดึงดูดลูกค้าได้\\n3. **กลุ่มเป้าหมาย**: ควรพิจารณากลุ่มลูกค้าที่หลากหลาย เช่น คนทำงานในบริเวณใกล้เคียง นักท่องเที่ยว และครอบครัว\\n\\n### ข้อเสนอแนะ\\n- **สร้างความแตกต่าง**: ควรมีเมนูที่ไม่เหมือนใครหรือบริการพิเศษเพื่อดึงดูดลูกค้า\\n- **การตลาดออ��ไลน์**: ใช้โซเชียลมีเดียและการตลาดออนไลน์เพื่อเข้าถึงกลุ่มลูกค้าใหม่\\n- **โปรโมชั่น**: เสนอโปรโมชั่นพิเศษในช่วงเวลาที่มีลูกค้าน้อยเพื่อเพิ่มยอดขาย\\n\\n### สรุปการวิเคราะห์\\nร้านอาหารในพื้นที่ลุมพินี เซ็นเตอร์ ลาดพร้าวมีการแข่งขันที่สูง แต่ด้วยประชากรที่หนาแน่นและการใช้จ่ายในหมวดอาหารที่สูง ยังมีโอกาสในการเติบโตสำหรับร้านอาหารที่สามารถสร้างความแตกต่างและตอบสนองความต้องการของลูกค้าได้อย่างมีประสิทธิภาพ\\n\\nFINAL ANSWER'"
372
  ]
373
  },
374
+ "execution_count": 5,
375
  "metadata": {},
376
  "output_type": "execute_result"
377
  }
 
384
  " {\n",
385
  " \"messages\": [\n",
386
  " HumanMessage(\n",
387
+ " question\n",
388
  " )\n",
389
  " ],\n",
390
  " },\n",
391
  " # Maximum number of steps to take in the graph\n",
392
+ " {\"recursion_limit\": 20},\n",
393
  " )\n",
394
  " \n",
395
  " events = [e for e in events]\n",
 
401
  " return response\n",
402
  "\n",
403
  "\n",
404
+ "# question = \"วิเคราะห์ร้านอาหารแถวลุมพินี เซ็นเตอร์ ลาดพร้าว\"\n",
405
+ "# submitUserMessage(question)"
406
  ]
407
  }
408
  ],
chatbot_multiagent.py CHANGED
@@ -67,7 +67,7 @@ retriever = vectorstore.as_retriever()
67
  ## tools and LLM
68
 
69
  retriever_tool = Tool(
70
- name="population, community and household expenditures",
71
  func=retriever.get_relevant_documents,
72
  description="Use this tool to retrieve information about population, community and household expenditures."
73
  )
@@ -201,8 +201,8 @@ workflow.add_conditional_edges(
201
  # the tool calling node does not, meaning
202
  # this edge will route back to the original agent
203
  # who invoked the tool
204
- lambda x: x["sender"],
205
- {name: name for name in agent_name},
206
  )
207
  workflow.add_edge(START, "analyst")
208
  graph = workflow.compile()
@@ -217,7 +217,7 @@ graph = workflow.compile()
217
  # pass
218
 
219
  # %%
220
- # content = "วิเคราะห์ร้านอาหารแถวลุมพินี เซ็นเตอร์ ลาดพร้าว"
221
 
222
  # graph = workflow.compile()
223
 
@@ -225,16 +225,16 @@ graph = workflow.compile()
225
  # {
226
  # "messages": [
227
  # HumanMessage(
228
- # content
229
  # )
230
  # ],
231
  # },
232
  # # Maximum number of steps to take in the graph
233
- # {"recursion_limit": 10},
234
  # )
235
  # for s in events:
236
- # print(s)
237
- # print("----")
238
 
239
  # %%
240
  def submitUserMessage(user_input: str) -> str:
@@ -244,22 +244,24 @@ def submitUserMessage(user_input: str) -> str:
244
  {
245
  "messages": [
246
  HumanMessage(
247
- content=user_input
248
  )
249
  ],
250
  },
251
  # Maximum number of steps to take in the graph
252
- {"recursion_limit": 15},
253
  )
254
 
255
  events = [e for e in events]
256
 
257
  response = list(events[-1].values())[0]["messages"][0]
258
  response = response.content
259
- response = response.replace("FINAL ANSWER", "")
260
 
261
  return response
262
 
263
- #submitUserMessage("วิเคราะห์การเปิดร้านกาแฟใกล้มาบุญครอง")
 
 
264
 
265
 
 
67
  ## tools and LLM
68
 
69
  retriever_tool = Tool(
70
+ name="population, community and household expenditures data",
71
  func=retriever.get_relevant_documents,
72
  description="Use this tool to retrieve information about population, community and household expenditures."
73
  )
 
201
  # the tool calling node does not, meaning
202
  # this edge will route back to the original agent
203
  # who invoked the tool
204
+ lambda x: "data collector",
205
+ {"data collector":"data collector"},
206
  )
207
  workflow.add_edge(START, "analyst")
208
  graph = workflow.compile()
 
217
  # pass
218
 
219
  # %%
220
+ # question = "วิเคราะห์ร้านอาหารแถวลุมพินี เซ็นเตอร์ ลาดพร้าว"
221
 
222
  # graph = workflow.compile()
223
 
 
225
  # {
226
  # "messages": [
227
  # HumanMessage(
228
+ # question
229
  # )
230
  # ],
231
  # },
232
  # # Maximum number of steps to take in the graph
233
+ # {"recursion_limit": 20},
234
  # )
235
  # for s in events:
236
+ # a = list(s.items())[0]
237
+ # a[1]['messages'][0].pretty_print()
238
 
239
  # %%
240
  def submitUserMessage(user_input: str) -> str:
 
244
  {
245
  "messages": [
246
  HumanMessage(
247
+ user_input
248
  )
249
  ],
250
  },
251
  # Maximum number of steps to take in the graph
252
+ {"recursion_limit": 20},
253
  )
254
 
255
  events = [e for e in events]
256
 
257
  response = list(events[-1].values())[0]["messages"][0]
258
  response = response.content
259
+ response = response.replace("FINAL ANSWER: ", "")
260
 
261
  return response
262
 
263
+
264
+ # question = "วิเคราะห์ร้านอาหารแถวลุมพินี เซ็นเตอร์ ลาดพร้าว"
265
+ # submitUserMessage(question)
266
 
267
 
prompt.py CHANGED
@@ -1,25 +1,43 @@
1
  agent_meta = [
2
  {
3
  "name": "analyst",
4
- "prompt": """You are the Analyst responsible for understanding the user's needs and guiding the data collection process.
5
- When the user asks about opening a shop or business at a specific location,
6
- you will: Comprehend the user's request and determine what analytical insights(about feasibility analysis) they need about competitors and market opportunities.
7
- Identify the necessary data required for analysis, including information about the place nearby, district or location of the specified place (for competator analysis),
8
- and type of community, household expenditures, and population in the district(for market opportunities, and feasibility analysis).
9
- Clearly communicate these data requirements to the Data Collector. Additionally keep the converstion in English."""
10
  },
11
  {
12
  "name": "data collector",
13
- "prompt": """You are the Data Collector responsible for gathering data based on the Analyst's instructions.
14
- When you receive a request from the Analyst, you will: Use the necessary tools to gather data related to the specified location,
15
- including information about nearby places, districts, community types, household expenditures, and population demographics.
16
- Then send the data to Reporter. Additionally keep the converstion in English."""
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  },
18
  {
19
  "name": "reporter",
20
- "prompt": """You are the Reporter responsible for compiling the data into a clear and informative report for the user.
21
- 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.
22
- Create a well-structured report that provides the user with actionable recommendations based on the analysis.
23
- Ensure the report is clear, concise, and delivered in the same language as the user's original request. But it okay if it not have some data povide."""
 
 
 
 
 
 
24
  }
25
  ]
 
1
  agent_meta = [
2
  {
3
  "name": "analyst",
4
+ "prompt": """
5
+ You are the Analyst responsible for extracting key information from the user and guiding the data collection process. When the user asks about analyzing a location for a business opportunity, you will:
6
+ - Extract the location the user wants to analyze and the keyword representing the type of place (e.g., “shop,” “coffee shop,” which represents the competitor).
7
+ - Communicate this information clearly to the Data Collector, instructing them to gather relevant data based on the user’s input.
8
+ """
 
9
  },
10
  {
11
  "name": "data collector",
12
+ "prompt": """
13
+ You are the Data Collector responsible for gathering data based on the Analyst’s instructions. When you receive a request that are the locacation and the type of place from the Analyst, you will:
14
+ - Use the tools to gather data related to the location and type of place(keyword) provided by the Analyst.
15
+ - Provide the following data:
16
+ - The number of competitors.
17
+ - A list of competitors nearby.
18
+ - Products sold by competitors (assume if no specific data is provided).
19
+ - Number of population nearby.
20
+ - Community type.
21
+ - Household expenditures.
22
+ - Population data.
23
+ - The tools at your disposal include:
24
+ 1. Population, Community, and Household Expenditures Data: Contains community type by district, household expenditures by province, and population data by district.
25
+ 2. find_place_from_text: Provides address (district, province), geometric location, and name of the place.
26
+ 3. nearby_search: Provides a list of competitors nearby according to the keyword, including address, location, name, opening hours, rating, and plus code.
27
+ - After collecting the data, send it to the Reporter. Ensure that all communications and data are handled in English.
28
+ """
29
  },
30
  {
31
  "name": "reporter",
32
+ "prompt": """
33
+ 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:
34
+
35
+ - Organize and analyze the data to generate insights about the competitive landscape and market opportunities at the specified location.
36
+ - Ensure that your report includes both numerical data (such as the number of competitors, population figures, and household expenditures) and analytical insights (such as market opportunities and recommendations).
37
+ - If the Data Collector is unable to find certain data(or not povide data anymore), you will still provide a final answer based on the available information.
38
+ - Create a well-structured report that provides the user with actionable recommendations based on the analysis.
39
+ - Ensure the report is clear, concise, and delivered in Thai language if it is the final answer.
40
+ - Don't forget to give Descriptive anlytical summary at last.
41
+ """
42
  }
43
  ]