Function-call による電卓ツールの実装
実験の目的
- LLM(大規模言語モデル)を利用して、基本演算や三角関数演算などの電卓機能を実現します。
機能要件
電卓の機能画面を描画し、基本演算や三角関数演算などの操作を実現します。
ハードウェアの準備
| No. | 名称 | 数量 | 備考 |
|---|---|---|---|
| 1 | RDK X5 | 1 | 組み込みメインボード |
| 2 | イヤホン | 1 | 音声出力(左/右チャンネル)+マイク入力に対応したもの |
| 3 | 電源ケーブル | 1 | 給電用 |
| 4 | LAN ケーブル | 1 | ネットワーク接続用 |
| 5 | ディスプレイ(各自で用意) | 1 | 操作用 |
| 6 | Bluetooth キーボード・マウス(各自で用意) | 1 | メインボードの操作用 |
回路接続
ハードウェアモジュール
1.1 ハードウェアインターフェース で RDK X5 のインターフェースをすぐに把握できます
オンボード Earphone オーディオ端子 で録音・再生機能について確認できます
実機の配線
下図を参考に接続し、その後ディスプレイ、キーボード・マウスを接続します(またはリモートアクセスを行います)。

ソフトウェア設計
設計フローチャート

ソースコードのダウンロード
(ダウンロード済みの場合、この手順は不要です)ソースファイル:llm.rar
(リンクをクリックしてオンラインの説明を見ることもできます)(HumansX サポートより提供)
プログラムコード
コードの関係:
calculator.py は基本的な数学演算と高度な数学演算の機能を提供します。
具体的なコード:
プロジェクトの完全なコードは(ソースファイル)をクリックしてダウンロードしてください。
"""
计算器工具实现
支持基本的数学运算
"""
import logging
import math
from typing import Union
from ..function_call.function_registry import FunctionRegistry
logger = logging.getLogger(__name__)
class Calculator:
"""计算器类"""
@staticmethod
def calculate(op: str, a: float, b: float) -> float:
"""执行基本数学运算"""
try:
if op == 'add':
return a + b
elif op == 'sub':
return a - b
elif op == 'mul':
return a * b
elif op == 'div':
if b == 0:
raise ValueError('除数不能为0')
return a / b
elif op == 'pow':
return a ** b
elif op == 'mod':
if b == 0:
raise ValueError('模数不能为0')
return a % b
else:
raise ValueError(f'不支持的操作: {op}')
except Exception as e:
logger.error(f"计算错误: {op}({a}, {b}) - {e}")
raise
@staticmethod
def advanced_calculate(operation: str, *args) -> float:
"""执行高级数学运算"""
try:
if operation == 'sqrt':
if len(args) != 1:
raise ValueError('sqrt需要1个参数')
if args[0] < 0:
raise ValueError('不能计算负数的平方根')
return math.sqrt(args[0])
elif operation == 'sin':
if len(args) != 1:
raise ValueError('sin需要1个参数')
return math.sin(math.radians(args[0]))
elif operation == 'cos':
if len(args) != 1:
raise ValueError('cos需要1个参数')
return math.cos(math.radians(args[0]))
elif operation == 'tan':
if len(args) != 1:
raise ValueError('tan需要1个参数')
return math.tan(math.radians(args[0]))
elif operation == 'log':
if len(args) == 1:
if args[0] <= 0:
raise ValueError('对数的真数必须大于0')
return math.log10(args[0])
elif len(args) == 2:
if args[0] <= 0 or args[1] <= 0:
raise ValueError('对数的真数和底数必须大于0')
if args[1] == 1:
raise ValueError('对数的底数不能为1')
return math.log(args[0], args[1])
else:
raise ValueError('log需要1或2个参数')
elif operation == 'ln':
if len(args) != 1:
raise ValueError('ln需要1个参数')
if args[0] <= 0:
raise ValueError('自然对数的真数必须大于0')
return math.log(args[0])
elif operation == 'abs':
if len(args) != 1:
raise ValueError('abs需要1个参数')
return abs(args[0])
elif operation == 'round':
if len(args) == 1:
return round(args[0])
elif len(args) == 2:
return round(args[0], int(args[1]))
else:
raise ValueError('round需要1或2个参数')
else:
raise ValueError(f'不支持的高级操作: {operation}')
except Exception as e:
logger.error(f"高级计算错误: {operation}({args}) - {e}")
raise
# 注册基本计算器函数
@FunctionRegistry.register_function('calculator', '基本数学计算器,支持加减乘除等运算')
def calculator_func(op: str, a: float, b: float) -> str:
"""计算器函数"""
try:
result = Calculator.calculate(op, a, b)
# 格式化结果,如果是整数则不显示小数点
if result == int(result):
formatted_result = str(int(result))
else:
formatted_result = f"{result:.6f}".rstrip('0').rstrip('.')
# 生成友好的回复
op_names = {
'add': '加法',
'sub': '减法',
'mul': '乘法',
'div': '除法',
'pow': '幂运算',
'mod': '取模'
}
op_name = op_names.get(op, op)
return f"{op_name}计算结果:{formatted_result}"
except ValueError as e:
return f"计算错误:{str(e)}"
except Exception as e:
return f"计算过程出错:{str(e)}"
# 注册高级计算器函数
@FunctionRegistry.register_function('advanced_calculator', '高级数学计算器,支持三角函数、对数、开方等')
def advanced_calculator_func(operation: str, args: list) -> str:
"""高级计算器函数"""
try:
result = Calculator.advanced_calculate(operation, *args)
# 格式化结果
if result == int(result):
formatted_result = str(int(result))
else:
formatted_result = f"{result:.6f}".rstrip('0').rstrip('.')
# 生成友好的回复
op_names = {
'sqrt': '平方根',
'sin': '正弦',
'cos': '余弦',
'tan': '正切',
'log': '对数',
'ln': '自然对数',
'abs': '绝对值',
'round': '四舍五入'
}
op_name = op_names.get(operation, operation)
return f"{op_name}计算结果:{formatted_result}"
except ValueError as e:
return f"计算错误:{str(e)}"
except Exception as e:
return f"计算过程出错:{str(e)}"
操作手順
回路接続が完了したら:
- ターミナルにリモートアクセスします。ターミナルで次のコマンドを入力して Enter キーを押します
ssh sunrise@192.168.8.111
- サービスを起動します。llm フォルダに移動し、メインプログラムを python main.py で起動します。

Enter キーを押して起動を待ちます。下のような画面が表示され、http://0.0.0.0:8002 を開けることが示されます。

- ブラウザを開き、URL http://0.0.0.0:8002 を入力してアクセスします。起動後、LLM インテリジェント対話アシスタントのメイン画面が表示されます。

- 右側の「数学計算」をクリックし、基本演算、三角関数、平方根などの操作を行います。

実験結果
LLM との対話メッセージを送信し、演算機能をシミュレーションで実現します。
情報交換・サポート
資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。
ドキュメント