如何将Watson中的上下文变量提取并存储到本地文件?
把Watson上下文变量导出到本地文件的解决方案
我来帮你搞定这个需求!Watson Assistant本身没法直接写入本地文件,但我们可以通过两种简单的方式实现:Webhook对接本地服务或者用SDK本地拉取数据,下面给你详细讲每种方法的操作步骤和代码示例。
方法一:Webhook + 本地后端脚本(实时导出)
这个方法能在Watson提取到变量的同时,实时把数据发送到你的本地脚本并写入文件,适合需要即时保存的场景。
步骤1:编写本地HTTP服务(以Python Flask为例)
先写一个简单的本地服务,用来接收Watson发来的上下文数据并写入文件:
from flask import Flask, request app = Flask(__name__) @app.route('/save-watson-variable', methods=['POST']) def save_variable(): # 解析Watson发送的JSON数据 request_data = request.get_json() # 从上下文里提取你需要的number_extract变量 extracted_number = request_data['context']['number_extract'] # 写入本地文件,这里可以自定义文件路径和文件名 # 用追加模式('a')可以保留历史数据,改成'w'会每次覆盖 with open('./watson_extracted_numbers.txt', 'a', encoding='utf-8') as file: file.write(f"提取到的数字: {extracted_number}\n") # 给Watson返回响应,确保对话能正常继续 return {'context': request_data['context']}, 200 if __name__ == '__main__': # 启动本地服务,允许外部访问 app.run(host='0.0.0.0', port=5000, debug=True)
步骤2:让Watson能访问到你的本地服务
因为Watson是云端服务,没法直接访问你的本地端口,所以需要用内网穿透工具(比如ngrok)把本地5000端口暴露成公网URL。运行ngrok命令:
ngrok http 5000
之后你会得到一个类似https://xxxx-xx-xx-xx-xx.ngrok.io的公网地址,后面要用到这个地址。
步骤3:在Watson Assistant里配置Webhook
- 打开你的Watson技能,进入「设置」→「Webhook」
- 添加Webhook URL:
你的ngrok地址/save-watson-variable - 找到你提取
number_extract的对话节点,在节点的「选项」里勾选「调用Webhook」,并设置把上下文数据发送过去
这样当对话运行到这个节点时,Watson就会把上下文数据发送到你的本地脚本,脚本会自动把变量写入文件。
方法二:用Watson SDK本地拉取并保存(批量/按需导出)
如果不需要实时导出,你也可以在本地运行脚本,直接调用Watson的API获取对话上下文,然后保存到文件,适合测试或者批量导出的场景。
步骤1:安装Watson SDK
先安装IBM Watson的Python SDK:
pip install ibm-watson ibm-cloud-sdk-core
步骤2:编写拉取并保存的脚本
from ibm_watson import AssistantV2 from ibm_cloud_sdk_core.authenticators import IAMAuthenticator import json # 替换成你自己的Watson配置信息 API_KEY = "你的Watson API密钥" ASSISTANT_URL = "你的Watson服务URL" ASSISTANT_ID = "你的技能ID" # 初始化Watson客户端 authenticator = IAMAuthenticator(API_KEY) assistant = AssistantV2( version='2021-06-14', authenticator=authenticator ) assistant.set_service_url(ASSISTANT_URL) # 创建对话会话 session_response = assistant.create_session(assistant_id=ASSISTANT_ID).get_result() session_id = session_response['session_id'] # 发送测试输入(或者你可以用实际的对话历史) message_response = assistant.message( assistant_id=ASSISTANT_ID, session_id=session_id, input={'text': '包含数字的用户输入,比如"我的订单号是12345"'} ).get_result() # 提取上下文里的number_extract变量 extracted_number = message_response['context']['skills']['main skill']['user_defined']['number_extract'] # 保存到本地JSON文件(也可以改成TXT格式) save_data = { "提取到的数字": extracted_number, "对话时间": message_response['output']['generic'][0]['timestamp'] } with open('./watson_context_variables.json', 'w', encoding='utf-8') as file: json.dump(save_data, file, ensure_ascii=False, indent=4) # 关闭会话 assistant.delete_session(assistant_id=ASSISTANT_ID, session_id=session_id) print("变量已成功保存到本地文件!")
注意事项
- 两种方法都要确保你的本地文件路径有读写权限
- 用Webhook时,ngrok的地址每次重启会变,如果需要固定地址,可以考虑用内网穿透的付费服务,或者把后端部署到云服务器上
- 如果你用的是Watson Assistant的旧版本(V1 API),代码需要做少量调整,不过V2是目前的推荐版本
内容的提问来源于stack exchange,提问作者pepefrog69
相关产品推荐
相关产品推荐

