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

関数呼び出しによる電卓ツールの実装

実験の目的

  1. LLM(大規模言語モデル)を用いて、四則演算や三角関数演算などの電卓機能を実現します。

機能要件

電卓機能の画面を作成し、四則演算や三角関数演算などを実現します。

ハードウェアの準備

ディスプレイ * 1、Bluetooth キーボード・マウス * 1、メインコンソール * 1

回路接続

ハードウェアモジュール

ヒント:ハードウェアモジュールの使用説明

ハードウェアシステムの全体組み立て

組み込み AI 開発ボード RDK_X5

Uni mega2560 拡張ボード【V1.1】使用説明

電子モジュールの紹介

物理配線

具体的な配線・取り付け方法については、ハードウェアシステムの全体組み立てを参照してください。

ソフトウェア設計

設計フローチャート

ソースコードのダウンロード

ソースコードのリンク:(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株式会社までお問い合わせください。