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
相关产品推荐
相关产品推荐

