Telegram机器人,使用ChatGPT作为核心:将OpenAI的智能加入机器人。

介绍 EventAlly:您的人工智能助手,旨在帮助您在探索新城市的同时规划您的一天(文章下方链接)。

首先,请查看GitHub上的bot模板aleksandr-dzhumurat/tg_ai_bot_template,用于创建您的对话机器人。

在之前的Medium文章中,我描述了使用React JS创建一个用于日程安排的网络应用程序的过程。在本篇文章中,我将解释我如何(以及为什么)将应用程序的功能转移到Telegram,并借助OpenAI的帮助创建了一个真正的对话机器人。

问题定义

首先,为什么将一个网页应用转变为对话式格式?答案很简单:灵活性。我们想从用户那里获取的信息越多,界面就会变得越复杂。这会导致用户体验更复杂,开发速度变慢。我们该如何应对这种情况呢?

我们正在开发一个应用程序,用于从Google Places推荐地点。我们服务的一般工作流程如下:我们收集用户偏好,通过API将偏好发送到推荐源,然后向用户提供最适合的推荐。然而,为了在API中创建请求,我们需要以结构化格式(JSON)获取有关用户偏好的信息。

问题解决方案

一种解决这个问题的方法是利用语言模型(LLM)。

  • 创建一个LLM的提示,描述机器人的任务。我建议使用OpenAI作为LLM,但也可以考虑Google的Gemini等备选方案。
  • 机器人的任务是进行对话,以识别用户的偏好,并生成一个结构化的JSON数据用于API请求。
  • 通过LLM对API查询结果进行后处理也是可能的,例如,向用户解释推荐的价值。

以下是一个示例提示:

    SystemMessagePromptTemplate.from_template(
"""
You are an conversational chatbot.
You must be direct, efficient, impersonal, and professional in all of your communications.
You should ask human step by step questions from section "questions"
You can change the order of questions if you want.
Use only information from human messages, do not imagine answers

questions:
- ask the country name the user live in. If you don't know this country, gently ask again. It is country field in result JSON
- ask the city name the user live in. It is city field in result JSON
- ask does human prefer craft beer (yes or no) it is craft field in result JSON

Only ask questions right before this line, but in other words, not literally

When you have enough information from chat history, prepare final response.
Final response should only consist of document in JSON format with the following fields: [city, country, craft_option]
Do not add any extra words in JSON. Do not come up with prepared plan.

For example: "city": "Limassol", "country": "Cyprus", "craft_option": false
"""
),

要创建一个支持用户对话的Telegram机器人,按照以下几个简单步骤进行操作:

  • 克隆存储库 https://github.com/aleksandr-dzhumurat/tg_ai_bot_template 并根据您的具体任务自定义提示。
  • 使用https://t.me/BotFather创建一个机器人 - 你需要一个 token。
  • 将 env.template 文件重命名为 .env,并填写缺失的变量(用于访问 OpenAI 和 Google Places 的令牌)。

以下是对话流程的示例,Chat是Langchain `ConversationChain`对象。

def dialog_router(human_input: str, user: dict):
llm_answer = chat.predict(input=human_input)
json_response = get_json(llm_answer)
if json_response is not None:
location_option = "%s, %s" % (json_response['country'], json_response['city'])
lat_lng = place_recommender.find_place(location_option)
recommended_place = place_recommender.get_recs(lat_lng)
html_answer = prepare_html(recommended_place, user)
return {'final_answer': True, 'answer': html_answer}
else:
return {'final answer': False, 'answer': llm_answer}

重点考虑因素:

  • 我们使用LangChain来创建机器人。为了确保机器人“记住”用户之前的行为,使用ConversationBufferMemory类。
  • 创建一个适当对话的提示,最终步骤涉及获取用户的结构化偏好,以JSON格式保存。
  • 验证LLM的消息——使用正则表达式从LLM响应中提取JSON是至关重要的(在get_json函数内部)。

如果机器人成功地完成对话(也就是提取了用户回复中所有必要的信息),那么就需要构建一个 JSON 请求发送给 Google API,并将这些信息呈现给用户,可以使用 HTML 的形式。

例子对话在幕后:

Human: Hey
AI: Hello! How can I assist you today?
Human: Plan my day
AI: Of course! I'd be happy to help you plan your day. Could you please provide me with some information?
Human: Yes
AI: Great! Let's start with the basics. Could you please tell me the name of the country you live in?
Human: Cyprus
AI: Thank you for providing the name of the country you live in. Now, could you please tell me the name of the city you live in?
Human: Limassol
AI: Thank you for providing the name of the city you live in. Now, do you have any children? Please answer with either "yes" or "no".
Human: No
AI: Thank you for letting me know. Lastly, would you like to start your day from the morning? Please answer with either "yes" or "no".
Human: No

您可以在Telegram与机器人EventAllyBot进行对话。

2024-01-03 04:17:41 AI中文站翻译自原文