kltn21110 commited on
Commit
7fd4249
·
verified ·
1 Parent(s): 85abdeb

Update function/agent/function_call.py

Browse files
Files changed (1) hide show
  1. function/agent/function_call.py +181 -191
function/agent/function_call.py CHANGED
@@ -1,191 +1,181 @@
1
- from langchain_core.tools import tool
2
- from langchain_openai import ChatOpenAI
3
- import os
4
- import os,sys
5
- BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))
6
- sys.path.insert(0, BASE_DIR)
7
- import function.gemini_response.filter_query_internal as filter_query
8
-
9
- import os
10
-
11
- api_key = os.getenv("OPENAI_API_KEY")
12
- os.environ["OPENAI_API_KEY"] = api_key
13
- llm = ChatOpenAI(model="gpt-4.1-mini")
14
-
15
- #Test google
16
- os.environ["GOOGLE_API_KEY"] = "AIzaSyB_7ahCuAOZU0UKcON_A00ya5breHTEgQM"
17
- from langchain_google_genai import GoogleGenerativeAIEmbeddings, ChatGoogleGenerativeAI
18
- llm1 = ChatGoogleGenerativeAI(model='gemini-2.5-flash-preview-05-20',temperature=0.6)
19
-
20
- from langchain_core.messages import HumanMessage, ToolMessage
21
-
22
-
23
- @tool
24
- def question_information(query: str) -> str:
25
- """
26
- Trả lời các câu hỏi về thông tin liên hệ của cửa hàng, thông tin về sinh viên, tên đề tài các nội dung liên quan mà không phải sql
27
-
28
- Hàm này chỉ phục vụ mục đích cung cấp thông tin liên lạc của cửa hàng, bao gồm:
29
- - Số điện thoại liên hệ.
30
- - Địa chỉ cửa hàng.
31
- - Giờ làm việc.
32
- - Email hỗ trợ.
33
- - Các kênh liên hệ khác như Facebook, Zalo, v.v.
34
-
35
- ⚠️ Lưu ý:
36
- - Hàm này KHÔNG trả lời các câu hỏi khác như: gợi ý món ăn, tư vấn sản phẩm, giá cả, chương trình khuyến mãi, cách pha chế đồ uống, v.v.
37
- - Nếu truy vấn không liên quan đến thông tin cửa hàng, hàm sẽ từ chối trả lời.
38
-
39
- Args:
40
- query (str): Câu hỏi của người dùng liên quan đến thông tin liên hệ của cửa hàng. bao gồm:
41
- - Số điện thoại liên hệ.
42
- - Địa chỉ cửa hàng.
43
- - Giờ làm việc.
44
- - Email hỗ trợ.
45
- - Các kênh liên hệ khác như Facebook, Zalo, v.v.
46
-
47
- Returns:
48
- str: Thông tin liên hệ của cửa hàng hoặc thông báo từ chối nếu câu hỏi không phù hợp. Xác định rõ câu hỏi không viết gọn
49
- """
50
- return query
51
-
52
-
53
- @tool
54
- def question_sql(query: str)->str:
55
- """
56
- Hỗ trợ truy xuất schema của database để giúp tạo truy vấn SQL cho các bảng sau:
57
-
58
- - **Giỏ hàng (cart, cart_item)**
59
- - **Danh mục sản phẩm(tên sản phẩm) (category, category_translation)**
60
- - **Liên hệ và yêu thích (contact, favourite, favourite_item)**
61
- - **Thông báo (notification)**
62
- - **Đơn hàng (orders, order_item, shipment)**
63
- - **Thanh toán (otp, payments)**
64
- - **Bài viết & tin tức (post, post_translation)**
65
- - **Lịch sử giá (price_history)**
66
- - **Sản phẩm (product, product_translation, product_variants)**
67
- - **Đánh giá sản phẩm (review)**
68
- - **Người dùng (user, user_coin, token)**
69
- - **Mã giảm giá & phiếu giảm giá (voucher, user_voucher)**
70
- - **Xác nhận về mua/xem, xóa giỏ hàng, đơn hàng**(Hãy lưu ý những câu hỏi về này)
71
-
72
- ⚠ **Lưu ý**:
73
- - Chỉ hỗ trợ truy vấn liên quan đến các bảng trong database.
74
- - Không trả lời các câu hỏi về thông tin cửa hàng như số điện thoại, email, giờ làm việc.
75
-
76
- Args:
77
- query (str): Câu hỏi liên quan đến việc truy vấn dữ liệu từ database.
78
-
79
- Returns:
80
- str: Mô tả bảng tương ứng hoặc thông báo từ chối nếu câu hỏi không phù hợp.
81
- """
82
- return query
83
-
84
-
85
- @tool
86
- def question_general(query: str) -> str:
87
- """
88
- Xử lý các câu hỏi không liên quan đến các công cụ có sẵn.
89
-
90
- Hàm này nhận vào một câu hỏi dưới dạng chuỗi và trả về câu hỏi đó
91
- mà không thực hiện bất kỳ xử lý nào khác. Nó có thể được sử dụng như
92
- một phương án dự phòng khi không có tool nào phù hợp để xử lý câu hỏi.
93
-
94
- Args:
95
- query (str): Câu hỏi đầu vào từ người dùng.
96
-
97
- Returns:
98
- str: Trả về chính câu hỏi mà không thay đổi.
99
- """
100
- return query
101
-
102
-
103
-
104
-
105
- @tool(description="""ác định xem truy vấn có phải là câu chào hỏi hay không.
106
- Câu chào hỏi bao gồm các từ hoặc cụm từ thể hiện sự chào đón, bắt đầu cuộc trò chuyện, chẳng hạn như:
107
- - "Xin chào", "Chào bạn", "Hello", "Hi", "Hey", "Good morning", "Good evening", ...
108
- - Cụm từ mang ý nghĩa xã giao: "Rất vui được gặp bạn", "Hôm nay bạn thế nào?", "Chúc một ngày tốt lành", ...
109
-
110
- Lưu ý:
111
- - Chỉ xử lý các câu hỏi thuộc nhóm chào hỏi.
112
- - Không liên quan đến **question_sql** hoặc các câu hỏi về dữ liệu.
113
-
114
- Args:
115
- query (str): Câu hỏi đầu vào của người dùng.
116
-
117
- Returns:
118
- str: Trả về câu hỏi nếu nó thuộc nhóm chào hỏi, ngược lại có thể xử lý theo yêu cầu cụ thể.""")
119
- def question_hello(query: str)->str:
120
- """
121
- Xác định xem truy vấn có phải là câu chào hỏi hay không.
122
- Câu chào hỏi bao gồm các từ hoặc cụm từ thể hiện sự chào đón, bắt đầu cuộc trò chuyện, chẳng hạn như:
123
- - "Xin chào", "Chào bạn", "Hello", "Hi", "Hey", "Good morning", "Good evening", ...
124
- - Cụm từ mang ý nghĩa xã giao: "Rất vui được gặp bạn", "Hôm nay bạn thế nào?", "Chúc một ngày tốt lành", ...
125
-
126
- Lưu ý:
127
- - Chỉ xử lý các câu hỏi thuộc nhóm chào hỏi.
128
- - Không liên quan đến **question_sql** hoặc các câu hỏi về dữ liệu.
129
-
130
- Args:
131
- query (str): Câu hỏi đầu vào của người dùng.
132
-
133
- Returns:
134
- str: Trả về câu hỏi nếu nó thuộc nhóm chào hỏi, ngược lại có thể xử lý theo yêu cầu cụ thể.
135
- """
136
- return query
137
-
138
-
139
- import asyncio
140
- import importlib
141
- import function.chat as chat_module
142
- async def update_tool_calls(tool_calls, chat_id,user_id,user_input):
143
-
144
- updated_calls = []
145
-
146
- for tool in tool_calls:
147
- query = tool['args']['query']
148
- list_history = await chat_module.get_chat_details_text(chat_id, user_id)
149
- new_question = await filter_query.response_rename_question(user_input, list_history,query)
150
- tool['args']['query'] = new_question
151
- new_name = await filter_query.response_general(new_question, list_history)
152
- if new_name is not None and new_name == "question_sql":
153
- tool['name'] = new_name.strip()
154
- updated_calls.append(tool)
155
- if new_name == "question_general":
156
- tool['name'] = new_name.strip()
157
- updated_calls.append(tool)
158
- return updated_calls
159
- else:
160
- return tool_calls
161
-
162
- return updated_calls
163
-
164
-
165
- async def process_user_query(user_input, user_id, role, language,chat_id):
166
- always_call_tool_llm = llm.bind_tools([question_information, question_sql, question_hello], tool_choice=True,strict=True)
167
- tool_calls = always_call_tool_llm.invoke(f"{user_input}").tool_calls
168
-
169
- for tc in tool_calls:
170
- tc["user_id"] = user_id
171
- tc["role"] = role
172
- tc["language"] = language
173
- print("Tool gốc:",tool_calls)
174
- data = await update_tool_calls(tool_calls,chat_id,user_id,user_input)
175
-
176
- for item in data:
177
- item['chat_id'] = chat_id
178
- print("Tool update: ", data)
179
- return data
180
-
181
-
182
- # import asyncio
183
-
184
- async def main():
185
- await process_user_query("Tôi muốn thêm trà chanh size L vào giỏ hàng", 4, "CUSTOMER", "VN", "67d2fc6607b51a01e3beb501")
186
-
187
- if __name__ == "__main__":
188
- loop = asyncio.new_event_loop()
189
- asyncio.set_event_loop(loop)
190
- loop.run_until_complete(main())
191
- loop.close()
 
1
+ from langchain_core.tools import tool
2
+ from langchain_openai import ChatOpenAI
3
+ import os
4
+ import os,sys
5
+ BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))
6
+ sys.path.insert(0, BASE_DIR)
7
+ import function.gemini_response.filter_query_internal as filter_query
8
+
9
+ import os
10
+
11
+ api_key = os.getenv("OPENAI_API_KEY")
12
+ os.environ["OPENAI_API_KEY"] = api_key
13
+ llm = ChatOpenAI(model="gpt-4.1-mini")
14
+
15
+ #Test google
16
+ os.environ["GOOGLE_API_KEY"] = "AIzaSyB_7ahCuAOZU0UKcON_A00ya5breHTEgQM"
17
+ from langchain_google_genai import GoogleGenerativeAIEmbeddings, ChatGoogleGenerativeAI
18
+ llm1 = ChatGoogleGenerativeAI(model='gemini-2.5-flash-preview-05-20',temperature=0.6)
19
+
20
+ from langchain_core.messages import HumanMessage, ToolMessage
21
+
22
+
23
+ @tool
24
+ def question_information(query: str) -> str:
25
+ """
26
+ Trả lời các câu hỏi về thông tin liên hệ của cửa hàng, thông tin về sinh viên, tên đề tài các nội dung liên quan mà không phải sql
27
+
28
+ Hàm này chỉ phục vụ mục đích cung cấp thông tin liên lạc của cửa hàng, bao gồm:
29
+ - Số điện thoại liên hệ.
30
+ - Địa chỉ cửa hàng.
31
+ - Giờ làm việc.
32
+ - Email hỗ trợ.
33
+ - Các kênh liên hệ khác như Facebook, Zalo, v.v.
34
+
35
+ ⚠️ Lưu ý:
36
+ - Hàm này KHÔNG trả lời các câu hỏi khác như: gợi ý món ăn, tư vấn sản phẩm, giá cả, chương trình khuyến mãi, cách pha chế đồ uống, v.v.
37
+ - Nếu truy vấn không liên quan đến thông tin cửa hàng, hàm sẽ từ chối trả lời.
38
+
39
+ Args:
40
+ query (str): Câu hỏi của người dùng liên quan đến thông tin liên hệ của cửa hàng. bao gồm:
41
+ - Số điện thoại liên hệ.
42
+ - Địa chỉ cửa hàng.
43
+ - Giờ làm việc.
44
+ - Email hỗ trợ.
45
+ - Các kênh liên hệ khác như Facebook, Zalo, v.v.
46
+
47
+ Returns:
48
+ str: Thông tin liên hệ của cửa hàng hoặc thông báo từ chối nếu câu hỏi không phù hợp. Xác định rõ câu hỏi không viết gọn
49
+ """
50
+ return query
51
+
52
+
53
+ @tool
54
+ def question_sql(query: str)->str:
55
+ """
56
+ Hỗ trợ truy xuất schema của database để giúp tạo truy vấn SQL cho các bảng sau:
57
+
58
+ - **Giỏ hàng (cart, cart_item)**
59
+ - **Danh mục sản phẩm(tên sản phẩm) (category, category_translation)**
60
+ - **Liên hệ và yêu thích (contact, favourite, favourite_item)**
61
+ - **Thông báo (notification)**
62
+ - **Đơn hàng (orders, order_item, shipment)**
63
+ - **Thanh toán (otp, payments)**
64
+ - **Bài viết & tin tức (post, post_translation)**
65
+ - **Lịch sử giá (price_history)**
66
+ - **Sản phẩm (product, product_translation, product_variants)**
67
+ - **Đánh giá sản phẩm (review)**
68
+ - **Người dùng (user, user_coin, token)**
69
+ - **Mã giảm giá & phiếu giảm giá (voucher, user_voucher)**
70
+ - **Xác nhận về mua/xem, xóa giỏ hàng, đơn hàng**(Hãy lưu ý những câu hỏi về này)
71
+
72
+ ⚠ **Lưu ý**:
73
+ - Chỉ hỗ trợ truy vấn liên quan đến các bảng trong database.
74
+ - Không trả lời các câu hỏi về thông tin cửa hàng như số điện thoại, email, giờ làm việc.
75
+
76
+ Args:
77
+ query (str): Câu hỏi liên quan đến việc truy vấn dữ liệu từ database.
78
+
79
+ Returns:
80
+ str: Mô tả bảng tương ứng hoặc thông báo từ chối nếu câu hỏi không phù hợp.
81
+ """
82
+ return query
83
+
84
+
85
+ @tool
86
+ def question_general(query: str) -> str:
87
+ """
88
+ Xử lý các câu hỏi không liên quan đến các công cụ có sẵn.
89
+
90
+ Hàm này nhận vào một câu hỏi dưới dạng chuỗi và trả về câu hỏi đó
91
+ mà không thực hiện bất kỳ xử lý nào khác. Nó có thể được sử dụng như
92
+ một phương án dự phòng khi không có tool nào phù hợp để xử lý câu hỏi.
93
+
94
+ Args:
95
+ query (str): Câu hỏi đầu vào từ người dùng.
96
+
97
+ Returns:
98
+ str: Trả về chính câu hỏi mà không thay đổi.
99
+ """
100
+ return query
101
+
102
+
103
+
104
+
105
+ @tool(description="""ác định xem truy vấn có phải là câu chào hỏi hay không.
106
+ Câu chào hỏi bao gồm các từ hoặc cụm từ thể hiện sự chào đón, bắt đầu cuộc trò chuyện, chẳng hạn như:
107
+ - "Xin chào", "Chào bạn", "Hello", "Hi", "Hey", "Good morning", "Good evening", ...
108
+ - Cụm từ mang ý nghĩa xã giao: "Rất vui được gặp bạn", "Hôm nay bạn thế nào?", "Chúc một ngày tốt lành", ...
109
+
110
+ Lưu ý:
111
+ - Chỉ xử lý các câu hỏi thuộc nhóm chào hỏi.
112
+ - Không liên quan đến **question_sql** hoặc các câu hỏi về dữ liệu.
113
+
114
+ Args:
115
+ query (str): Câu hỏi đầu vào của người dùng.
116
+
117
+ Returns:
118
+ str: Trả về câu hỏi nếu nó thuộc nhóm chào hỏi, ngược lại có thể xử lý theo yêu cầu cụ thể.""")
119
+ def question_hello(query: str)->str:
120
+ """
121
+ Xác định xem truy vấn có phải là câu chào hỏi hay không.
122
+ Câu chào hỏi bao gồm các từ hoặc cụm từ thể hiện sự chào đón, bắt đầu cuộc trò chuyện, chẳng hạn như:
123
+ - "Xin chào", "Chào bạn", "Hello", "Hi", "Hey", "Good morning", "Good evening", ...
124
+ - Cụm từ mang ý nghĩa xã giao: "Rất vui được gặp bạn", "Hôm nay bạn thế nào?", "Chúc một ngày tốt lành", ...
125
+
126
+ Lưu ý:
127
+ - Chỉ xử lý các câu hỏi thuộc nhóm chào hỏi.
128
+ - Không liên quan đến **question_sql** hoặc các câu hỏi về dữ liệu.
129
+
130
+ Args:
131
+ query (str): Câu hỏi đầu vào của người dùng.
132
+
133
+ Returns:
134
+ str: Trả về câu hỏi nếu nó thuộc nhóm chào hỏi, ngược lại có thể xử lý theo yêu cầu cụ thể.
135
+ """
136
+ return query
137
+
138
+
139
+ import asyncio
140
+ import importlib
141
+ import function.chat as chat_module
142
+ async def update_tool_calls(tool_calls, chat_id,user_id,user_input):
143
+
144
+ updated_calls = []
145
+
146
+ for tool in tool_calls:
147
+ query = tool['args']['query']
148
+ list_history = await chat_module.get_chat_details_text(chat_id, user_id)
149
+ new_question = await filter_query.response_rename_question(user_input, list_history,query)
150
+ tool['args']['query'] = new_question
151
+ new_name = await filter_query.response_general(new_question, list_history)
152
+ if new_name is not None and new_name == "question_sql":
153
+ tool['name'] = new_name.strip()
154
+ updated_calls.append(tool)
155
+ if new_name == "question_general":
156
+ tool['name'] = new_name.strip()
157
+ updated_calls.append(tool)
158
+ return updated_calls
159
+ else:
160
+ return tool_calls
161
+
162
+ return updated_calls
163
+
164
+
165
+ async def process_user_query(user_input, user_id, role, language,chat_id):
166
+ always_call_tool_llm = llm.bind_tools([question_information, question_sql, question_hello], tool_choice=True,strict=True)
167
+ tool_calls = always_call_tool_llm.invoke(f"{user_input}").tool_calls
168
+
169
+ for tc in tool_calls:
170
+ tc["user_id"] = user_id
171
+ tc["role"] = role
172
+ tc["language"] = language
173
+ print("Tool gốc:",tool_calls)
174
+ data = await update_tool_calls(tool_calls,chat_id,user_id,user_input)
175
+
176
+ for item in data:
177
+ item['chat_id'] = chat_id
178
+ print("Tool update: ", data)
179
+ return data
180
+
181
+