AilingBot - 一站式解决方案,为你的IM机器人接入AI强大能力。
AilingBot是一个开源的工程开发框架,同时也是IM机器人接入AI模型的一站式解决方案。通过AilingBot你可以:
- ☕零代码使用:快速将现有AI大模型能力接入主流IM机器人(如企业微信、飞书、钉钉、Slack等),实现通过IM机器人与AI大模型交互以完成业务需求。目前内置了多轮对话和文档知识问答两种能力,未来将内置更多能力
- 🛠️二次开发:AilingBot提供了一套清晰的工程架构、接口定义和必需基础组件,无需从头开始重复开发大模型服务的工程框架,只需实现自己Chat Policy,并通过一些简单的配置,就能完成端到端的AI模型对IM机器人的赋能。同时也支持通过开发自己的Channel扩展到你自己的端(如自己的IM、Web应用或移动端应用)
- 💯开源&免费:完全开源且免费
- 📦开箱即用:无需开发,预置接入现有主流IM及AI模型的能力
- 🔗LangChain友好:方便集成LangChain
- 🧩模块化:项目采用模块化组织,模块之间通过抽象协议依赖,同类模块实现协议即可即插即用
- 💻可扩展:可以扩展AilingBot的使用场景和能力。例如接入到新的IM,新的AI模型,或者定制自己的对话策略
- 🔥高性能:AilingBot采用基于协程的异步模式,提高系统的高并发性能。同时可以通过多进程进一步提升系统的高并发处理能力
- 🔌通过API集成:AilingBot提供一组清晰的API接口,方便与其他系统及流程集成协同
下面将看到如何通过AilingBot快速启动一个基于命令行界面的AI机器人,效果如图:
💡首先你需要有一个OpenAI API key。如果没有参考互联网上相关资料获取
git clone https://github.com/ericzhang-cn/ailingbot.git ailingbot
cd ailingbot
docker build -t ailingbot .
docker run -it --rm \
-e AILINGBOT_POLICY__LLM__OPENAI_API_KEY={你的OpenAI API key} \
ailingbot poetry run ailingbot chat
pip install ailingbot
ailingbot init --silence --overwrite
此时在当前目录会创建一个叫settings.toml的文件,这个文件就是AilingBot的配置文件。 接下来修改必要配置,启动机器人只需一项配置,找到settings.toml中以下部分:
[policy.llm]
_type = "openai"
model_name = "gpt-3.5-turbo"
openai_api_key = ""
temperature = 0
将其中openai_api_key
的值改为你的真实OpenAI API key。
通过如下命令启动机器人:
ailingbot chat
git clone https://github.com/ericzhang-cn/ailingbot.git ailingbot
cd ailingbot
docker build -t ailingbot .
docker run -it --rm \
-e AILINGBOT_POLICY__LLM__OPENAI_API_KEY={你的OpenAI API key} \
-p 8080:8080 \
ailingbot poetry run ailingbot api
pip install ailingbot
与启动命令行机器人做法相同。
通过如下命令启动机器人:
ailingbot api
此时在浏览器输入 http://localshot:8080/docs
即可看到API文档。(如是非本地启动,请输入 http://{你的公网IP}:8080/docs
)
请求示例如下:
curl -X 'POST' \
'http://localhost:8080/chat/' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"text": "你好"
}'
得到响应:
{
"type": "text",
"conversation_id": "default_conversation",
"uuid": "afb35218-2978-404a-ab39-72a9db6f303b",
"ack_uuid": "3f09933c-e577-49a5-8f56-fa328daa136f",
"receiver_id": "anonymous",
"scope": "user",
"meta": {},
"echo": {},
"text": "你好!很高兴和你聊天。有什么我可以帮助你的吗?",
"reason": null,
"suggestion": null
}
下面演示如何快速将上面的机器人接入企业微信。
git clone https://github.com/ericzhang-cn/ailingbot.git ailingbot
cd ailingbot
docker build -t ailingbot .
docker run -d \
-e AILINGBOT_POLICY__NAME=conversation \
-e AILINGBOT_POLICY__HISTORY_SIZE=5 \
-e AILINGBOT_POLICY__LLM__OPENAI_API_KEY={你的OpenAI API key} \
-e AILINGBOT_CHANNEL__NAME=wechatwork \
-e AILINGBOT_CHANNEL__CORPID={你的企业微信机器人corpid} \
-e AILINGBOT_CHANNEL__CORPSECRET={你的企业微信机器人corpsecret} \
-e AILINGBOT_CHANNEL__AGENTID={你的企业微信机器人agentid} \
-e AILINGBOT_CHANNEL__TOKEN={你的企业微信机器人webhook token} \
-e AILINGBOT_CHANNEL__AES_KEY={你的企业微信机器人webhook aes_key} \
-p 8080:8080 \
ailingbot poetry run ailingbot serve
pip install ailingbot
ailingbot init --silence --overwrite
打开settings.toml
,将其中的下面部分填入你的企业微信应用真实信息:
[channel]
name = "wechatwork"
corpid = "" # 填写真实信息
corpsecret = "" # 填写真实信息
agentid = 0 # 填写真实信息
token = "" # 填写真实信息
aes_key = "" # 填写真实信息
在llm中填入你的OpenAI API Key:
[policy.llm]
_type = "openai"
model_name = "gpt-3.5-turbo"
openai_api_key = "" # 这里填入真实OpenAI API Key
temperature = 0
ailingbot serve
最后我们需要去企业微信的管理后台,将webhook地址配置好,以便企业微信知道将接收到的用户消息转发到我们的webhook。
Webhook的URL为:http(s)://你的公网IP:8080/webhook/wechatwork/event/
完成以上配置后,就可以在企业微信中找到机器人,进行对话了:
下面演示如何快速将上面的机器人接入飞书,并启用一个新的对话策略:上传文档并针对文档进行知识问答。
git clone https://github.com/ericzhang-cn/ailingbot.git ailingbot
cd ailingbot
docker build -t ailingbot .
docker run -d \
-e AILINGBOT_POLICY__NAME=document_qa \
-e AILINGBOT_POLICY__CHUNK_SIZE=1000 \
-e AILINGBOT_POLICY__CHUNK_OVERLAP=0 \
-e AILINGBOT_POLICY__LLM__OPENAI_API_KEY={你的OpenAI API key} \
-e AILINGBOT_POLICY__LLM__MODEL_NAME=gpt-3.5-turbo-16k \
-e AILINGBOT_CHANNEL__NAME=feishu \
-e AILINGBOT_CHANNEL__APP_ID={你的飞书机器人app id} \
-e AILINGBOT_CHANNEL__APP_SECRET={你的飞书机器人app secret} \
-e AILINGBOT_CHANNEL__VERIFICATION_TOKEN={你的飞书机器人webhook verification token} \
-p 8080:8080 \
ailingbot poetry run ailingbot serve
pip install ailingbot
ailingbot init --silence --overwrite
打开settings.toml
,将其中的channel部分改为如下,并填入你的飞书真实信息:
[channel]
name = "feishu"
app_id = "" # 填写真实信息
app_secret = "" # 填写真实信息
verification_token = "" # 填写真实信息
将policy部分替换为文档问答策略:
[policy]
name = "document_qa"
chunk_size = 1000
chunk_overlap = 5
最后建议在使用文档问答策略时,使用16k模型,因此将policy.llm.model_name
修改为如下配置:
[policy.llm]
_type = "openai"
model_name = "gpt-3.5-turbo-16k" # 这里改为gpt-3.5-turbo-16k
openai_api_key = "" # 填写真实信息
temperature = 0
ailingbot serve
最后我们需要去飞书的管理后台,将webhook地址配置好。
飞书Webhook的URL为:http(s)://你的公网IP:8080/webhook/feishu/event/
完成以上配置后,就可以在飞书中找到机器人,进行对话了:
下面演示如何快速将上面的机器人接入钉钉。
git clone https://github.com/ericzhang-cn/ailingbot.git ailingbot
cd ailingbot
docker build -t ailingbot .
docker run -d \
-e AILINGBOT_POLICY__NAME=conversation \
-e AILINGBOT_POLICY__HISTORY_SIZE=5 \
-e AILINGBOT_POLICY__LLM__OPENAI_API_KEY={你的OpenAI API key} \
-e AILINGBOT_CHANNEL__NAME=dingtalk \
-e AILINGBOT_CHANNEL__APP_KEY={你的钉钉机器人app key} \
-e AILINGBOT_CHANNEL__APP_SECRET={你的钉钉机器人app secret} \
-e AILINGBOT_CHANNEL__ROBOT_CODE={你的钉钉机器人robot code} \
-p 8080:8080 \
ailingbot poetry run ailingbot serve
pip install ailingbot
ailingbot init --silence --overwrite
打开settings.toml
,将其中的channel部分改为如下,并填入你的飞书真实信息:
[channel]
name = "dingtalk"
app_key = "" # 填写真实信息
app_secret = "" # 填写真实信息
robot_code = "" # 填写真实信息
ailingbot serve
最后我们需要去钉钉的管理后台,将webhook地址配置好。
钉钉Webhook的URL为:http(s)://你的公网IP:8080/webhook/dingtalk/event/
完成以上配置后,就可以在钉钉中找到机器人,进行对话了:
下面演示如何快速将上面的机器人接入Slack,并启用文档知识问答策略。
git clone https://github.com/ericzhang-cn/ailingbot.git ailingbot
cd ailingbot
docker build -t ailingbot .
docker run -d \
-e AILINGBOT_POLICY__NAME=document_qa \
-e AILINGBOT_POLICY__CHUNK_SIZE=1000 \
-e AILINGBOT_POLICY__CHUNK_OVERLAP=0 \
-e AILINGBOT_POLICY__LLM__OPENAI_API_KEY={你的OpenAI API key} \
-e AILINGBOT_POLICY__LLM__MODEL_NAME=gpt-3.5-turbo-16k \
-e AILINGBOT_CHANNEL__NAME=slack \
-e AILINGBOT_CHANNEL__VERIFICATION_TOKEN={你的Slack App webhook verification token} \
-e AILINGBOT_CHANNEL__OAUTH_TOKEN={你的Slack App oauth token} \
-p 8080:8080 \
ailingbot poetry run ailingbot serve
pip install ailingbot
ailingbot init --silence --overwrite
打开settings.toml
,将其中的channel部分改为如下,并填入你的飞书真实信息:
[channel]
name = "slack"
verification_token = "" # 填写真实信息
oauth_token = "" # 填写真实信息
将policy部分替换为文档问答策略:
[policy]
name = "document_qa"
chunk_size = 1000
chunk_overlap = 5
最后建议在使用文档问答策略时,使用16k模型,因此将policy.llm.model_name
修改为如下配置:
[policy.llm]
_type = "openai"
model_name = "gpt-3.5-turbo-16k" # 这里改为gpt-3.5-turbo-16k
openai_api_key = "" # 填写真实信息
temperature = 0
ailingbot serve
最后我们需要去Slack的管理后台,将webhook地址配置好。
飞书Webhook的URL为:http(s)://你的公网IP:8080/webhook/slack/event/
完成以上配置后,就可以在Slack中找到机器人,进行对话了:
AilingBot的主要处理流程如下图:
- 首先用户将消息发送给IM的机器人
- 如果配置了webhook,即时通讯工具会将发送给机器人的请求转发到webhook服务地址
- Webhook服务将IM原始消息经过处理,转为AilingBot内部的消息格式,发送给ChatBot
- ChatBot会根据所配置的会话策略(Chat Policy),处理请求并形成响应消息。这个过程中,ChatBot 可能会进行请求大语言模型、访问向量数据库、调用外部API等操作以完成请求处理
- ChatBot将响应信息发送给IM Agent,IM Agent负责将AilingBot内部响应信息格式转换成 特定IM的格式,并调用IM开放能力API发送响应消息
- IM机器人将消息显示给用户,完成整个处理过程
- IM机器人:多数即时通讯工具内置的能力,允许管理员创建一个机器人,并通过程序处理用户的消息
- Channel:Channel表示不同终端,可以是一个IM,也可能是一个自定义终端(如Web)
- Webhook:一个http(s)服务,用于接收IM机器人转发的用户消息,不同Channel对于webhook有自己的规范,因此需要有自己的webhook实现
- IM Agent:用于调用IM开放能力API,不同的IM开放能力API不同,因此每个Channel需要有对应Agent实现
- ChatBot:用于接收和响应用户消息的核心组件
- 会话策略:具体定义如何响应用户,被ChatBot调用。一个会话策略具体定义了机器人的能力,如闲聊、进行知识问答等
- LLM:大语言模型,如何OpenAI的ChatGPT,开放的ChatGLM等均属于不同的大语言模型,大语言模型是实现AI能力的关键组件
AilingBot的配置可以通过两种方式:
- 通过配置文件:AilingBot读取当前目录的
settings.toml
作为配置文件,其文件格式为TOML 具体配置项见下文 - 通过环境变量:AilingBot也会读取环境变量中配置项,具体环境变量列表见下文
💡配置文件和环境变量可以混合使用,当一个配置项同时存在于两者时,优先使用环境变量
所有配置,TOML配置键和环境变量有如下映射关系:
- 所有环境变量以
AILINGBOT_
开头 - 层级之间用两个下划线
__
隔开 - 配置键内部的下划线在环境变量中保留
- 不区分大小写
例如:
some_conf
的对应环境变量为AILINGBOT_SOME_CONF
some_conf.conf_1
的对应环境变量为AILINGBOT_SOME_CONF__CONF_1
some_conf.conf_1.subconf
的对应环境变量为AILINGBOT_SOME_CONF__CONF_1__SUBCONF
配置项 | 说明 | TOML | 环境变量 |
---|---|---|---|
语言 | 语言码(参考:http://www.lingoes.net/en/translator/langcode.htm) | lang | AILINGBOT_LANG |
时区 | 时区码(参考:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones | tz | AILINGBOT_TZ |
会话策略名称 | 预置会话策略名称或完整会话策略class路径 | policy.name | AILINGBOT_POLICY__NAME |
Channel名称 | 预置Channel名称 | channel.name | AILINGBOT_CHANNEL__NAME |
Webhook路径 | 非预置Channel webhook的完整class路径 | channel.webhook_name | AILINGBOT_CHANNEL__WEBHOOK_NAME |
Agent路径 | 非预置Channel agent的完整class路径 | channel.agent_name | AILINGBOT_CHANNEL__AGENT_NAME |
Uvicorn配置 | 所有uvicorn配置(参考:uvicorn settings),这部分配置会透传给uvicorn | uvicorn.* | AILINGBOT_UVICORN__* |
配置示例:
lang = "zh_CN"
tz = "Asia/Shanghai"
[policy]
name = "conversation"
# 更多policy配置
[policy.llm]
# 模型配置
[channel]
name = "wechatwork"
# 更多channel配置
[uvicorn]
host = "0.0.0.0"
port = 8080
conversation使用LangChain的Conversation作为会话策略,其效果为直接和LLM对话,且带有对话历史上下文,因此可以进行多轮会话。
配置项 | 说明 | TOML | 环境变量 |
---|---|---|---|
会话历史长度 | 表示保留多少轮历史会话 | policy.history_size | AILINGBOT_POLICY__HISTORY_SIZE |
配置示例:
# 使用conversation策略,保留5轮历史会话
[policy]
name = "conversation"
history_size = 5
document_qa使用LangChain的Stuff作为对话策略。 用户可上传一个文档,然后针对文档内容进行提问。
配置项 | 说明 | TOML | 环境变量 |
---|---|---|---|
文档切分块大小 | 对应LangChain Splitter的chunk_size | policy.chunk_size | AILINGBOT_POLICY__CHUNK_SIZE |
文档切重叠 | 对应LangChain Splitter的chunk_overlap | policy.chunk_overlap | AILINGBOT_POLICY__CHUNK_OVERLAP |
配置示例:
# 使用document_qa策略,chunk_size和chunk_overlap分别配置为1000和0
[policy]
name = "document_qa"
chunk_size = 1000
chunk_overlap = 0
模型配置与LangChain保持一致,下面给出示例。
[policy.llm]
_type = "openai" # 对应环境变量AILINGBOT_POLICY__LLM___TYPE
model_name = "gpt-3.5-turbo" # 对应环境变量AILINGBOT_POLICY__LLM__MODEL_NAME
openai_api_key = "sk-pd8******************************HQQS241dNrHH1kv" # 对应环境变量AILINGBOT_POLICY__LLM__OPENAI_API_KEY
temperature = 0 # 对应环境变量AILINGBOT_POLICY__LLM__TEMPERATURE
配置项 | 说明 | TOML | 环境变量 |
---|---|---|---|
Corp ID | 企业微信自建app的corpid | channel.corpid | AILINGBOT_CHANNEL__CORPID |
Corp Secret | 企业微信自建app的corpsecret | channel.corpsecret | AILINGBOT_CHANNEL__CORPSECRET |
Agent ID | 企业微信自建app的agentid | channel.agentid | AILINGBOT_CHANNEL__AGENTID |
TOKEN | 企业微信自建app的webhook token | channel.token | AILINGBOT_CHANNEL__TOKEN |
AES KEY | 企业微信自建app的webhook aes key | channel.aes_key | AILINGBOT_CHANNEL__AES_KEY |
配置示例:
[channel]
name = "wechatwork"
corpid = "wwb**********ddb40"
corpsecret = "TG3t******************************hZslJNe5Q"
agentid = 1000001
token = "j9SK**********zLeJdFSYh"
aes_key = "7gCwzwH******************************p1p0O8"
配置项 | 说明 | TOML | 环境变量 |
---|---|---|---|
App ID | 飞书自建应用的app id | channel.app_id | AILINGBOT_CHANNEL__APP_ID |
App Secret | 飞书自建应用的app secret | channel.app_secret | AILINGBOT_CHANNEL__APP_SECRET |
Verification Token | 飞书自建应用的webhook verification token | channel.verification_token | AILINGBOT_CHANNEL__VERIFICATION_TOKEN |
配置示例:
[channel]
name = "feishu"
app_id = "cli_a**********9d00e"
app_secret = "y********************cyk8AxmYVDD"
verification_token = "yIJ********************7bfNHUcYH"
配置项 | 说明 | TOML | 环境变量 |
---|---|---|---|
App Key | 钉钉自建应用的app key | channel.app_key | AILINGBOT_CHANNEL__APP_KEY |
App Secret | 钉钉自建应用的app secret | channel.app_secret | AILINGBOT_CHANNEL__APP_SECRET |
Robot Code | 钉钉自建应用的robot code | channel.robot_code | AILINGBOT_CHANNEL__ROBOT_CODE |
配置示例:
[channel]
name = "dingtalk"
app_key = "dingi**********wymdr"
app_secret = "ombrcUp****************************************GL2AwObLjILUY1MzD"
robot_code = "ding**********owymdr"
配置项 | 说明 | TOML | 环境变量 |
---|---|---|---|
Verification Token | Slack应用的verification token | channel.verification_token | AILINGBOT_CHANNEL__VERIFICATION_TOKEN |
OAuth token | Slack应用的oauth token | channel.oauth_token | AILINGBOT_CHANNEL__OAUTH_TOKEN |
配置示例:
[channel]
name = "slack"
verification_token = "HzBGs1**********39gZG2P0"
oauth_token = "xoxb-2**********27-5**********23-if**********H1QEGUItx2Yz"
init
命令将在当前目录生成配置文件settings.toml。默认情况下,将以交互方式询问用户,
可以使用--silence
让生成过程不询问用户,直接使用默认配置。
Usage: ailingbot init [OPTIONS]
Initialize the AilingBot environment.
Options:
--silence Without asking the user.
--overwrite Overwrite existing file if a file with the same name already
exists.
--help Show this message and exit.
Option | 说明 | 类型 | 备注 |
---|---|---|---|
--silence | 不询问用户,直接生成默认配置 | Flag | |
--overwrite | 允许覆盖当前目录的settings.toml | Flag |
config
命令将读取当前环境的配置(包括配置文件及环境变量配置,并进行合并)。
Usage: ailingbot config [OPTIONS]
Show current configuration information.
Options:
-k, --config-key TEXT Configuration key.
--help Show this message and exit.
Option | 说明 | 类型 | 备注 |
---|---|---|---|
-k, --config-key | 配置键 | String | 不传入的话,显示完整配置信息 |
chat
命令启动一个交互式命令行机器人,用于测试当前chat policy。
Usage: ailingbot chat [OPTIONS]
Start an interactive bot conversation environment.
Options:
--debug Enable debug mode.
--help Show this message and exit.
Option | 说明 | 类型 | 备注 |
---|---|---|---|
--debug | 开启debug模式 | Flag | Debug模式将输出更多内容,如prompt |
serve
命令启动Webhook HTTP server,用于真正实现和具体IM进行交互。
Usage: ailingbot serve [OPTIONS]
Run webhook server to receive events.
Options:
--log-level [TRACE|DEBUG|INFO|SUCCESS|WARNING|ERROR|CRITICAL]
The minimum severity level from which logged
messages should be sent to(read from
environment variable AILINGBOT_LOG_LEVEL if
is not passed into). [default: TRACE]
--log-file TEXT STDOUT, STDERR, or file path(read from
environment variable AILINGBOT_LOG_FILE if
is not passed into). [default: STDERR]
--help Show this message and exit.
Option | 说明 | 类型 | 备注 |
---|---|---|---|
--log-level | 显示日志级别,将显示此级别及以上的日志 | String | 默认显示所有级别(TRACE) |
--log-file | 日志输出位置 | String | 默认情况日志打印到标准错误(STDERR) |
api
命令启动API HTTP server。
Usage: ailingbot api [OPTIONS]
Run endpoint server.
Options:
--log-level [TRACE|DEBUG|INFO|SUCCESS|WARNING|ERROR|CRITICAL]
The minimum severity level from which logged
messages should be sent to(read from
environment variable AILINGBOT_LOG_LEVEL if
is not passed into). [default: TRACE]
--log-file TEXT STDOUT, STDERR, or file path(read from
environment variable AILINGBOT_LOG_FILE if
is not passed into). [default: STDERR]
--help Show this message and exit.
Option | 说明 | 类型 | 备注 |
---|---|---|---|
--log-level | 显示日志级别,将显示此级别及以上的日志 | String | 默认显示所有级别(TRACE) |
--log-file | 日志输出位置 | String | 默认情况日志打印到标准错误(STDERR) |
TBD
TBD
TBD
TBD
- 由于企业微信不支持上传文件事件的回调,因此企业微信暂时不能使用内置的document_qa策略
- 各个IM的webhook需要公网IP,如果你暂时没有,可以考虑通过"内网穿透"方案在本地测试,具体方法请参考网上资料
- 我们预期chat policy应该是无状态的,状态应该保存在外部,但是具体实现时policy仍然有可能存在本地状态(如在本地变量中存储了对话历史)。因此当uvicorn有多个worker进程时,由于没一个进程都有单独的chat
policy实例,所以这些本地状态无法共享,而同一个用户的请求可能会被不同worker响应,因此导致预期之外的行为。要避免这种行为,请保证一下两个条件至少有一个被满足:
- Chat policy不使用本地状态
- 只启动一个uvicorn worker
- 提供完善的使用文档和开发者文档
- 支持更多的Channel
- 企业微信
- 飞书
- 钉钉
- Slack
- 更多请求消息类型的支持
- 文本请求
- 图片请求
- 文件请求
- 更多响应消息类型的支持
- 文本响应
- 图片响应
- 文件响应
- Markdown响应
- 表格响应
- 开发更多的开箱即用的对话策略
- 多轮会话策略
- 文档问答策略
- 数据库问答策略
- 在线搜索问答策略
- 支持通过HTTP调用独立的对话策略服务
- 基础组件抽象
- 大语言模型
- 知识库
- Tools
- 支持本地模型部署
- ChatGLM-6B
- 支持通过API调用
- Web管理后台及可视化配置管理
- 提供基于Docker容器的部署能力
- 增强系统的可观测性和可治理性
- 完善的测试用例