You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python开发聊天机器人时如何通过JSON配置调用自定义UDF函数

具体实现方法

1. 调整JSON配置

给需要调用函数的意图的回复添加统一标识前缀(如func:),无需硬编码判断意图名称,后续新增功能扩展性更强。修改后的配置示例:

[
  {"tag": "greetings",
   "pattern": ["Hi", "How are you", "Hey", "Hello", "Good Day"],
   "responses": ["Hello!", "Hey there", "Hi, how can I help you today?"]
  },
  {"tag": "status_check",
   "pattern": ["Where's my shipment", "Track my shipment"],
   "responses": ["func:db_info"]
  }
]

2. 定义函数映射字典

在Python代码中把配置里的函数名和实际业务函数做绑定,避免字符串直接执行的安全问题,也方便统一管理所有可调用函数。

3. 编写统一回复处理逻辑

自动识别回复类型,普通回复直接随机选取,函数调用则执行对应函数拿结果。
完整代码示例:

import json
import random

# 原有数据库查询函数
def db_info():
    # 此处保留你原有的postgres数据库连接、查询逻辑,返回字符串格式的配送状态即可
    return "您的包裹当前已抵达所在城市网点,预计2小时内配送上门"

# 函数映射表:key为JSON配置中填写的函数名,value为实际定义的函数对象
FUNC_MAP = {
    "db_info": db_info
}

# 加载本地意图配置文件
with open("intents.json", "r", encoding="utf-8") as f:
    intent_configs = json.load(f)

def generate_response(intent):
    # 匹配对应意图的配置项
    matched_intent = next(item for item in intent_configs if item["tag"] == intent)
    resp_rule = matched_intent["responses"][0]
    # 判断是否为函数调用
    if resp_rule.startswith("func:"):
        func_name = resp_rule.split(":")[1]
        # 调用对应函数,返回查询结果
        return FUNC_MAP[func_name]()
    # 普通意图随机返回预设回复
    return random.choice(matched_intent["responses"])

# 运行测试
if __name__ == "__main__":
    print(generate_response("greetings")) # 输出随机问候语
    print(generate_response("status_check")) # 输出数据库查询到的配送状态

可选扩展

如果查询配送状态需要传入用户提供的订单号等参数,只需修改函数定义和调用逻辑即可:

# 带参数的数据库查询函数
def db_info(order_id):
    # 带入订单号查询数据库
    return f"订单[{order_id}]当前状态:已签收,签收时间为昨日19:23"

# 调用时传入参数
return FUNC_MAP[func_name](order_id=user_provided_order_id)

内容的提问来源于stack exchange,提问作者pypsy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:06:03