himmeow commited on
Commit
a222ca0
·
verified ·
1 Parent(s): d1d9878

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +639 -4
README.md CHANGED
@@ -10,13 +10,648 @@ tags:
10
  - gemma2
11
  - trl
12
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
  # Uploaded model
15
 
16
- - **Developed by:** ricepaper
 
17
  - **License:** apache-2.0
18
- - **Finetuned from model :** unsloth/gemma-2-2b-it-bnb-4bit
19
 
20
- This gemma2 model was trained 2x faster with [Unsloth](https://github.com/unslothai/unsloth) and Huggingface's TRL library.
21
 
22
- [<img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/unsloth%20made%20with%20love.png" width="200"/>](https://github.com/unslothai/unsloth)
 
10
  - gemma2
11
  - trl
12
  ---
13
+ # (English below)
14
+ ## Model Card cho ricepaper/vi-gemma-2-2b-function-calling
15
+
16
+ ### Mô tả Mô hình
17
+
18
+ **ricepaper/vi-gemma-2-2b-function-calling** là mô hình ngôn ngữ lớn được tinh chỉnh từ **google/gemma-2-2b-it** cho khả năng hiểu và thực thi single/multi function call (gọi hàm) tối ưu cho 2 ngôn ngữ chính: tiếng Việt và tiếng Anh. Mô hình được huấn luyện với tập dữ liệu phong phú bao gồm các đoạn hội thoại chứa function call theo định dạng ChatML, kết hợp với tập dữ liệu đa ngôn ngữ được dịch sang tiếng Việt.
19
+
20
+ ### Mục đích Sử dụng
21
+
22
+ Mô hình này phù hợp cho các ứng dụng yêu cầu:
23
+
24
+ * Xây dựng chatbot có khả năng tương tác với người dùng và thực thi các tác vụ cụ thể thông qua function call.
25
+ * Tạo các hệ thống hỏi đáp tự động có khả năng truy xuất thông tin từ các nguồn dữ liệu khác nhau.
26
+ * Phát triển các ứng dụng xử lý ngôn ngữ tự nhiên nâng cao như tóm tắt văn bản, dịch máy, tạo văn bản.
27
+ * Xây dựng agent:** Tạo các agent thông minh có khả năng tương tác với môi trường và thực hiện các hành động dựa trên ngôn ngữ.
28
+ * Hệ thống multi-agent:** Phát triển các hệ thống đa tác tử, trong đó các agent có thể giao tiếp và hợp tác với nhau để giải quyết các vấn đề phức tạp.
29
+
30
+ ### Cách sử dụng
31
+
32
+ **1. Cài đặt các thư viện cần thiết:**
33
+
34
+ ```python
35
+ ! pip install transformers torch
36
+ ```
37
+
38
+ **2. Khởi tạo tokenizer và model:**
39
+
40
+ ```python
41
+ from transformers import AutoTokenizer, AutoModelForCausalLM
42
+ import torch
43
+ import json
44
+
45
+ # Khởi tạo tokenizer và model
46
+ tokenizer = AutoTokenizer.from_pretrained("ricepaper/vi-gemma-2-2b-function-calling")
47
+ model = AutoModelForCausalLM.from_pretrained(
48
+ "ricepaper/vi-gemma-2-2b-function-calling",
49
+ device_map="auto",
50
+ torch_dtype=torch.float16,
51
+ )
52
+ ```
53
+
54
+ **3. Xây dựng hàm xử lý user query:**
55
+
56
+ ```python
57
+ def process_user_query(user_query, messages, available_tools):
58
+ """
59
+ Xử lý user query, tạo response, kiểm tra và thực thi function call (nếu có).
60
+
61
+ Args:
62
+ user_query (str): Query từ người dùng.
63
+ messages (list): List messages hiện tại trong conversation.
64
+ available_tools (dict): Dictionary chứa các function có sẵn.
65
+
66
+ Returns:
67
+ str: Response cuối cùng sau khi xử lý function call (nếu có).
68
+ """
69
+
70
+ # Thêm user query vào messages
71
+ messages.append({"role": "user", "content": user_query})
72
+
73
+ # Tạo response từ model
74
+ input_ids = tokenizer.apply_chat_template(
75
+ messages,
76
+ add_generation_prompt=True,
77
+ return_tensors="pt"
78
+ ).to(model.device)
79
+ outputs = model.generate(
80
+ input_ids,
81
+ max_new_tokens=300,
82
+ # ... (Các tham số generate khác)
83
+ )
84
+ response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)
85
+
86
+ try:
87
+ # Chuyển đổi chuỗi JSON thành list Python
88
+ response_list = json.loads(response)
89
+ # Thêm response vào messages nếu có functioncall
90
+ messages.append({"role": "assistant", "content": response})
91
+ except json.JSONDecodeError:
92
+ # Nếu response không phải JSON, coi như không có function call
93
+ response_list = []
94
+
95
+ # Khởi tạo list function_responses để lưu kết quả
96
+ function_responses = []
97
+
98
+ # Duyệt qua từng phần tử trong list
99
+ for response_dict in response_list:
100
+ if "name" in response_dict and "arguments" in response_dict:
101
+ function_name = response_dict.get("name")
102
+ function_args = response_dict.get("arguments")
103
+
104
+ if function_name in available_tools:
105
+ # Thực hiện function call
106
+ print(f"Calling function {function_name} with arguments {function_args}\n")
107
+ function_to_call = available_tools[function_name]
108
+ function_response = function_to_call(**function_args)
109
+
110
+ # Lưu kết quả dưới dạng dictionary
111
+ function_responses.append({
112
+ "name": function_name,
113
+ "response": function_response
114
+ })
115
+ else:
116
+ print(f"Function {function_name} not found")
117
+
118
+ # Thêm list function_responses vào messages
119
+ if function_responses:
120
+ messages.append({
121
+ "role": "user",
122
+ "content": f"FUNCTION RESPONSES:\n{json.dumps(function_responses, ensure_ascii=False)}"
123
+ })
124
+ print(messages[-1].get("content"))
125
+
126
+ # Tạo response mới sau khi xử lý function call
127
+ input_ids = tokenizer.apply_chat_template(
128
+ messages,
129
+ add_generation_prompt=True,
130
+ return_tensors="pt"
131
+ ).to(model.device)
132
+ outputs = model.generate(
133
+ input_ids,
134
+ max_new_tokens=300,
135
+ # ... (Các tham số generate khác)
136
+ )
137
+ response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)
138
+
139
+ return response
140
+ ```
141
+
142
+ **4. Tạo các hàm hỗ trợ và khai báo danh sách tools:**
143
+
144
+ ```python
145
+ ## Hàm mô phỏng hỗ trợ tính boa cho một hóa đơn
146
+ def calculate_tip(bill_amount: float, tip_percentage: float) -> str:
147
+ """Tính số tiền boa cho một hóa đơn và trả về một chuỗi mô tả kết quả.
148
+
149
+ Args:
150
+ bill_amount: Tổng số tiền của hóa đơn.
151
+ tip_percentage: Tỷ lệ tiền boa.
152
+
153
+ Returns:
154
+ Một chuỗi mô tả số tiền boa và tổng số tiền phải trả.
155
+ """
156
+
157
+ tip_amount = bill_amount * (tip_percentage / 100)
158
+ total_amount = bill_amount + tip_amount
159
+ return f"Số tiền boa là: {tip_amount:.2f}\nTổng số tiền phải trả là: {total_amount:.2f}"
160
+
161
+ # Khai báo danh sách tools
162
+ tools = """
163
+ {
164
+ "name": "calculate_tip",
165
+ "description": "Tính số tiền boa cho một hóa đơn",
166
+ "parameters": {
167
+ "type": "object",
168
+ "properties": {
169
+ "bill_amount": {
170
+ "type": "number",
171
+ "description": "Tổng số tiền của hóa đơn"
172
+ },
173
+ "tip_percentage": {
174
+ "type": "number",
175
+ "description": "Tỷ lệ tiền boa"
176
+ }
177
+ },
178
+ "required": [
179
+ "bill_amount",
180
+ "tip_percentage"
181
+ ]
182
+ }
183
+ },
184
+ """
185
+
186
+ # Tạo dictionary ánh xạ tên hàm với hàm tương ứng
187
+ available_tools = {
188
+ "calculate_tip": calculate_tip,
189
+ }
190
+ ```
191
+
192
+ **5. Tạo lịch sử trò chuyện và sử dụng:**
193
+
194
+ ```python
195
+ # Tạo lịch sử trò chuyện mới
196
+ messages = [
197
+ {"role": "user", "content": f"""Bạn là một trợ lý hữu ích với quyền truy cập vào các chức năng sau. Sử dụng chúng nếu cần thiết {tools}"""},
198
+ {"role": "assistant", "content": "Xin chào, tôi có thể giúp gì cho bạn?"},
199
+ ]
200
+ # Sử dụng
201
+ res = process_user_query("Tôi cần trợ giúp tính tiền boa cho hóa đơn của mình. Tổng số tiền là 50 USD và tôi muốn để lại 15% tiền boa?", messages, available_tools)
202
+ messages.append({"role": "assistant", "content": res})
203
+ print("\n"+res)
204
+ # Calling function calculate_tip with arguments {'bill_amount': 50, 'tip_percentage': 15}
205
+
206
+ # FUNCTION RESPONSES:
207
+ # [{"name": "calculate_tip", "response": "Số tiền boa là: 7.50\nTổng số tiền phải trả là: 57.50"}]
208
+
209
+ # Số tiền boa cho hóa đơn của bạn là 7,50 USD. Tổng số tiền phải trả là 57,50 USD.
210
+
211
+ messages
212
+ # [{'role': 'user',
213
+ # 'content': 'Bạn là một trợ lý hữu ích với quyền truy cập vào các chức năng sau. Sử dụng chúng nếu cần thiết \n{\n "name": "calculate_tip",\n "description": "Tính số tiền boa cho một hóa đơn",\n "parameters": {\n "type": "object",\n "properties": {\n "bill_amount": {\n "type": "number",\n "description": "Tổng số tiền của hóa đơn"\n },\n "tip_percentage": {\n "type": "number",\n "description": "Tỷ lệ tiền boa"\n }\n },\n "required": [\n "bill_amount",\n "tip_percentage"\n ]\n }\n},\n'},
214
+ # {'role': 'assistant', 'content': 'Xin chào, tôi có thể giúp gì cho bạn?'},
215
+ # {'role': 'user',
216
+ # 'content': 'Tôi cần trợ giúp tính tiền boa cho hóa đơn của mình. Tổng số tiền là 50 USD và tôi muốn để lại 15% tiền boa?'},
217
+ # {'role': 'assistant',
218
+ # 'content': '[{"name": "calculate_tip", "arguments": {"bill_amount": 50, "tip_percentage": 15}}]'},
219
+ # {'role': 'user',
220
+ # 'content': 'FUNCTION RESPONSES:\n[{"name": "calculate_tip", "response": "Số tiền boa là: 7.50\\nTổng số tiền phải trả là: 57.50"}]'},
221
+ # {'role': 'assistant',
222
+ # 'content': 'Số tiền boa cho hóa đơn của bạn là 7,50 USD. Tổng số tiền phải trả là 57,50 USD.'}]
223
+ ```
224
+
225
+ ### Lưu ý
226
+
227
+ * Mô hình có thể yêu cầu scale chất lượng và cấu hình phần cứng phù hợp để hoạt động hiệu quả.
228
+ * Kết quả của function call phụ thuộc vào chất lượng của hàm hỗ trợ được cung cấp.
229
+ * Người dùng có thể thay đổi các tham số generate của mô hình để điều chỉnh độ dài và nội dung của response.
230
+
231
+ # English model card version:
232
+ ## Model Card for ricepaper/vi-gemma-2-2b-function-calling
233
+
234
+ ### Model Description
235
+
236
+ **ricepaper/vi-gemma-2-2b-function-calling** is a large language model fine-tuned from **google/gemma-2-2b-it** for understanding and executing single/multi function calls, optimized for 2 main languages: Vietnamese and English. The model is trained on a rich dataset of conversations containing function calls in ChatML format, combined with multilingual data translated into Vietnamese.
237
+
238
+ ### Intended Uses
239
+
240
+ This model is suitable for applications requiring:
241
+
242
+ * Building chatbots that can interact with users and perform specific tasks through function calls.
243
+ * Creating automated question answering systems capable of retrieving information from various data sources.
244
+ * Developing advanced natural language processing applications such as text summarization, machine translation, and text generation.
245
+ * Building agents: Creating intelligent agents capable of interacting with the environment and performing actions based on language.
246
+ * Multi-agent systems: Developing multi-agent systems where agents can communicate and collaborate to solve complex problems.
247
+
248
+ ### How to Use
249
+
250
+ **1. Install necessary libraries:**
251
+
252
+ ```python
253
+ ! pip install transformers torch
254
+ ```
255
+
256
+ **2. Initialize the tokenizer and model:**
257
+
258
+ ```python
259
+ from transformers import AutoTokenizer, AutoModelForCausalLM
260
+ import torch
261
+ import json
262
+
263
+ # Initialize the tokenizer and model
264
+ tokenizer = AutoTokenizer.from_pretrained("ricepaper/vi-gemma-2-2b-function-calling")
265
+ model = AutoModelForCausalLM.from_pretrained(
266
+ "ricepaper/vi-gemma-2-2b-function-calling",
267
+ device_map="auto",
268
+ torch_dtype=torch.float16,
269
+ )
270
+ ```
271
+
272
+ **3. Build a function to process user queries:**
273
+
274
+ ```python
275
+ def process_user_query(user_query, messages, available_tools):
276
+ """
277
+ Processes user queries, generates responses, checks for, and executes function calls (if any).
278
+
279
+ Args:
280
+ user_query (str): The query from the user.
281
+ messages (list): The list of current messages in the conversation.
282
+ available_tools (dict): A dictionary containing available functions.
283
+
284
+ Returns:
285
+ str: The final response after processing function calls (if any).
286
+ """
287
+
288
+ # Add the user query to the messages
289
+ messages.append({"role": "user", "content": user_query})
290
+
291
+ # Generate a response from the model
292
+ input_ids = tokenizer.apply_chat_template(
293
+ messages,
294
+ add_generation_prompt=True,
295
+ return_tensors="pt"
296
+ ).to(model.device)
297
+ outputs = model.generate(
298
+ input_ids,
299
+ max_new_tokens=300,
300
+ # ... (Other generate parameters)
301
+ )
302
+ response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)
303
+
304
+ try:
305
+ # Convert the JSON string to a Python list
306
+ response_list = json.loads(response)
307
+ # Add the response to messages if there's a function call
308
+ messages.append({"role": "assistant", "content": response})
309
+ except json.JSONDecodeError:
310
+ # If the response is not JSON, assume no function call
311
+ response_list = []
312
+
313
+ # Initialize a list to store function responses
314
+ function_responses = []
315
+
316
+ # Iterate through each element in the list
317
+ for response_dict in response_list:
318
+ if "name" in response_dict and "arguments" in response_dict:
319
+ function_name = response_dict.get("name")
320
+ function_args = response_dict.get("arguments")
321
+
322
+ if function_name in available_tools:
323
+ # Execute the function call
324
+ print(f"Calling function {function_name} with arguments {function_args}\n")
325
+ function_to_call = available_tools[function_name]
326
+ function_response = function_to_call(**function_args)
327
+
328
+ # Store the result as a dictionary
329
+ function_responses.append({
330
+ "name": function_name,
331
+ "response": function_response
332
+ })
333
+ else:
334
+ print(f"Function {function_name} not found")
335
+
336
+ # Add the list of function responses to the messages
337
+ if function_responses:
338
+ messages.append({
339
+ "role": "user",
340
+ "content": f"FUNCTION RESPONSES:\n{json.dumps(function_responses, ensure_ascii=False)}"
341
+ })
342
+ print(messages[-1].get("content"))
343
+
344
+ # Generate a new response after processing function calls
345
+ input_ids = tokenizer.apply_chat_template(
346
+ messages,
347
+ add_generation_prompt=True,
348
+ return_tensors="pt"
349
+ ).to(model.device)
350
+ outputs = model.generate(
351
+ input_ids,
352
+ max_new_tokens=300,
353
+ # ... (Other generate parameters)
354
+ )
355
+ response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)
356
+
357
+ return response
358
+ ```
359
+
360
+ **4. Create helper functions and declare the tools list:**
361
+
362
+ ```python
363
+ ## Function simulating tip calculation for a bill
364
+ def calculate_tip(bill_amount: float, tip_percentage: float) -> str:
365
+ """Calculates the tip amount for a bill and returns a string describing the result.
366
+
367
+ Args:
368
+ bill_amount: The total amount of the bill.
369
+ tip_percentage: The tip percentage.
370
+
371
+ Returns:
372
+ A string describing the tip amount and the total amount to be paid.
373
+ """
374
+
375
+ tip_amount = bill_amount * (tip_percentage / 100)
376
+ total_amount = bill_amount + tip_amount
377
+ return f"The tip amount is: {tip_amount:.2f}\nThe total amount to be paid is: {total_amount:.2f}"
378
+
379
+ # Declare the tools list
380
+ tools = """
381
+ {
382
+ "name": "calculate_tip",
383
+ "description": "Calculate the tip amount for a bill",
384
+ "parameters": {
385
+ "type": "object",
386
+ "properties": {
387
+ "bill_amount": {
388
+ "type": "number",
389
+ "description": "The total bill amount"
390
+ },
391
+ "tip_percentage": {
392
+ "type": "number",
393
+ "description": "The tip percentage"
394
+ }
395
+ },
396
+ "required": [
397
+ "bill_amount",
398
+ "tip_percentage"
399
+ ]
400
+ }
401
+ },
402
+ """
403
+
404
+ # Create a dictionary mapping function names to their corresponding functions
405
+ available_tools = {
406
+ "calculate_tip": calculate_tip,
407
+ }
408
+ ```
409
+
410
+ **5. Create a new conversation history and use the model:**
411
+
412
+ ```python
413
+ # Create a new conversation history
414
+ messages = [
415
+ {"role": "user", "content": f"""You are a helpful assistant with access to the following functions. Use them if necessary {tools}"""},
416
+ {"role": "assistant", "content": "Hello, how can I assist you?"},
417
+ ]
418
+ # Use the model
419
+ res = process_user_query("I need help calculating the tip for my bill. The total is $50 and I would like to leave a 15% tip.", messages, available_tools)
420
+ messages.append({"role": "assistant", "content": res})
421
+ print("\n"+res)
422
+ # Calling function calculate_tip with arguments {'bill_amount': 50, 'tip_percentage': 15}
423
+
424
+ # FUNCTION RESPONSES:
425
+ # [{"name": "calculate_tip", "response": "The tip amount is: 7.50\nThe total amount to be paid is: 57.50"}]
426
+
427
+ # The tip amount for your bill is $7.50. The total amount to be paid is $57.50.
428
+
429
+ messages
430
+ # [{'role': 'user',
431
+ # 'content': 'You are a helpful assistant with access to the following functions. Use them if necessary \n{\n "name": "calculate_tip",\n "description": "Calculate the tip amount for a bill",\n "parameters": {\n "type": "object",\n "properties": {\n "bill_amount": {\n "type": "number",\n "description": "The total bill amount"\n },\n "tip_percentage": {\n "type": "number",\n "description": "The tip percentage"\n }\n },\n "required": [\n "bill_amount",\n "tip_percentage"\n ]\n }\n},\n'},
432
+ # {'role': 'assistant', 'content': 'Hello, how can I assist you?'},
433
+ # {'role': 'user',
434
+ # 'content': 'I need help calculating the tip for my bill. The total is $50 and I would like to leave a 15% tip.'},
435
+ # {'role': 'assistant',
436
+ # 'content': '[{"name": "calculate_tip", "arguments": {"bill_amount": 50, "tip_percentage": 15}}]'},
437
+ # {'role': 'user',
438
+ # 'content': 'FUNCTION RESPONSES:\n[{"name": "calculate_tip", "response": "The tip amount is: 7.50\\nThe total amount to be paid is: 57.50"}]'},
439
+ # {'role': 'assistant',
440
+ # 'content': 'The tip amount for your bill is $7.50. The total amount to be paid is $57.50.'}]
441
+ ```
442
+
443
+ ## English Version
444
+
445
+ ### Model Card for ricepaper/vi-gemma-2-2b-function-calling
446
+
447
+ ### Model Description
448
+
449
+ This model is a fine-tuned version of the **google/gemma-2-2b-it** model, specialized for understanding and executing function calls within the Vietnamese language. It has been trained on a comprehensive dataset encompassing conversations that include function calls formatted in ChatML, along with multilingual data that has been translated into Vietnamese.
450
+
451
+ ### Intended Uses
452
+
453
+ This model is well-suited for applications that demand:
454
+
455
+ * **Conversational AI:** Constructing chatbots that engage with users and carry out specific actions through function calls.
456
+ * **Question Answering Systems:** Creating automated systems capable of retrieving information from diverse data sources.
457
+ * **Advanced NLP Applications:** Developing sophisticated natural language processing applications such as text summarization, machine translation, and text generation.
458
+ * **Intelligent Agent Development:** Building agents that can interact with their environment and execute actions based on language instructions.
459
+ * **Multi-Agent Systems:** Developing systems where multiple agents communicate and collaborate to solve complex problems.
460
+
461
+ ### How to Use
462
+
463
+ **1. Installation of Required Libraries:**
464
+
465
+ ```python
466
+ ! pip install transformers torch
467
+ ```
468
+
469
+ **2. Initialization of Tokenizer and Model:**
470
+
471
+ ```python
472
+ from transformers import AutoTokenizer, AutoModelForCausalLM
473
+ import torch
474
+ import json
475
+
476
+ # Initialize the tokenizer and model
477
+ tokenizer = AutoTokenizer.from_pretrained("ricepaper/vi-gemma-2-2b-function-calling")
478
+ model = AutoModelForCausalLM.from_pretrained(
479
+ "ricepaper/vi-gemma-2-2b-function-calling",
480
+ device_map="auto",
481
+ torch_dtype=torch.float16,
482
+ )
483
+ ```
484
+
485
+ **3. Function for User Query Processing:**
486
+
487
+ ```python
488
+ def process_user_query(user_query, messages, available_tools):
489
+ """
490
+ Handles user queries, generates responses, and manages function calls (if present).
491
+
492
+ Args:
493
+ user_query (str): User's input query.
494
+ messages (list): List of messages in the ongoing conversation.
495
+ available_tools (dict): Dictionary of available functions.
496
+
497
+ Returns:
498
+ str: Final response after processing any function calls.
499
+ """
500
+
501
+ messages.append({"role": "user", "content": user_query})
502
+
503
+ input_ids = tokenizer.apply_chat_template(
504
+ messages,
505
+ add_generation_prompt=True,
506
+ return_tensors="pt"
507
+ ).to(model.device)
508
+ outputs = model.generate(
509
+ input_ids,
510
+ max_new_tokens=300,
511
+ # ... (Additional generate parameters can be added here)
512
+ )
513
+ response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)
514
+
515
+ try:
516
+ response_list = json.loads(response)
517
+ messages.append({"role": "assistant", "content": response})
518
+ except json.JSONDecodeError:
519
+ response_list = []
520
+
521
+ function_responses = []
522
+
523
+ for response_dict in response_list:
524
+ if "name" in response_dict and "arguments" in response_dict:
525
+ function_name = response_dict.get("name")
526
+ function_args = response_dict.get("arguments")
527
+
528
+ if function_name in available_tools:
529
+ print(f"Calling function {function_name} with arguments {function_args}\n")
530
+ function_to_call = available_tools[function_name]
531
+ function_response = function_to_call(**function_args)
532
+ function_responses.append({
533
+ "name": function_name,
534
+ "response": function_response
535
+ })
536
+ else:
537
+ print(f"Function {function_name} not found")
538
+
539
+ if function_responses:
540
+ messages.append({
541
+ "role": "user",
542
+ "content": f"FUNCTION RESPONSES:\n{json.dumps(function_responses, ensure_ascii=False)}"
543
+ })
544
+ print(messages[-1].get("content"))
545
+
546
+ input_ids = tokenizer.apply_chat_template(
547
+ messages,
548
+ add_generation_prompt=True,
549
+ return_tensors="pt"
550
+ ).to(model.device)
551
+ outputs = model.generate(
552
+ input_ids,
553
+ max_new_tokens=300,
554
+ # ... (Additional generate parameters can be added here)
555
+ )
556
+ response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)
557
+
558
+ return response
559
+ ```
560
+
561
+ **4. Helper Functions and Tools Definition:**
562
+
563
+ ```python
564
+ def calculate_tip(bill_amount: float, tip_percentage: float) -> str:
565
+ """Calculates the tip for a given bill amount and percentage.
566
+
567
+ Args:
568
+ bill_amount: Total bill amount.
569
+ tip_percentage: Tip percentage.
570
+
571
+ Returns:
572
+ str: Description of the tip amount and total to be paid.
573
+ """
574
+
575
+ tip_amount = bill_amount * (tip_percentage / 100)
576
+ total_amount = bill_amount + tip_amount
577
+ return f"The tip amount is: {tip_amount:.2f}\nThe total amount to be paid is: {total_amount:.2f}"
578
+
579
+ tools = """
580
+ {
581
+ "name": "calculate_tip",
582
+ "description": "Calculate the tip amount for a bill",
583
+ "parameters": {
584
+ "type": "object",
585
+ "properties": {
586
+ "bill_amount": {
587
+ "type": "number",
588
+ "description": "The total bill amount"
589
+ },
590
+ "tip_percentage": {
591
+ "type": "number",
592
+ "description": "The tip percentage"
593
+ }
594
+ },
595
+ "required": [
596
+ "bill_amount",
597
+ "tip_percentage"
598
+ ]
599
+ }
600
+ },
601
+ """
602
+
603
+ available_tools = {
604
+ "calculate_tip": calculate_tip,
605
+ }
606
+ ```
607
+
608
+ **5. Conversation History and Model Usage Example:**
609
+
610
+ ```python
611
+ messages = [
612
+ {"role": "user", "content": f"""You are a helpful assistant with access to the following functions. Use them if necessary {tools}"""},
613
+ {"role": "assistant", "content": "Hello, how can I assist you?"},
614
+ ]
615
+
616
+ res = process_user_query("I need help calculating the tip for my bill. The total is $50 and I would like to leave a 15% tip.", messages, available_tools)
617
+ messages.append({"role": "assistant", "content": res})
618
+ print("\n"+res)
619
+ # Calling function calculate_tip with arguments {'bill_amount': 50, 'tip_percentage': 15}
620
+
621
+ # FUNCTION RESPONSES:
622
+ # [{"name": "calculate_tip", "response": "The tip amount is: 7.50\nThe total amount to be paid is: 57.50"}]
623
+
624
+ # The tip amount for your bill is $7.50. The total amount to be paid is $57.50.
625
+
626
+ print(messages)
627
+ # Expected output (The actual output might vary slightly):
628
+ # [{'role': 'user',
629
+ # 'content': 'You are a helpful assistant with access to the following functions. Use them if necessary \n{\n "name": "calculate_tip",\n "description": "Calculate the tip amount for a bill",\n "parameters": {\n "type": "object",\n "properties": {\n "bill_amount": {\n "type": "number",\n "description": "The total bill amount"\n },\n "tip_percentage": {\n "type": "number",\n "description": "The tip percentage"\n }\n },\n "required": [\n "bill_amount",\n "tip_percentage"\n ]\n }\n},\n'},
630
+ # {'role': 'assistant', 'content': 'Hello, how can I assist you?'},
631
+ # {'role': 'user',
632
+ # 'content': 'I need help calculating the tip for my bill. The total is $50 and I would like to leave a 15% tip.'},
633
+ # {'role': 'assistant',
634
+ # 'content': '[{"name": "calculate_tip", "arguments": {"bill_amount": 50, "tip_percentage": 15}}]'},
635
+ # {'role': 'user',
636
+ # 'content': 'FUNCTION RESPONSES:\n[{"name": "calculate_tip", "response": "The tip amount is: 7.50\nThe total amount to be paid is: 57.50"}]'},
637
+ # {'role': 'assistant',
638
+ # 'content': 'The tip amount for your bill is $7.50. The total amount to be paid is $57.50.'}]
639
+ ```
640
+
641
+ ### Notes
642
+
643
+ * The model might require appropriate scaling and hardware configuration for optimal performance.
644
+ * The quality of function call results depends on the provided helper functions.
645
+ * Users can adjust the model's generation parameters to fine-tune response length and content.
646
+
647
 
648
  # Uploaded model
649
 
650
+ - **Developed by:** [hiieu](https://huggingface.co/hiieu), [himmeow the coder](https://viblo.asia/u/MartinCrux), [cuctrinh](https://www.linkedin.com/in/trinh-cuc-5722832b6)
651
+ - **Training data provided by:** [Fifth Civil Defender - 5CD](https://huggingface.co/5CD-AI)
652
  - **License:** apache-2.0
653
+ - **Finetuned from model :** unsloth/gemma-1.1-2b-it-bnb-4bit
654
 
655
+ This gemma model was trained 2x faster with [Unsloth](https://github.com/unslothai/unsloth) and Huggingface's TRL library.
656
 
657
+ [<img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/unsloth%20made%20with%20love.png" width="200"/>](https://github.com/unslothai/unsloth)