File size: 18,454 Bytes
f151c1a
 
 
b4a90c5
f151c1a
 
 
 
 
 
 
 
 
a222ca0
 
 
 
 
 
 
 
 
 
 
 
 
 
4559df1
 
a222ca0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f151c1a
 
6c57fc5
a222ca0
f151c1a
1fb4ad9
f151c1a
a222ca0
f151c1a
a222ca0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
---
base_model: unsloth/gemma-2-2b-it-bnb-4bit
language:
- vn
- en
license: apache-2.0
tags:
- text-generation-inference
- transformers
- unsloth
- gemma2
- trl
---
# (English below)
## Model Card cho ricepaper/vi-gemma-2-2b-function-calling

### Mô tả Mô hình

**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.

### Mục đích Sử dụng

Mô hình này phù hợp cho các ứng dụng yêu cầu:

* 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.
* 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.
* 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.
* 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ữ.
* 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.

### Cách sử dụng

**1. Cài đặt các thư viện cần thiết:**

```python
! pip install transformers torch
```

**2. Khởi tạo tokenizer và model:**

```python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
import json

# Khởi tạo tokenizer và model
tokenizer = AutoTokenizer.from_pretrained("ricepaper/vi-gemma-2-2b-function-calling")
model = AutoModelForCausalLM.from_pretrained(
    "ricepaper/vi-gemma-2-2b-function-calling",
    device_map="auto",
    torch_dtype=torch.float16,
)
```

**3. Xây dựng hàm xử lý user query:**

```python
def process_user_query(user_query, messages, available_tools):
    """
    Xử lý user query, tạo response, kiểm tra và thực thi function call (nếu có).

    Args:
        user_query (str): Query từ người dùng.
        messages (list): List messages hiện tại trong conversation.
        available_tools (dict): Dictionary chứa các function có sẵn.

    Returns:
        str: Response cuối cùng sau khi xử lý function call (nếu có).
    """

    # Thêm user query vào messages
    messages.append({"role": "user", "content": user_query})

    # Tạo response từ model
    input_ids = tokenizer.apply_chat_template(
        messages,
        add_generation_prompt=True,
        return_tensors="pt"
    ).to(model.device)
    outputs = model.generate(
        input_ids,
        max_new_tokens=300,
        # ... (Các tham số generate khác)
    )
    response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)

    try:
        # Chuyển đổi chuỗi JSON thành list Python
        response_list = json.loads(response)
        # Thêm response vào messages nếu có functioncall
        messages.append({"role": "assistant", "content": response})
    except json.JSONDecodeError:
        # Nếu response không phải JSON, coi như không có function call
        response_list = []

    # Khởi tạo list function_responses để lưu kết quả
    function_responses = []

    # Duyệt qua từng phần tử trong list
    for response_dict in response_list:
        if "name" in response_dict and "arguments" in response_dict:
            function_name = response_dict.get("name")
            function_args = response_dict.get("arguments")

            if function_name in available_tools:
                # Thực hiện function call
                print(f"Calling function {function_name} with arguments {function_args}\n")
                function_to_call = available_tools[function_name]
                function_response = function_to_call(**function_args)
                
                # Lưu kết quả dưới dạng dictionary
                function_responses.append({
                    "name": function_name,
                    "response": function_response
                })
            else:
                print(f"Function {function_name} not found")

    # Thêm list function_responses vào messages
    if function_responses:
        messages.append({
            "role": "user",
            "content": f"FUNCTION RESPONSES:\n{json.dumps(function_responses, ensure_ascii=False)}"
        })
        print(messages[-1].get("content"))

        # Tạo response mới sau khi xử lý function call
        input_ids = tokenizer.apply_chat_template(
            messages,
            add_generation_prompt=True,
            return_tensors="pt"
        ).to(model.device)
        outputs = model.generate(
            input_ids,
            max_new_tokens=300,
            # ... (Các tham số generate khác)
        )
        response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)

    return response
```

**4. Tạo các hàm hỗ trợ và khai báo danh sách tools:**

```python
## Hàm mô phỏng hỗ trợ tính boa cho một hóa đơn
def calculate_tip(bill_amount: float, tip_percentage: float) -> str:
  """Tính số tiền boa cho một hóa đơn và trả về một chuỗi mô tả kết quả.

  Args:
    bill_amount: Tổng số tiền của hóa đơn.
    tip_percentage: Tỷ lệ tiền boa.

  Returns:
    Một chuỗi mô tả số tiền boa và tổng số tiền phải trả.
  """

  tip_amount = bill_amount * (tip_percentage / 100)
  total_amount = bill_amount + tip_amount
  return f"Số tiền boa là: {tip_amount:.2f}\nTổng số tiền phải trả là: {total_amount:.2f}"

# Khai báo danh sách tools
tools = """
{
  "name": "calculate_tip",
  "description": "Tính số tiền boa cho một hóa đơn",
  "parameters": {
    "type": "object",
    "properties": {
      "bill_amount": {
        "type": "number",
        "description": "Tổng số tiền của hóa đơn"
      },
      "tip_percentage": {
        "type": "number",
        "description": "Tỷ lệ tiền boa"
      }
    },
    "required": [
      "bill_amount",
      "tip_percentage"
    ]
  }
},
"""

# Tạo dictionary ánh xạ tên hàm với hàm tương ứng
available_tools = {
    "calculate_tip": calculate_tip,
}
```

**5. Tạo lịch sử trò chuyện và sử dụng:**

```python
# Tạo lịch sử trò chuyện mới
messages = [
    {"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}"""},
    {"role": "assistant", "content": "Xin chào, tôi có thể giúp gì cho bạn?"},
]
# Sử dụng
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)
messages.append({"role": "assistant", "content": res})
print("\n"+res)
# Calling function calculate_tip with arguments {'bill_amount': 50, 'tip_percentage': 15}

# FUNCTION RESPONSES:
# [{"name": "calculate_tip", "response": "Số tiền boa là: 7.50\nTổng số tiền phải trả là: 57.50"}]

# 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.

messages
# [{'role': 'user',
#   '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'},
#  {'role': 'assistant', 'content': 'Xin chào, tôi có thể giúp gì cho bạn?'},
#  {'role': 'user',
#   '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?'},
#  {'role': 'assistant',
#   'content': '[{"name": "calculate_tip", "arguments": {"bill_amount": 50, "tip_percentage": 15}}]'},
#  {'role': 'user',
#   '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"}]'},
#  {'role': 'assistant',
#   '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.'}]
```

### Lưu ý

* 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ả.
* 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.
* 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.

# English model card version:
## Model Card for ricepaper/vi-gemma-2-2b-function-calling

### Model Description

**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.

### Intended Uses

This model is suitable for applications requiring:

* Building chatbots that can interact with users and perform specific tasks through function calls.
* Creating automated question answering systems capable of retrieving information from various data sources.
* Developing advanced natural language processing applications such as text summarization, machine translation, and text generation.
* Building agents: Creating intelligent agents capable of interacting with the environment and performing actions based on language.
* Multi-agent systems: Developing multi-agent systems where agents can communicate and collaborate to solve complex problems.

### How to Use

**1. Install necessary libraries:**

```python
! pip install transformers torch
```

**2. Initialize the tokenizer and model:**

```python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
import json

# Initialize the tokenizer and model
tokenizer = AutoTokenizer.from_pretrained("ricepaper/vi-gemma-2-2b-function-calling")
model = AutoModelForCausalLM.from_pretrained(
    "ricepaper/vi-gemma-2-2b-function-calling",
    device_map="auto",
    torch_dtype=torch.float16,
)
```

**3. Build a function to process user queries:**

```python
def process_user_query(user_query, messages, available_tools):
    """
    Processes user queries, generates responses, checks for, and executes function calls (if any).

    Args:
        user_query (str): The query from the user.
        messages (list): The list of current messages in the conversation.
        available_tools (dict): A dictionary containing available functions.

    Returns:
        str: The final response after processing function calls (if any).
    """

    # Add the user query to the messages
    messages.append({"role": "user", "content": user_query})

    # Generate a response from the model
    input_ids = tokenizer.apply_chat_template(
        messages,
        add_generation_prompt=True,
        return_tensors="pt"
    ).to(model.device)
    outputs = model.generate(
        input_ids,
        max_new_tokens=300,
        # ... (Other generate parameters)
    )
    response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)

    try:
        # Convert the JSON string to a Python list
        response_list = json.loads(response)
        # Add the response to messages if there's a function call
        messages.append({"role": "assistant", "content": response})
    except json.JSONDecodeError:
        # If the response is not JSON, assume no function call
        response_list = []

    # Initialize a list to store function responses
    function_responses = []

    # Iterate through each element in the list
    for response_dict in response_list:
        if "name" in response_dict and "arguments" in response_dict:
            function_name = response_dict.get("name")
            function_args = response_dict.get("arguments")

            if function_name in available_tools:
                # Execute the function call
                print(f"Calling function {function_name} with arguments {function_args}\n")
                function_to_call = available_tools[function_name]
                function_response = function_to_call(**function_args)
                
                # Store the result as a dictionary
                function_responses.append({
                    "name": function_name,
                    "response": function_response
                })
            else:
                print(f"Function {function_name} not found")

    # Add the list of function responses to the messages
    if function_responses:
        messages.append({
            "role": "user",
            "content": f"FUNCTION RESPONSES:\n{json.dumps(function_responses, ensure_ascii=False)}"
        })
        print(messages[-1].get("content"))

        # Generate a new response after processing function calls
        input_ids = tokenizer.apply_chat_template(
            messages,
            add_generation_prompt=True,
            return_tensors="pt"
        ).to(model.device)
        outputs = model.generate(
            input_ids,
            max_new_tokens=300,
            # ... (Other generate parameters)
        )
        response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)

    return response
```

**4. Create helper functions and declare the tools list:**

```python
## Function simulating tip calculation for a bill
def calculate_tip(bill_amount: float, tip_percentage: float) -> str:
  """Calculates the tip amount for a bill and returns a string describing the result.

  Args:
    bill_amount: The total amount of the bill.
    tip_percentage: The tip percentage.

  Returns:
    A string describing the tip amount and the total amount to be paid.
  """

  tip_amount = bill_amount * (tip_percentage / 100)
  total_amount = bill_amount + tip_amount
  return f"The tip amount is: {tip_amount:.2f}\nThe total amount to be paid is: {total_amount:.2f}"

# Declare the tools list
tools = """
{
  "name": "calculate_tip",
  "description": "Calculate the tip amount for a bill",
  "parameters": {
    "type": "object",
    "properties": {
      "bill_amount": {
        "type": "number",
        "description": "The total bill amount"
      },
      "tip_percentage": {
        "type": "number",
        "description": "The tip percentage"
      }
    },
    "required": [
      "bill_amount",
      "tip_percentage"
    ]
  }
},
"""

# Create a dictionary mapping function names to their corresponding functions
available_tools = {
    "calculate_tip": calculate_tip,
}
```

**5. Create a new conversation history and use the model:**

```python
# Create a new conversation history
messages = [
    {"role": "user", "content": f"""You are a helpful assistant with access to the following functions. Use them if necessary {tools}"""},
    {"role": "assistant", "content": "Hello, how can I assist you?"},
]
# Use the model
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)
messages.append({"role": "assistant", "content": res})
print("\n"+res)
# Calling function calculate_tip with arguments {'bill_amount': 50, 'tip_percentage': 15}

# FUNCTION RESPONSES:
# [{"name": "calculate_tip", "response": "The tip amount is: 7.50\nThe total amount to be paid is: 57.50"}]

# The tip amount for your bill is $7.50. The total amount to be paid is $57.50.

messages
# [{'role': 'user',
#   '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'},
#  {'role': 'assistant', 'content': 'Hello, how can I assist you?'},
#  {'role': 'user',
#   'content': 'I need help calculating the tip for my bill. The total is $50 and I would like to leave a 15% tip.'},
#  {'role': 'assistant',
#   'content': '[{"name": "calculate_tip", "arguments": {"bill_amount": 50, "tip_percentage": 15}}]'},
#  {'role': 'user',
#   'content': 'FUNCTION RESPONSES:\n[{"name": "calculate_tip", "response": "The tip amount is: 7.50\\nThe total amount to be paid is: 57.50"}]'},
#  {'role': 'assistant',
#   'content': 'The tip amount for your bill is $7.50. The total amount to be paid is $57.50.'}]
```

# Uploaded  model

- **Developed by:** [hiieu](https://huggingface.co/hiieu), [himmeow the coder](https://huggingface.co/himmeow), [cuctrinh](https://www.linkedin.com/in/trinh-cuc-5722832b6)
- **Training data provided by:** [Fifth Civil Defender - 5CD](https://huggingface.co/5CD-AI)
- **License:** apache-2.0
- **Finetuned from model :** unsloth/gemma-2-2b-it-bnb-4bit

This gemma model was trained 2x faster with [Unsloth](https://github.com/unslothai/unsloth) and Huggingface's TRL library.

[<img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/unsloth%20made%20with%20love.png" width="200"/>](https://github.com/unslothai/unsloth)