Files

1 line
17 KiB
JSON

{"repo": "boldhu/sparkllm", "files": {"baseline.py": {"0a2982a8658f12329170f9d77e628d9cfbc59bb4": {"t": 1785768229.7558556, "n": 5942, "h": "0534cbfa17c1ca46", "c": "from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler\nfrom sparkai.core.messages import ChatMessage\nimport json\nfrom tqdm import tqdm\n\n#星火认知大模型Spark3.5 Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看\nSPARKAI_URL = 'wss://spark-api.xf-yun.com/v3.5/chat'\n#星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看\nSPARKAI_APP_ID = ''\nSPARKAI_API_SECRET = ''\nSPARKAI_API_KEY = ''\n#星火认知大模型Spark3.5 Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看\nSPARKAI_DOMAIN = 'generalv3.5'\n\n# prompt 设计\nPROMPT_EXTRACT = \"\"\"\n你将获得一段群聊对话记录。你的任务是根据给定的表单格式从对话记录中提取结构化信息。在提取信息时,请确保它与类型信息完全匹配,不要添加任何没有出现在下面模式中的属性。\n\n表单格式如下:\ninfo: Array<Dict(\n \"基本信息-姓名\": string | \"\", // 客户的姓名。\n \"基本信息-手机号码\": string | \"\", // 客户的手机号码。\n \"基本信息-邮箱\": string | \"\", // 客户的电子邮箱地址。\n \"基本信息-地区\": string | \"\", // 客户所在的地区或城市。\n \"基本信息-详细地址\": string | \"\", // 客户的详细地址。\n \"基本信息-性别\": string | \"\", // 客户的性别。\n \"基本信息-年龄\": string | \"\", // 客户的年龄。\n \"基本信息-生日\": string | \"\", // 客户的生日。\n \"咨询类型\": string[] | [], // 客户的咨询类型,如询价、答疑等。\n \"意向产品\": string[] | [], // 客户感兴趣的产品。\n \"购买异议点\": string[] | [], // 客户在购买过程中提出的异议或问题。\n \"客户预算-预算是否充足\": string | \"\", // 客户的预算是否充足。示例:充足, 不充足\n \"客户预算-总体预算金额\": string | \"\", // 客户的总体预算金额。\n \"客户预算-预算明细\": string | \"\", // 客户预算的具体明细。\n \"竞品信息\": string | \"\", // 竞争对手的信息。\n \"客户是否有意向\": string | \"\", // 客户是否有购买意向。示例:有意向, 无意向\n \"客户是否有卡点\": string | \"\", // 客户在购买过程中是否遇到阻碍或卡点。示例:有卡点, 无卡点\n \"客户购买阶段\": string | \"\", // 客户当前的购买阶段,如合同中、方案交流等。\n \"下一步跟进计划-参与人\": string[] | [], // 下一步跟进计划中涉及的人员(客服人员)。\n \"下一步跟进计划-时间点\": string | \"\", // 下一步跟进的时间点。\n \"下一步跟进计划-具体事项\": string | \"\" // 下一步需要进行的具体事项。\n)>\n\n请分析以下群聊对话记录,并根据上述格式提取信息:\n\n**对话记录:**\n```\n{content}\n```\n\n请将提取的信息以JSON格式输出。\n不要添加任何澄清信息。\n输出必须遵循上面的模式。\n不要添加任何没有出现在模式中的附加字段。\n不要随意删除字段。\n\n**输出:**\n```\n[{{\n \"基本信息-姓名\": \"姓名\",\n \"基本信息-手机号码\": \"手机号码\",\n \"基本信息-邮箱\": \"邮箱\",\n \"基本信息-地区\": \"地区\",\n \"基本信息-详细地址\": \"详细地址\",\n \"基本信息-性别\": \"性别\",\n \"基本信息-年龄\": \"年龄\",\n \"基本信息-生日\": \"生日\",\n \"咨询类型\": [\"咨询类型\"],\n \"意向产品\": [\"意向产品\"],\n \"购买异议点\": [\"购买异议点\"],\n \"客户预算-预算是否充足\": \"充足或不充足\",\n \"客户预算-总体预算金额\": \"总体预算金额\",\n \"客户预算-预算明细\": \"预算明细\",\n \"竞品信息\": \"竞品信息\",\n \"客户是否有意向\": \"有意向或无意向\",\n \"客户是否有卡点\": \"有卡点或无卡点\",\n \"客户购买阶段\": \"购买阶段\",\n \"下一步跟进计划-参与人\": [\"跟进计划参与人\"],\n \"下一步跟进计划-时间点\": \"跟进计划时间点\",\n \"下一步跟进计划-具体事项\": \"跟进计划具体事项\"\n}}, ...]\n```\n\"\"\"\n\ndef read_json(json_file_path):\n \"\"\"读取json文件\"\"\"\n with open(json_file_path, 'r') as f:\n data = json.load(f)\n return data\n\n\ndef write_json(json_file_path, data):\n \"\"\"写入json文件\"\"\"\n with open(json_file_path, 'w') as f:\n json.dump(data, f, ensure_ascii=False, indent=4)\n\n\ndef get_completions(text):\n messages = [ChatMessage(\n role=\"user\",\n content=text\n )]\n spark = ChatSparkLLM(\n spark_api_url=SPARKAI_URL,\n spark_app_id=SPARKAI_APP_ID,\n spark_api_key=SPARKAI_API_KEY,\n spark_api_secret=SPARKAI_API_SECRET,\n spark_llm_domain=SPARKAI_DOMAIN,\n streaming=False,\n )\n handler = ChunkPrintHandler()\n a = spark.generate([messages], callbacks=[handler])\n return a.generations[0][0].text\n \n\ndef convert_all_json_in_text_to_dict(text):\n \"\"\"提取LLM输出文本中的json字符串\"\"\"\n dicts, stack = [], []\n for i in range(len(text)):\n if text[i] == '{':\n stack.append(i)\n elif text[i] == '}':\n begin = stack.pop()\n if not stack:\n dicts.append(json.loads(text[begin:i+1]))\n return dicts\n \n \nclass JsonFormatError(Exception):\n def __init__(self, message):\n self.message = message\n super().__init__(self.message)\n\n\ndef check_and_complete_json_format(data):\n required_keys = {\n \"基本信息-姓名\": str,\n \"基本信息-手机号码\": str,\n \"基本信息-邮箱\": str,\n \"基本信息-地区\": str,\n \"基本信息-详细地址\": str,\n \"基本信息-性别\": str,\n \"基本信息-年龄\": str,\n \"基本信息-生日\": str,\n \"咨询类型\": list,\n \"意向产品\": list,\n \"购买异议点\": list,\n \"客户预算-预算是否充足\": str,\n \"客户预算-总体预算金额\": str,\n \"客户预算-预算明细\": str,\n \"竞品信息\": str,\n \"客户是否有意向\": str,\n \"客户是否有卡点\": str,\n \"客户购买阶段\": str,\n \"下一步跟进计划-参与人\": list,\n \"下一步跟进计划-时间点\": str,\n \"下一步跟进计划-具体事项\": str\n }\n\n if not isinstance(data, list):\n raise JsonFormatError(\"Data is not a list\")\n\n for item in data:\n if not isinstance(item, dict):\n raise JsonFormatError(\"Item is not a dictionary\")\n for key, value_type in required_keys.items():\n if key not in item:\n item[key] = [] if value_type == list else \"\"\n if not isinstance(item[key], value_type):\n raise JsonFormatError(f\"Key '{key}' is not of type {value_type.__name__}\")\n if value_type == list and not all(isinstance(i, str) for i in item[key]):\n raise JsonFormatError(f\"Key '{key}' does not contain all strings in the list\")\n \n \nif __name__ == \"__main__\":\n retry_count = 5 # 重试次数\n result = []\n error_data = []\n \n \n # 读取数据\n train_data = read_json(\"dataset/train.json\")\n test_data = read_json(\"dataset/test_data.json\")\n \n for index, data in tqdm(enumerate(test_data)):\n index += 1\n is_success = False\n for i in range(retry_count):\n try:\n res = get_completions(PROMPT_EXTRACT.format(content=data[\"chat_text\"]))\n infos = convert_all_json_in_text_to_dict(res)\n infos = check_and_complete_json_format(infos)\n result.append({\n \"infos\": infos,\n \"index\": index\n })\n is_success = True\n break\n except Exception as e:\n print(\"index:\", index, \", error:\", e)\n continue\n if not is_success:\n data[\"index\"] = index\n error_data.append(data)\n write_json(\"output.json\", result)"}}, "main.py": {"0a2982a8658f12329170f9d77e628d9cfbc59bb4": {"t": 1785768230.0789087, "n": 6147, "h": "7cf5c5c2c85ca55f", "c": "from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler\nfrom sparkai.core.messages import ChatMessage\nimport json\n\n# 1下载必要库\n# pip install --upgrade -q spark_ai_python\n\n# 2配置导入\n#星火认知大模型Spark3.5 Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看\nSPARKAI_URL = 'wss://spark-api.xf-yun.com/v3.5/chat'\n#星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看\nSPARKAI_APP_ID = '4b9325d0'\nSPARKAI_API_SECRET = 'NDYzZTVlNjkzNjJlZGIzYTcyYTI0YzU2'\nSPARKAI_API_KEY = '954d0af2e752e973b18d782f935e734c'\n#星火认知大模型Spark3.5 Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看\nSPARKAI_DOMAIN = 'generalv3.5'\n\n# 3模型测试\ndef get_completions(text):\n messages = [ChatMessage(\n role=\"user\",\n content=text\n )]\n spark = ChatSparkLLM(\n spark_api_url=SPARKAI_URL,\n spark_app_id=SPARKAI_APP_ID,\n spark_api_key=SPARKAI_API_KEY,\n spark_api_secret=SPARKAI_API_SECRET,\n spark_llm_domain=SPARKAI_DOMAIN,\n streaming=False,\n )\n handler = ChunkPrintHandler()\n a = spark.generate([messages], callbacks=[handler])\n return a.generations[0][0].text\n\n# 测试模型配置是否正确\ntext = \"你好\"\nget_completions(text)\n\n# 4数据读取\ndef read_json(json_file_path):\n \"\"\"读取json文件\"\"\"\n with open(json_file_path, 'r') as f:\n data = json.load(f)\n return data\n\ndef write_json(json_file_path, data):\n \"\"\"写入json文件\"\"\"\n with open(json_file_path, 'w') as f:\n json.dump(data, f, ensure_ascii=False, indent=4)\n\n# 读取数据\ntrain_data = read_json(\"./dataset/train.json\")\ntest_data = read_json(\"./dataset/test_data.json\")\n\n# 5 设计Prompt\n# prompt 设计\nPROMPT_EXTRACT = \"\"\"\n你将获得一段群聊对话记录。你的任务是根据给定的表单格式从对话记录中提取结构化信息。在提取信息时,请确保它与类型信息完全匹配,不要添加任何没有出现在下面模式中的属性。\n\n表单格式如下:\ninfo: Array<Dict(\n \"基本信息-姓名\": string | \"\", // 客户的姓名。\n \"基本信息-手机号码\": string | \"\", // 客户的手机号码。\n \"基本信息-邮箱\": string | \"\", // 客户的电子邮箱地址。\n \"基本信息-地区\": string | \"\", // 客户所在的地区或城市。\n \"基本信息-详细地址\": string | \"\", // 客户的详细地址。\n \"基本信息-性别\": string | \"\", // 客户的性别。\n \"基本信息-年龄\": string | \"\", // 客户的年龄。\n \"基本信息-生日\": string | \"\", // 客户的生日。\n \"咨询类型\": string[] | [], // 客户的咨询类型,如询价、答疑等。\n \"意向产品\": string[] | [], // 客户感兴趣的产品。\n \"购买异议点\": string[] | [], // 客户在购买过程中提出的异议或问题。\n \"客户预算-预算是否充足\": string | \"\", // 客户的预算是否充足。示例:充足, 不充足\n \"客户预算-总体预算金额\": string | \"\", // 客户的总体预算金额。\n \"客户预算-预算明细\": string | \"\", // 客户预算的具体明细。\n \"竞品信息\": string | \"\", // 竞争对手的信息。\n \"客户是否有意向\": string | \"\", // 客户是否有购买意向。示例:有意向, 无意向\n \"客户是否有卡点\": string | \"\", // 客户在购买过程中是否遇到阻碍或卡点。示例:有卡点, 无卡点\n \"客户购买阶段\": string | \"\", // 客户当前的购买阶段,如合同中、方案交流等。\n \"下一步跟进计划-参与人\": string[] | [], // 下一步跟进计划中涉及的人员(客服人员)。\n \"下一步跟进计划-时间点\": string | \"\", // 下一步跟进的时间点。\n \"下一步跟进计划-具体事项\": string | \"\" // 下一步需要进行的具体事项。\n)>\n\n请分析以下群聊对话记录,并根据上述格式提取信息:\n\n**对话记录:**\n```\n{content}\n```\n\n请将提取的信息以JSON格式输出。\n不要添加任何澄清信息。\n输出必须遵循上面的模式。\n不要添加任何没有出现在模式中的附加字段。\n不要随意删除字段。\n\n**输出:**\n```\n[{{\n \"基本信息-姓名\": \"姓名\",\n \"基本信息-手机号码\": \"手机号码\",\n \"基本信息-邮箱\": \"邮箱\",\n \"基本信息-地区\": \"地区\",\n \"基本信息-详细地址\": \"详细地址\",\n \"基本信息-性别\": \"性别\",\n \"基本信息-年龄\": \"年龄\",\n \"基本信息-生日\": \"生日\",\n \"咨询类型\": [\"咨询类型\"],\n \"意向产品\": [\"意向产品\"],\n \"购买异议点\": [\"购买异议点\"],\n \"客户预算-预算是否充足\": \"充足或不充足\",\n \"客户预算-总体预算金额\": \"总体预算金额\",\n \"客户预算-预算明细\": \"预算明细\",\n \"竞品信息\": \"竞品信息\",\n \"客户是否有意向\": \"有意向或无意向\",\n \"客户是否有卡点\": \"有卡点或无卡点\",\n \"客户购买阶段\": \"购买阶段\",\n \"下一步跟进计划-参与人\": [\"跟进计划参与人\"],\n \"下一步跟进计划-时间点\": \"跟进计划时间点\",\n \"下一步跟进计划-具体事项\": \"跟进计划具体事项\"\n}}, ...]\n```\n\"\"\"\n\n# 6主函数启动\nimport json\n\nclass JsonFormatError(Exception):\n def __init__(self, message):\n self.message = message\n super().__init__(self.message)\n\ndef convert_all_json_in_text_to_dict(text):\n \"\"\"提取LLM输出文本中的json字符串\"\"\"\n dicts, stack = [], []\n for i in range(len(text)):\n if text[i] == '{':\n stack.append(i)\n elif text[i] == '}':\n begin = stack.pop()\n if not stack:\n dicts.append(json.loads(text[begin:i+1]))\n return dicts\n\n# 查看对话标签\ndef print_json_format(data):\n \"\"\"格式化输出json格式\"\"\"\n print(json.dumps(data, indent=4, ensure_ascii=False))\n\n\n\ndef check_and_complete_json_format(data):\n required_keys = {\n \"基本信息-姓名\": str,\n \"基本信息-手机号码\": str,\n \"基本信息-邮箱\": str,\n \"基本信息-地区\": str,\n \"基本信息-详细地址\": str,\n \"基本信息-性别\": str,\n \"基本信息-年龄\": str,\n \"基本信息-生日\": str,\n \"咨询类型\": list,\n \"意向产品\": list,\n \"购买异议点\": list,\n \"客户预算-预算是否充足\": str,\n \"客户预算-总体预算金额\": str,\n \"客户预算-预算明细\": str,\n \"竞品信息\": str,\n \"客户是否有意向\": str,\n \"客户是否有卡点\": str,\n \"客户购买阶段\": str,\n \"下一步跟进计划-参与人\": list,\n \"下一步跟进计划-时间点\": str,\n \"下一步跟进计划-具体事项\": str\n }\n\n if not isinstance(data, list):\n raise JsonFormatError(\"Data is not a list\")\n\n for item in data:\n if not isinstance(item, dict):\n raise JsonFormatError(\"Item is not a dictionary\")\n for key, value_type in required_keys.items():\n if key not in item:\n item[key] = [] if value_type == list else \"\"\n if not isinstance(item[key], value_type):\n raise JsonFormatError(f\"Key '{key}' is not of type {value_type.__name__}\")\n if value_type == list and not all(isinstance(i, str) for i in item[key]):\n raise JsonFormatError(f\"Key '{key}' does not contain all strings in the list\")\n\n return data\n\nfrom tqdm import tqdm\n\nretry_count = 5 # 重试次数\nresult = []\nerror_data = []\n\nfor index, data in tqdm(enumerate(test_data)):\n index += 1\n is_success = False\n for i in range(retry_count):\n try:\n res = get_completions(PROMPT_EXTRACT.format(content=data[\"chat_text\"]))\n infos = convert_all_json_in_text_to_dict(res)\n infos = check_and_complete_json_format(infos)\n result.append({\n \"infos\": infos,\n \"index\": index\n })\n is_success = True\n break\n except Exception as e:\n print(\"index:\", index, \", error:\", e)\n continue\n if not is_success:\n data[\"index\"] = index\n error_data.append(data)\n \n# 7生成输出文件\n# 保存输出\nwrite_json(\"output.json\", result)\n\n"}}}}