Davidchen8/AI_CustomerService
0
1import gradio as gr2import openai3import os4from langchain.chat_models import ChatOpenAI5from langchain.schema import AIMessage, HumanMessage6from langchain.prompts import PromptTemplate7from langchain.llms import OpenAI8from langchain.chains import LLMChain9from langchain.memory import ConversationBufferMemory10 11catagory_list = [12 "停车服务", "会员积分及兑换商品", "活动报名", 13 "投诉建议"]14 15members ="""16会员姓名:"David"17会员等级:"黄金会员"18积分:"10000"19 20会员姓名:"Liao"21会员等级:"白金会员"22积分:"20000"23"""24Events = """25活动126活动名称:"国庆节狂欢"27日期:“2023-10-1 到 2023-10-7” 28活动内容:“会员和家庭小朋友可以参加报名,与可爱的迪士尼米奇一起跳舞和唱歌。” 29活动对象: “黄金会员、白金会员”30需要抵扣积分: “5000”31 32活动233活动名称:“圣诞节玩雪”34日期:“2023-12-23 到 2023-12-25” 35活动内容: “会员和家庭小朋友可以参加报名,可以在白雪公主城堡玩雪。” 36活动对象: ”黄金会员、白金会员“37需要抵扣积分: “2000”38"""39 40gifts ="""41 42礼品名称: “华为mate 60 Pro”43兑换积分: “10000”44 45礼品名称: “小米mixed fold 3”46兑换积分: “5000”47"""48 49parking ="""50 51政策:会员可以通过积分抵扣免费停车。 52 53车牌号码:“粤A001”54已停时间:“60分钟”55需要积分:“600”56 57车牌号码:“粤A002”58已停时间:“100分钟”59需要积分:“1000”60"""61 62instructions = {63"停车服务": f"根据停车信息回答客户问题。\641.如果客户想缴停车费,问客户车牌号码。\652.如果客户提供了车牌号码从停车信息找到相关信息。\663.如果找不到客户的停车信息,请让客户联系人工客服。\674.如果找到客户的停车信息,告诉客户的车停了多久,需要多少积分抵扣停车费。\685.如果找到客户的停车信息,问客户是否需要用积分抵扣停车费,请问客户的名字并从会员信息了解情况。\696.如果客户有足够积分抵扣,请为客户用积分抵扣停车费并与客户确认。\707.如果客户不够积分抵扣,请告诉客户自行缴费。\718.如果客户用积分抵扣了停车费,告诉客户扣减活动积分后还有多少积分。\72停车信息以'''符号区分开。\73会员信息以'''符号区分开。\74停车信息:'''{parking}'''\75会员信息:'''{members}''' ",76 77"会员积分及兑换商品": "",78 79"活动报名": f"根据活动清单为客户解答关于活动的问题。\80根据活动清单,介绍活动内容及推介客户参加活动。\81如果客户想报名活动,请问客户的名字并从会员信息了解情况,判断客户有没有参加活动的资格。\82活动有会员等级及积分限定, 只有符合活动对象条件的会员可以参加。另外活动需要扣减积分,如果会员不够积分也无法参加。\83如果客户符合资格,请为客户报名。如果客户不够资格,请礼貌地回复不符合条件参加,并提醒客户可以通过消费获取积分达到参加条件。\84最后与客户确认报名信息并告诉客户扣减活动积分后还有多少积分。\85活动清单以'''符号区分开。\86会员信息以#符号区分开。\87活动清单:''' {Events}'''\88会员信息:#{members}#\89请确保按提供的信息回复问题,如果没有信息请让客户联系人工客户。",90 91"投诉建议":"礼貌地回复客户他的问题已记录,将会转交人工客服处理并尽快回复",92 93"其它": "礼貌地回复客户他的问题已记录,将会转交人工客服处理并尽快回复"}94 95def get_completion_from_messages(messages, 96 temperature=0,97 model="gpt-4", 98 max_tokens=8000):99 response = openai.ChatCompletion.create(100 model=model,101 messages=messages,102 temperature=temperature, 103 max_tokens=max_tokens, 104 )105 return response.choices[0].message["content"]106 107 108def format_chat(message, chat_history):109 prompt = []110 for turn in chat_history:111 user_message, bot_message = turn112 prompt.append({'role': 'user', 'content': user_message})113 prompt.append({'role': 'assistant', 'content': bot_message})114 115 prompt.append({'role': 'user', 'content': message})116 117 return prompt118 119def format_chat_trail(message, chat_history):120 prompt = []121 for turn in chat_history:122 user_message, bot_message = turn123 prompt.append({"user:", user_message})124 prompt.append({"assistant:", bot_message})125 126 prompt.append({"user:", message})127 128 return prompt129 130def get_completion(prompt, model="gpt-4"):131 messages = [{'role': 'user', 'content': prompt}]132 response = openai.ChatCompletion.create(133 model=model,134 messages=messages,135 temperature=0, # this is the degree of randomness of the model's output136 )137 return response.choices[0].message["content"]138 139def catagory(chat_history):140 prompt =[]141 instruction = f"""142 根据与客户的对话记录判断客户需要服务清单里的什么服务。\143 从客户的对话记录里客户如果有多个服务需要,请根据最后的服务需求从服务清单里判断最合适的服务。\144 请确保只输出结果,不需要解释。输出的结果仅限于服务清单里的名称,例如:停车服务、会员积分及兑换商品、活动报名。\145 如果清单里没有合适的服务输出“其它”。\146 服务清单以'''符号区分开。\ 147 服务清单:'''"停车服务", "会员积分及兑换商品", "活动报名", "投诉建议"'''\148 客户的对话记录以'''符号区分开。\ 149 客户的对话记录:'''{chat_history}'''\150 如何判断合适的服务按以下说明:\151 停车服务:停车或缴停车费相关的信息。\152 会员积分及兑换商品:关于会员消费后可获得的积分及使用积分兑换商品的信息。\153 活动报名:关于活动的信息及报名。\154 投诉建议:客户不满意或有什么优化服务的建议。 155 """156 prompt.append({'role': 'system', 'content': instruction})157 response = get_completion_from_messages(prompt)158 return response159 160def ToServe(message, chat_history):161 prompt = []162 chat_trail = format_chat_trail(message,chat_history)163 instruction = f"""164 你是一个大型, 高端商场的客户服务AI,\ 165 回答客户与商场活动、停车服务、会员权益相关的问题。\166 如果问题与商场不相关,请礼貌回复客户无法处理。\ 167 如果问题与商场相关,请以热情态度按以下方式为客户解答问题。\168 回答客户方式以'''符号区分开。 \169 回答客户方式: '''{instructions[catagory(chat_trail)]}'''\170 按提供的信息回复客户的问题。如果没有相关信息请礼貌回复客户不清楚并会将问题反馈给人工客服处理。 171 如果客户的问题不清晰请让客户补充信息。\172 如果客户可能在问某个问题但不确定,请不着急回答,先与客户确定问题。\173 174 按以下举例回复:175 <客户>:地球有多大?176 <AI>:我只能回答商场相关问题。有什么可以帮到您吗?177 178 <客户>:今天天气怎么样?179 <AI>:我只能回答商场相关问题。有什么可以帮到您吗?180 181 <客户>:有餐饮吗?182 <AI>:我没有相关信息。请稍等!我们人工客服会跟进您的问题。 183 184 <客户>:消费100元有多少积分?185 <AI>:我没有相关信息。请稍等!我们人工客服会跟进您的问题。186 187 """188 prompt.append({'role': 'system', 'content': instruction})189 prompt = prompt + format_chat(message, chat_history)190 response = get_completion_from_messages(prompt)191 return response192 193def respond(message, chat_history):194 if message != "":195 #prompt=[]196 #formatted_chat = format_chat(message, chat_history)197 #instruction = get_instruction(formatted_chat)198 #prompt.append({'role': 'system', 'content': instruction })199 #prompt.append(formatted_chat)200 #bot_message = get_completion_from_messages(prompt)201 bot_message = ToServe(message, chat_history)202 chat_history.append((message, bot_message))203 return "", chat_history204 205with gr.Blocks() as demo:206 chatbot = gr.Chatbot(height=400) #just to fit the notebook207 msg = gr.Textbox(label="你的对话:")208 btn = gr.Button("提交")209 clear = gr.ClearButton(components=[msg, chatbot], value="清空对话框")210 btn.click(respond, inputs=[msg, chatbot], outputs=[msg, chatbot])211 msg.submit(respond, inputs=[msg, chatbot], outputs=[msg, chatbot]) #Press enter to submit212 213demo.queue().launch()