ChatPilot:模块化本地AI对话应用框架的设计、部署与深度定制指南
1. 项目概述一个面向开发者的本地化AI对话应用框架最近在折腾本地大模型应用部署的时候发现了一个挺有意思的项目叫 ChatPilot。这名字听起来就很有“领航员”的感觉实际上它也确实是一个旨在帮助开发者快速构建和部署本地AI对话应用的框架。简单来说它不是一个现成的、开箱即用的聊天机器人产品而是一个“脚手架”或者说“工具箱”。如果你厌倦了每次都要从零开始搭建Web界面、处理API调用、管理对话历史或者想快速验证一个基于本地大模型的创意应用ChatPilot 提供了一个相当不错的起点。它的核心价值在于“整合”与“简化”。在当前的AI应用开发浪潮中技术栈往往非常复杂前端界面、后端服务、模型推理、向量数据库、提示词工程……每一项都够你研究半天。ChatPilot 试图把这些组件以一种模块化、可配置的方式打包在一起让你能更专注于业务逻辑和模型本身而不是重复造轮子。我花了些时间深入研究了它的代码和设计思路发现它特别适合以下几类人一是想快速搭建一个私有化、可定制AI对话平台的开发者二是希望将大模型能力集成到自己现有系统中的技术团队三是AI爱好者想有一个功能相对完整、代码清晰的项目作为学习和二次开发的模板。项目本身基于 Python 生态前端通常采用现代化的 Web 框架如 Streamlit、Gradio 或自定义前端后端则负责协调模型推理、工具调用、知识库检索等任务。它抽象了常见的操作比如会话管理、流式输出、文件上传处理、插件机制等让你用相对统一的接口去对接不同的开源大模型如 Llama、Qwen、ChatGLM 等和不同的功能模块。接下来我会从设计思路、核心模块、实操部署到深度定制一步步拆解这个项目并分享我在部署和魔改过程中踩过的坑和总结的经验。2. 核心架构与设计哲学解析2.1 模块化与松耦合设计ChatPilot 最值得称道的一点是其清晰的模块化架构。它没有把所有的代码都塞进一个巨大的文件里而是按照功能边界进行了清晰的划分。通常你会看到类似以下的目录结构ChatPilot/ ├── backend/ # 后端核心服务 │ ├── api/ # API路由定义 │ ├── core/ # 核心逻辑对话链、工具调用等 │ ├── models/ # 数据模型定义用户、会话、消息 │ └── services/ # 业务服务模型服务、向量库服务等 ├── frontend/ # 前端界面可能是Streamlit app或独立前端项目 ├── configs/ # 配置文件模型路径、API密钥、参数等 ├── tools/ # 自定义工具函数如天气查询、计算器 └── knowledge_base/ # 知识库相关文档加载、向量化、检索这种结构的好处显而易见。首先可维护性大大提升。当你需要修改对话逻辑时只需关注backend/core/下的相关文件要增加一个新的工具比如股票查询在tools/目录下新增一个模块并在配置中注册即可不会影响到其他功能。其次可替换性强。如果你觉得默认的对话管理方式不够高效可以自己实现一套只要保持接口一致就能无缝替换。最后便于团队协作不同开发者可以专注于不同的模块。这种设计背后的哲学是“约定优于配置”和“关注点分离”。项目提供了一套默认的、经过验证的组件和交互方式约定你不需要在初期纠结于无数个配置项。同时它将用户界面、业务逻辑、数据持久化、模型推理等关注点分离使得每一层都可以独立演进和优化。2.2 配置驱动与灵活性为了适应不同的使用场景和硬件环境ChatPilot 重度依赖配置文件。你很少会在代码里看到写死的模型路径或API密钥它们通常被抽取到configs/config.yaml或.env这样的配置文件中。一个典型的配置片段可能长这样model: name: qwen2.5-7b-instruct path: /path/to/your/models/qwen2.5-7b-instruct-gguf type: llama.cpp # 或 vllm, transformers, api context_length: 8192 server: host: 0.0.0.0 port: 7860 reload: true knowledge_base: enabled: true vector_store: chromadb # 或 faiss, milvus embedding_model: bge-small-zh这种配置驱动的方式带来了极大的灵活性。环境适配在开发机上你可以用一个小模型快速测试在生产服务器上只需修改配置文件指向一个更大的模型或GPU推理服务无需改动代码。功能开关比如知识库检索可能比较耗资源在资源有限的机器上你可以简单地将knowledge_base.enabled设为false来关闭它。多模型支持通过修改model.type和model.path你可以轻松地在 Llama.cpp、vLLM、直接调用 Transformers 库或第三方 API 之间切换框架的核心对话逻辑不需要改变。注意配置文件的版本管理和安全性很重要。务必确保包含敏感信息如API密钥的配置文件不会被提交到公开的代码仓库。通常建议使用.env文件配合python-dotenv加载并将.env加入.gitignore。2.3 对话流与状态管理抽象一个AI对话应用的核心是管理多轮对话的上下文。ChatPilot 抽象了一个清晰的对话流Conversation Flow和状态管理机制。它通常会定义一个Conversation或Session对象其中包含会话ID唯一标识一次对话。消息历史一个由Message对象组成的列表每个Message包含角色user/assistant、内容、时间戳等。元数据如使用的模型、温度参数、系统提示词等。当用户发起一次新的对话或继续一个历史对话时后端服务会根据会话ID加载或创建对应的Conversation对象。将用户的新消息追加到消息历史中。根据配置如是否启用知识库对用户消息进行预处理例如先进行知识检索将检索到的相关内容作为上下文插入。将处理后的消息历史可能经过长度裁剪或总结发送给指定的模型推理服务。以流式Streaming或非流式的方式接收模型回复并实时或一次性更新到前端。将助手的回复追加到消息历史中并持久化存储可选。这个流程被封装在backend/core/conversation_chain.py或类似的模块中。它的高明之处在于将“如何组织对话上下文”与“如何调用模型”解耦了。你可以轻松地实现不同的上下文管理策略比如只保留最近N轮对话或者自动总结历史长对话而不用改动模型调用层。3. 核心模块深度拆解与实操3.1 模型服务层对接多样化的推理后端模型服务层是连接框架与底层AI模型的桥梁。ChatPilot 需要能够灵活地支持多种推理方式这是其通用性的关键。1. 本地模型推理Llama.cpp / Ollama对于完全离线的场景通常使用量化后的GGUF模型文件通过llama-cpp-python库进行推理。这是资源消耗最低、隐私性最好的方式。# 简化的模型加载与服务封装示例 from llama_cpp import Llama class LlamaCppModelService: def __init__(self, model_path, n_ctx2048, n_gpu_layers-1): self.llm Llama( model_pathmodel_path, n_ctxn_ctx, n_gpu_layersn_gpu_layers, # -1 表示所有层都放GPU verboseFalse ) def generate(self, messages, **kwargs): # 将消息列表转换为Llama.cpp需要的格式 prompt self._format_messages(messages) response self.llm.create_chat_completion( messages[{role: user, content: prompt}], streamTrue, **kwargs ) for chunk in response: yield chunk[choices][0][delta].get(content, )实操要点模型选择选择与你的硬件匹配的量化等级。7B模型在16GB内存的电脑上可以运行但推荐使用Q4_K_M或更低的量化以获得更流畅的体验。13B及以上模型需要更多内存。GPU层数n_gpu_layers参数至关重要。如果你的GPU显存足够将其设置为一个较大的值如40可以显著提升推理速度。使用n_gpu_layers-1会尝试将所有层加载到GPU如果显存不足会崩溃需要根据模型大小和显存情况调整。上下文长度n_ctx参数决定了模型能“记住”多长的对话。设置过大会增加内存占用需要权衡。2. 高性能推理服务vLLM / TGI如果你拥有强大的GPU服务器并追求极高的吞吐量和并发能力可以对接 vLLM 或 Text Generation Inference (TGI) 服务。ChatPilot 的后端此时扮演一个“客户端”的角色通过HTTP请求调用远程的推理API。import openai # 使用OpenAI兼容的API client openai.OpenAI( base_urlhttp://localhost:8000/v1, # vLLM 或 TGI 服务地址 api_keytoken-abc123 # 如果服务端需要认证 ) response client.chat.completions.create( modelqwen2.5-7b-instruct, messagesmessages, streamTrue )这种方式将模型加载和推理的压力转移到了专门的推理服务器上Web应用本身变得非常轻量适合多用户的生产环境。3. 第三方APIOpenAI兼容ChatPilot 也可以轻松配置为使用任何提供 OpenAI 兼容 API 的服务包括云服务商的托管模型或者你自己用 FastChat 等框架部署的模型。只需修改配置中的base_url和api_key。经验之谈在实际部署中我推荐采用“本地轻量模型 远程高性能服务”的混合策略。在配置文件中设置一个模型列表和优先级。默认使用本地小模型如Qwen2.5-1.5B进行快速响应和简单对话。当用户的问题涉及复杂推理、代码生成或需要调用知识库时可以自动或手动切换到远程的更大模型如Qwen2.5-72B。这种策略在成本和体验之间取得了很好的平衡。3.2 知识库与检索增强生成RAG集成单纯的对话模型只能基于其训练数据进行回答对于私有、实时或特定领域的信息无能为力。RAGRetrieval-Augmented Generation技术通过引入外部知识库极大地扩展了模型的能力边界。ChatPilot 通常内置或可以方便地集成RAG模块。知识库构建流程文档加载与切分支持.txt,.pdf,.md,.docx等格式。使用langchain或unstructured库的文档加载器。关键步骤是文本切分Text Splitting需要根据文档类型技术文档、小说、论文选择合适的切分策略按字符、按句子、按段落和重叠窗口overlap以保证检索时上下文的完整性。向量化Embedding使用嵌入模型如BGE-small-zh,text-embedding-3-small将文本块转换为高维向量。这一步的计算开销较大建议在后台异步进行或对知识库更新做增量处理。向量存储将向量和对应的原文及元数据存入向量数据库。ChatPilot 常集成 ChromaDB轻量内置、FAISS高性能或 Milvus分布式企业级。检索与生成流程 当用户提问时用同样的嵌入模型将问题转换为向量。在向量数据库中进行相似度搜索如余弦相似度召回最相关的K个文本块。将这些文本块作为“参考依据”与用户原始问题一起构造成一个增强的提示词Prompt发送给大模型。模型基于提供的参考依据生成回答。# 简化的RAG查询示例 def rag_query(user_query, conversation_history, top_k3): # 1. 检索 query_vector embedding_model.encode(user_query) results vector_store.similarity_search_by_vector(query_vector, ktop_k) context \n\n.join([doc.page_content for doc in results]) # 2. 构建增强Prompt system_prompt f你是一个专业的助手请严格根据以下提供的参考信息来回答问题。如果信息不足以回答问题请如实告知。 参考信息 {context} messages [ {role: system, content: system_prompt}, *conversation_history[-5:], # 带上最近的几轮历史 {role: user, content: user_query} ] # 3. 调用模型生成 return model_service.generate(messages)避坑指南检索质量是瓶颈如果检索到的文档不相关模型再强也编不出正确答案。务必花时间优化文本切分策略和嵌入模型的选择。对于中文场景BGE系列嵌入模型通常比通用的多语言模型效果更好。提示词工程如何将检索到的上下文和问题组合成有效的提示词直接影响答案质量。清晰的指令如“严格根据参考信息”和良好的格式用分隔符标明上下文边界非常重要。上下文长度限制检索到的上下文会占用模型的令牌数。需要平衡top_k的值和每个文本块的长度确保总长度不超过模型的上下文窗口。3.3 工具调用Function Calling与插件系统让大模型不仅能说还能“做”是提升其实用性的关键。ChatPilot 通过工具调用机制使模型能够根据对话内容决定调用某个预定义的工具函数来获取信息或执行操作。工具定义与注册 首先你需要以OpenAI Function Calling的格式定义你的工具。tools [ { type: function, function: { name: get_current_weather, description: 获取指定城市的当前天气, parameters: { type: object, properties: { location: { type: string, description: 城市名例如北京上海, }, unit: {type: string, enum: [celsius, fahrenheit]}, }, required: [location], }, }, } ]然后实现这个工具函数def get_current_weather(location: str, unit: str celsius): # 这里可以调用真实的天气API例如和风天气、OpenWeatherMap等 # 返回一个结构化的结果 return { location: location, temperature: 22, unit: unit, forecast: [晴朗, 微风], }模型调用与执行 在对话过程中将工具定义和对话历史一起发送给支持工具调用的模型如 GPT-4, Qwen2.5, DeepSeek 等。response client.chat.completions.create( modelqwen2.5-7b-instruct, messagesmessages, toolstools, tool_choiceauto, # 让模型自己决定是否调用工具 ) response_message response.choices[0].message处理工具调用请求 检查模型的回复中是否包含tool_calls。如果有则解析出要调用的函数名和参数执行对应的工具函数并将执行结果作为新的消息追加到对话历史中再次发送给模型让它生成面向用户的最终回答。if response_message.tool_calls: tool_call response_message.tool_calls[0] function_name tool_call.function.name function_args json.loads(tool_call.function.arguments) # 根据 function_name 找到对应的函数并执行 function_to_call available_functions[function_name] function_response function_to_call(**function_args) # 将工具执行结果加入对话 messages.append(response_message) # 添加包含工具调用的助手消息 messages.append({ role: tool, tool_call_id: tool_call.id, content: json.dumps(function_response), }) # 第二次调用模型让它基于工具结果生成回答 second_response client.chat.completions.create(...)插件系统扩展 基于工具调用的思想ChatPilot 可以设计一个插件系统。每个插件就是一个独立的Python包或模块它必须提供一个get_tools()函数返回其提供的工具列表。工具函数的实现。可选一个初始化函数和配置文件。这样你可以通过安装插件来动态地为你的ChatPilot实例增加新能力比如股票查询、日历管理、发送邮件等而无需修改核心代码。实操心得工具描述description和参数描述至关重要它们是模型理解工具用途的唯一依据。描述必须清晰、准确、无歧义。例如“获取天气”就不如“获取指定城市当前的温度、湿度和天气状况”来得明确。多花时间打磨工具描述能显著提升模型调用工具的准确率。4. 从零开始部署与深度定制实战4.1 环境准备与基础部署假设我们从零开始在一个干净的Linux服务器或本地开发机上部署ChatPilot。第一步获取代码与创建环境# 克隆项目这里以假设的仓库为例 git clone https://github.com/shibing624/ChatPilot.git cd ChatPilot # 创建并激活Python虚拟环境强烈推荐 python -m venv venv source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows # 安装核心依赖 pip install -r requirements.txtrequirements.txt通常包含了fastapi/flask,langchain,chromadb,sentence-transformers,llama-cpp-python等核心库。根据你选择的模型推理后端可能还需要额外安装vllm或transformers。第二步模型准备这是最关键也最耗时的一步。你需要下载合适的模型。方案A推荐新手使用Ollama。Ollama 简化了本地大模型的获取和管理。你可以直接运行ollama pull qwen2.5:7b来下载并运行模型然后ChatPilot配置为调用http://localhost:11434的Ollama API。这是最快捷的方式。方案B追求性能与控制下载GGUF格式的量化模型。可以到 Hugging Face 或 ModelScope 上寻找例如TheBloke/Qwen2.5-7B-Instruct-GGUF。下载.gguf文件到本地目录例如./models/。方案C使用API如果你有云端API如OpenAI, DeepSeek, 通义千问则无需下载模型只需准备好API Key。第三步配置文件调整复制项目提供的配置模板如config.example.yaml到config.yaml并根据你的环境进行修改。# config.yaml 关键部分示例 model: provider: ollama # 可选ollama, llama.cpp, vllm, openai name: qwen2.5:7b # Ollama模型名 或 GGUF文件路径 base_url: http://localhost:11434/api # Ollama API地址 server: host: 0.0.0.0 port: 8000 knowledge_base: enabled: true persist_directory: ./data/chroma_db embedding_model: BAAI/bge-small-zh-v1.5第四步启动服务根据项目结构启动命令可能不同。常见的是# 启动后端API服务 python backend/main.py # 或者如果使用uvicorn uvicorn backend.main:app --host 0.0.0.0 --port 8000 --reload # 在另一个终端启动前端界面如果前端是独立的 cd frontend npm install npm run dev如果项目使用 Streamlit 或 Gradio 作为一体化界面可能只需要运行一个命令如streamlit run app.py。访问http://localhost:8000/docs查看后端API文档访问http://localhost:8000或前端指定的端口如8501即可使用Web界面。4.2 前端界面定制与用户体验优化默认的前端界面可能比较简洁。你可以根据需求进行深度定制。1. 布局与主题修改CSS找到前端项目的样式文件如src/App.css或style.css调整颜色、字体、间距等。如果你想做一个深色主题的科技感界面这是入手点。组件替换如果使用的是 React/Vue 等框架你可以替换消息气泡、输入框、按钮等组件。例如使用mui/material或antd等UI库来获得更现代、一致的视觉体验。2. 增强交互功能消息操作为每条消息添加“复制”、“重新生成”、“编辑重发”按钮。这能极大提升用户体验。对话管理在侧边栏增强对话列表的功能支持对话重命名、搜索、批量删除、导出/导入为JSON格式。参数实时调整在界面上提供滑动条或输入框让用户能实时调整“温度”Temperature、“重复惩罚”Repetition Penalty等关键生成参数并立即看到效果。3. 文件上传与多模态支持虽然核心是文本对话但现代应用常需要处理文件。你可以扩展前端支持上传图像、PDF、Word等文件。前端使用input typefile或相关组件库的上传组件支持多文件、拖拽上传。后端需要增加文件上传的API端点接收文件后根据类型进行处理。例如图片可以用视觉模型如Qwen-VL进行描述或问答PDF/Word则走之前提到的知识库流程提取文本并存入向量库。4. 流式输出优化流式输出能让用户尽快看到回复的第一个词减少等待的焦虑感。优化点包括打字机效果前端以逐字打印的方式显示流式返回的文本。中途停止提供一个“停止生成”按钮当回复不理想或太长时用户可以中断。性能优化确保WebSocket或Server-Sent Events (SSE) 连接稳定处理网络中断重连。4.3 后端能力扩展与集成1. 用户认证与多租户如果希望部署给团队或小范围用户使用添加用户系统是必要的。技术选型可以使用 JWT (JSON Web Tokens) 实现无状态认证。用户登录后后端签发一个Token前端在后续请求的Header中携带。数据库引入 SQLite轻量或 PostgreSQL创建users表存储用户名邮箱、密码哈希、角色等。会话隔离在Conversation模型中增加user_id字段。所有对话的增删改查操作都必须验证当前请求的用户是否有权操作该会话。这样实现了用户数据的完全隔离。2. 数据持久化与审计默认可能使用内存或简单的文件存储对话历史。在生产环境中需要更可靠的方案。对话历史入库将会话和消息存入关系型数据库。这便于实现对话搜索、分页查看、数据备份和导出。操作日志记录用户的重要操作如登录、登出、创建对话、删除对话等用于安全审计和问题排查。3. 集成外部系统ChatPilot 可以作为企业内部的智能助手中枢连接各种内部系统。API网关在后端增加一个路由模块专门用于对接内部系统的API。例如/internal/query_ticket_system可以连接工单系统。自定义工具将这些连接封装成前面提到的“工具”。例如创建一个query_crm工具当用户问“客户张三最近有什么动态”时模型可以调用这个工具去查询CRM系统并返回结果。安全考虑所有对内部系统的调用都必须进行严格的权限校验和参数过滤防止越权访问和注入攻击。5. 性能调优、问题排查与运维指南5.1 性能瓶颈分析与优化部署后随着用户和对话量的增加可能会遇到性能问题。以下是一些常见的瓶颈和优化思路。1. 模型推理速度慢症状每个回复等待时间很长10秒。排查与优化硬件是根本检查CPU/GPU利用率。对于Llama.cpp使用n_gpu_layers将更多层加载到GPU能极大加速。考虑升级显卡。量化等级使用更低比特的量化模型如Q4_K_S vs Q8_0速度会更快但精度略有损失。需要在速度和质量间权衡。批处理如果使用vLLM等推理服务器且有多条并发请求开启批处理Continuous Batching可以显著提升GPU利用率和吞吐量。缓存对于常见、重复的问题如“你好”、“你是谁”可以引入一个简单的回答缓存直接返回结果避免调用模型。2. 知识库检索慢症状开启知识库后回答延迟明显增加。排查与优化向量数据库索引确保向量数据库如Chroma使用了合适的索引如HNSW。首次创建向量库时索引构建可能较慢但查询会很快。嵌入模型嵌入模型本身推理也有开销。可以考虑使用更轻量的嵌入模型或者在CPU上使用ONNX Runtime等优化过的运行时进行推理。检索策略减少每次检索的文本块数量top_k或缩小检索范围例如先按文档类别过滤再进行向量检索。3. Web服务并发能力差症状多用户同时访问时服务响应变慢或出错。排查与优化后端框架如果使用Python确保使用了异步框架如FastAPI uvicorn并正确使用了async/await避免阻塞操作。工作进程通过uvicorn main:app --workers 4启动多个工作进程利用多核CPU。反向代理与负载均衡使用 Nginx 或 Caddy 作为反向代理处理静态文件、SSL加密并可以将请求负载均衡到多个后端实例。无状态设计确保你的服务是无状态的会话状态存储在数据库或Redis中这样才可以轻松地水平扩展增加更多服务器实例。5.2 常见问题与解决方案速查表问题现象可能原因排查步骤与解决方案启动失败提示“ModuleNotFoundError”依赖未安装或虚拟环境未激活。1. 确认已激活虚拟环境 (source venv/bin/activate)。2. 运行pip install -r requirements.txt。模型加载失败提示“CUDA out of memory”GPU显存不足。1. 使用nvidia-smi查看显存占用。2. 换用更小的模型或更低比特的量化版本。3. 减少n_gpu_layers参数让部分层留在CPU。前端能打开但发送消息后无反应或报错后端API服务未启动或端口不对CORS问题。1. 检查后端服务是否在运行 (ps aux知识库检索返回的结果完全不相关嵌入模型不匹配或文本切分不合理。1. 确认构建知识库和查询时使用的是同一个嵌入模型。2. 检查文本切分是否太碎或太长调整chunk_size和chunk_overlap参数。3. 尝试不同的嵌入模型如从text-embedding-ada-002换成BGE。流式输出时前端接收不完整或中断网络不稳定后端流式响应被中间件如Nginx缓冲。1. 检查后端代码是否正确实现了流式响应如使用FastAPI的StreamingResponse。2. 在Nginx配置中为API路径添加proxy_buffering off;指令。工具调用功能不生效模型从不调用工具模型不支持工具调用工具描述不清晰温度参数过高。1. 确认你使用的模型版本支持函数调用如Qwen2.5-7B-Instruct。2. 仔细检查工具定义的description和参数描述确保清晰无歧义。3. 尝试将生成参数中的temperature调低如设为0.1让模型输出更确定。5.3 生产环境部署与监控建议当你准备将ChatPilot部署到生产环境服务真实用户时需要考虑更多。1. 部署方式Docker容器化这是最佳实践。创建Dockerfile和docker-compose.yml将应用、模型或通过卷挂载、数据库打包在一起。这保证了环境一致性便于迁移和扩展。进程管理使用systemd或supervisord来管理你的服务进程确保服务在崩溃后能自动重启。分离服务考虑将前端静态文件、后端API、模型推理服务、向量数据库分别部署。例如用Nginx服务前端用Gunicorn运行后端APIvLLM单独一个容器PostgreSQL和Redis也各自独立。这样便于独立扩展和维护。2. 监控与日志应用日志使用Python的logging模块配置好日志级别INFO, ERROR并输出到文件。使用logrotate管理日志文件大小。系统监控监控服务器的CPU、内存、磁盘、GPU显存使用率。可以使用PrometheusGrafana搭建监控面板。业务指标在代码中埋点记录关键指标如每日活跃用户数、平均对话轮次、平均响应时间、各模型调用次数、工具调用成功率等。这些数据对于了解产品使用情况和优化方向至关重要。3. 安全加固HTTPS使用 Let‘s Encrypt 申请免费SSL证书并通过Nginx配置HTTPS保护数据传输安全。API限流使用slowapi或fastapi-limiter等中间件对API接口进行限流防止恶意刷接口。输入验证与过滤对所有用户输入进行严格的验证和过滤防止Prompt注入攻击用户通过特殊输入诱导模型执行恶意指令和XSS攻击如果前端渲染了模型返回的不安全内容。模型安全如果使用在线API妥善保管API Key并设置使用额度限制。如果使用本地模型也要注意模型文件本身的安全性防止被篡改。经过以上从架构解析到实战部署、从功能定制到运维监控的完整拆解相信你对 ChatPilot 这类本地AI对话应用框架有了更深入的理解。它的价值不在于提供一个完美的最终产品而在于提供了一个高度模块化、可扩展的基石。你可以基于它快速搭建出符合自己特定需求的智能对话应用无论是个人知识管理助手、团队协作机器人还是集成到复杂业务系统中的AI大脑。