中国站长之家爱站网,wordpress技巧:开启wordpress多站点功能,视频网站中滑动列表怎么做,濮阳网络化前言
随着人工智能技术的不断进步#xff0c;大语言模型#xff08;LLM#xff09;已成为技术前沿的热点。它们不仅能够理解和生成文本#xff0c;还能在多种应用场景中实现复杂的交互。本文将深入探讨一段结合了大语言模型能力、意图识别和词槽实体抽取的Python代码…前言
随着人工智能技术的不断进步大语言模型LLM已成为技术前沿的热点。它们不仅能够理解和生成文本还能在多种应用场景中实现复杂的交互。本文将深入探讨一段结合了大语言模型能力、意图识别和词槽实体抽取的Python代码这段代码展示了如何实现智能的多轮问答能力为用户提供更加丰富和个性化的交互体验。
正文
完整代码
这段代码的核心在于集成了最新的大语言模型LLM能力结合了意图识别和词槽实体抽取的技术以实现智能的多轮问答。
import json
import re
import requests
from datetime import datetimeurl https://api.openai.com/v1/chat/completions# 替换为您自己的chatGPT API密钥
api_key sk-xxxxxx# 调试日志
debug Falsedef check_values_not_empty(json_data):检查是否所有元素value都不为空# 遍历JSON数据中的每个元素for item in json_data:# 检查value字段是否为空字符串if item.get(value) :return False # 如果发现空字符串返回Falsereturn True # 如果所有value字段都非空返回Truedef format_title_value_for_logging(json_data):抽取参数名称和value值log_strings []for item in json_data:title item.get(title, Unknown Title) # 获取title如果不存在则使用Unknown Titlevalue item.get(value, N/A) # 获取value如果不存在则使用N/Alog_string fTitle: {title}, Value: {value}log_strings.append(log_string)return \n.join(log_strings)def extract_json_from_string(input_string):JSON抽取函数返回包含JSON对象的列表try:# 正则表达式假设JSON对象由花括号括起来matches re.findall(r\{.*?\}, input_string, re.DOTALL)# 验证找到的每个匹配项是否为有效的JSONvalid_jsons []for match in matches:try:json_obj json.loads(match)valid_jsons.append(json_obj)except json.JSONDecodeError:continue # 如果不是有效的JSON跳过该匹配项return valid_jsonsexcept Exception as e:print(fError occurred: {e})return []def send_message(message, user_input):请求LLM函数print(--------------------------------------------------------------------)if debug:print(用户输入:, message)else:print(用户输入:, user_input)print(----------------------------------)headers {Authorization: fBearer {api_key},Content-Type: application/json,}data {model: gpt-3.5-turbo,messages: [{role: system, content: You are a helpful assistant.},{role: user, content: f{message}}]}response requests.post(url, headersheaders, jsondata, verifyFalse)if response.status_code 200:answer response.json()[choices][0][message][content]print(LLM输出:, answer)print(--------------------------------------------------------------------)return answerelse:print(fError: {response.status_code})return None# 问天气
# 参数
# 1. 时间time口语今天明天、日期10号、范围未来一周
# 2. 地点location国家省市区
# todo transform: 时间格式转换工具是自己做一个还是用大模型。建议自己开发一个,
dict_weather [{title: 时间,desc: 口语表述昨天、今天、明天具体日期10号、1月1号、2月3日范围未来一周、最近十四天,transform: 时间统一转换格式如果是时间点yyyy-MM-dd如果是时间段yyyy-MM-dd#yyyy-MM-dd,util: ,value: ,required: True},{title: 地点,desc: 口语表述建邺区、南京、河北省、江苏南通、上海虹桥、北京朝阳区,transform: 地点统一转换格式为省市区如果有区或省市如南京市建邺区、南京市如果提取不到市只有省份则不填写value,util: ,value: ,required: True}
]prompt_weather_info_update
JSON每个元素代表一个参数信息我先给你提供一些基本介绍title字段是参数名称如果需要让用户填写该参数时你应该告诉用户你需要的参数名称
desc字段是参数描述可以做为title字段的补充更好的引导用户补充参数
transform字段是填写value字段值的格式要求说明
required字段为true表示该元素的value是必填参数如果value为空则必须让用户补充该参数信息如果required字段为false表示该参数不是必须补充的字段
需求
#01 根据用户输入信息提取有用的信息更新到JSON中的value字段并返回更新后的JSON
#02 仅更新value字段其他字段都原样返回
#03 如果没有可更新的value则原样返回
#04 当前时间为{}参考示例JSON: [{{title: 时间,desc: 口语表述昨天、今天、明天具体日期10号、1月1号、2月3日范围未来一周、最近十四天,transform: 时间统一转换格式如果是时间点yyyy-MM-dd如果是时间段yyyy-MM-dd#yyyy-MM-dd,util: ,value: ,required: true}},{{title: 地点,desc: 口语表述建邺区、南京、河北省、江苏南通、上海虹桥、北京朝阳区,transform: 地点统一转换格式为省市区如果有区或省市如南京市建邺区、南京市如果提取不到市只有省份则不填写value,util: ,value: ,required: true}}
]
问今天南京天气怎么样
答[{{title: 时间,desc: 口语表述昨天、今天、明天具体日期10号、1月1号、2月3日范围未来一周、最近十四天,transform: 时间统一转换格式如果是时间点yyyy-MM-dd如果是时间段yyyy-MM-dd#yyyy-MM-dd,util: ,value: {},required: true}},{{title: 地点,desc: 口语表述建邺区、南京、河北省、江苏南通、上海虹桥、北京朝阳区,transform: 地点统一转换格式为省市区如果有区或省市如南京市建邺区、南京市如果提取不到市只有省份则不填写value,util: ,value: 南京,required: true}}
]
JSON{}
问{}
答
prompt_weather_query_user
JSON每个元素代表一个参数信息我先给你提供一些基本介绍title字段是参数名称如果需要让用户填写该参数时你应该告诉用户你需要的参数名称
desc字段是参数描述可以做为title字段的补充更好的引导用户补充参数
required字段为true表示该元素的value是必填参数如果value为空则必须让用户补充该参数信息如果required字段为false表示该参数不是必须补充的字段
需求
#01 如果有多个未填写value的参数则可以一起向用户提问
#02 value已经填写的参数不用再次提问参考示例问[{{title: 时间,desc: 口语表述昨天、今天、明天具体日期10号、1月1号、2月3日范围未来一周、最近十四天,transform: 时间统一转换格式如果是时间点yyyy-MM-dd如果是时间段yyyy-MM-dd#yyyy-MM-dd,util: ,value: 2022-01-01,required: true}},{{title: 地点,desc: 口语表述建邺区、南京、河北省、江苏南通、上海虹桥、北京朝阳区,transform: 地点统一转换格式为省市区如果有区或省市如南京市建邺区、南京市如果提取不到市只有省份则不填写value,util: ,value: ,required: true}}
]
答请问你想查询天气的地点是什么
问{}
答
# 公积金咨询
# 参数
# 1. 事件买房、租房、退休
# 2. 购买房屋类型买房事件时需要 经济适用房、新房、二手房
dict_consult {event: ,purchase_type:
}prompt_global_purpose
有下面多种场景需要你根据用户输入进行判断
1. 问天气
2. 公积金咨询
3. 其他场景参考示例问今天天气如何
答问天气
问{}
答
global_purpose def multi_question(user_input):global global_purposeglobal dict_weathercurrent_purpose send_message(prompt_global_purpose.format(user_input), user_input)if current_purpose ! 其他场景:global_purpose current_purposeif global_purpose 问天气:# 先检查本次用户输入是否有信息补充保存补充后的结果 编写程序进行字符串value值diff对比判断是否有更新current_time datetime.now().strftime(%Y-%m-%d)new_info_json_raw send_message(prompt_weather_info_update.format(current_time, current_time, json.dumps(dict_weather, ensure_asciiFalse), user_input), user_input)dict_weather extract_json_from_string(new_info_json_raw)# 判断参数是否已经全部补全if check_values_not_empty(dict_weather):print(问天气 ------ 参数已完整详细参数如下)print(format_title_value_for_logging(dict_weather))print(正在请求天气查询API请稍后……)else:str json.dumps(dict_weather, ensure_asciiFalse)send_message(prompt_weather_query_user.format(str), user_input)elif global_purpose 公积金咨询:passelse:passpassdef user_input():while True:question input(请输入您的问题)multi_question(question)# test
# multi_question(明天天气怎么样呢)
# multi_question(苏州天气怎么样呢)
# multi_question(苏州明天天气怎么样呢)user_input()
代码解析
整合大语言模型LLM代码通过与一个语言模型API的交互利用了大语言模型的强大文本生成和理解能力。这使得脚本能够处理复杂的用户查询并生成合理的响应。
意图识别通过分析用户的输入脚本可以识别用户的意图例如查询天气或获取公积金咨询这是通过向LLM发送特定的提示prompt实现的。
词槽实体抽取代码能够从用户输入中提取关键信息如时间和地点并将这些信息填充到预定义的JSON结构中。这是通过正则表达式和JSON操作实现的。
多轮交互脚本支持多轮交互能够根据用户输入的不同动态地提问和响应为用户提供连贯且自然的对话体验。
代码的实用性
这个脚本不仅展示了如何在Python中处理复杂的数据结构和执行HTTP请求还展示了大语言模型在实际应用中的巨大潜力。它为开发者提供了一个实用的框架用于构建可以理解和响应人类语言的智能应用程序。LLM场景识别词槽实体抽取实现人机交互多轮会话遥遥领先~
结尾
我们可以看到大语言模型在理解和生成自然语言方面的巨大潜力。结合意图识别和词槽实体抽取它能够实现复杂且自然的多轮对话。这种技术的应用范围非常广泛从简单的信息查询到复杂的交互式任务都能得到有效的支持。
希望这篇文章能够启发你探索大语言模型和智能问答系统的更多可能性。如果你觉得这篇文章有用别忘了点赞和收藏作者gallonyin持续关注AI自动化。