HumansXドキュメントセンター 公式サイトへ ↗

Function-call による電卓ツールの実装

実験の目的

  1. 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)}"

操作手順

回路接続が完了したら:

  1. ターミナルにリモートアクセスします。ターミナルで次のコマンドを入力して Enter キーを押します

ssh sunrise@192.168.8.111

  1. サービスを起動します。llm フォルダに移動し、メインプログラムを python main.py で起動します。

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

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

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

実験結果

LLM との対話メッセージを送信し、演算機能をシミュレーションで実現します。

情報交換・サポート

資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。