钉钉自动问答机器人

背景

近期在整合公司的知识库,便于遇到一些简单的问题可以通过查询知识库来自主解决。但过程中发现大部分人并没有遇到问题查看知识库的习惯,更多的还是询问对应的同事,为此(不是为了偷懒)便诞生了编写一个自动回复机器人的想法。

需求

已完成

  • 可以根据关键词匹配知识库的内容自动回答对应内容

  • 无法回答的问题自动记录并保存在对应文档内

  • 可以同时响应多人的问题

未完成

  • 可以联网搜索或回答一些简单的联网问题,比如天气等

  • 维护知识库更简单

实现

  1. 创建钉钉应用机器人,并获取client_id和client_secret。详细步骤可见官网,文档还是蛮详细的。

  2. 用python实现,首先安装钉钉官网JDK

    python3 -m pip install dingtalk-stream
  3. 创建相应文件

  • bot.log——用于记录日志

  • config.json——用于存储client_id和client_secret

  • knowledge_base.json——用于保存知识库(偷懒,文档庞大最好用数据库保存)

  • unrecognized_queries.txt——保存无法回答的问题

  • main.py——主程序

  1. knowledge_base.json

    {

    "你好": "你好,有什么可以帮你的吗?",

    "天气": "今天的天气是晴天,气温23度。",

    }
  2. config.json内容格式

    {

    "client_id": "你的应用id",

    "client_secret": "你的应用secret"

    }
  3. main.py内容(仅粘贴部分内容,全代码可见链接)

    class EchoTextHandler(ChatbotHandler):

    """处理文本回声"""

    def __init__(self, knowledge_base, logger: logging.Logger = None):

    super().__init__()

    self.knowledge_base = knowledge_base

    self.logger = logger if logger else logging.getLogger()

    async def process(self, callback: dingtalk_stream.CallbackMessage):

    """处理回调消息"""

    incoming_message = dingtalk_stream.ChatbotMessage.from_dict(callback.data)

    text = incoming_message.text.content.strip()

    self.logger.info(f'收到消息: {text}')

    \# 去掉@机器人的名字,以免影响查询

    query = text.replace('@自动问答', '').strip() if '@自动问答' in text else text

    self.logger.info(f'处理后的查询: {query}')

    response = find_best_match(query, self.knowledge_base)
  4. 运行main.py即可