mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-10-29 20:05:25 +08:00
Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -1077,6 +1077,14 @@
|
||||
"zh/articles/langbot-cloud-multi-user-workspaces"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "在线体验",
|
||||
"pages": [
|
||||
"zh/articles/langbot-wecom-customer-service-knowledge-base",
|
||||
"zh/articles/langbot-telegram-sandbox-agent",
|
||||
"zh/articles/langbot-wechat-official-account"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "技术解析",
|
||||
"pages": [
|
||||
|
||||
@@ -11,4 +11,4 @@ Collected at: https://blog.thelazy.top/tags/langbot
|
||||
|
||||
## 🥰 Community
|
||||
|
||||
Join our community on Discord: [](https://discord.gg/wdNEHETs87)
|
||||
Join our community on Discord: [Discord](https://discord.gg/wdNEHETs87)
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 341 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 197 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 303 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 110 KiB |
@@ -11,4 +11,4 @@ description: "LangBot コミュニティリソース:オープンソース AI
|
||||
|
||||
## 🥰 コミュニティ
|
||||
|
||||
Discordコミュニティに参加してください: [](https://discord.gg/wdNEHETs87)
|
||||
Discordコミュニティに参加してください: [Discord](https://discord.gg/wdNEHETs87)
|
||||
|
||||
@@ -4,6 +4,7 @@ import path from "node:path";
|
||||
import test from "node:test";
|
||||
import { unified } from "unified";
|
||||
import remarkParse from "remark-parse";
|
||||
import { zhOnlyArticleRoutes } from "./article-routes.mjs";
|
||||
|
||||
const root = path.resolve(import.meta.dirname, "..");
|
||||
const output = process.env.AGENT_TEST_OUTPUT ?? path.join(root, "dist/public");
|
||||
@@ -22,7 +23,7 @@ function links(node, result = []) {
|
||||
}
|
||||
|
||||
test("every sitemap page has meaningful canonical Markdown and HTML discovery", async () => {
|
||||
assert.equal(urls.length, 506);
|
||||
assert.equal(urls.length, 506 + zhOnlyArticleRoutes.length);
|
||||
for (const url of urls) {
|
||||
const route = relative(url);
|
||||
const text = await read(`${route}.md`);
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
export const zhOnlyArticleRoutes = [
|
||||
"articles/langbot-telegram-sandbox-agent",
|
||||
"articles/langbot-wechat-official-account",
|
||||
"articles/langbot-wecom-customer-service-knowledge-base",
|
||||
];
|
||||
@@ -3,6 +3,7 @@ import { createHash } from "node:crypto";
|
||||
import { existsSync, readFileSync, statSync } from "node:fs";
|
||||
import path from "node:path";
|
||||
import test from "node:test";
|
||||
import { zhOnlyArticleRoutes } from "./article-routes.mjs";
|
||||
|
||||
const root = path.resolve(import.meta.dirname, "..");
|
||||
const docs = JSON.parse(readFileSync(path.join(root, "docs.json"), "utf8"));
|
||||
@@ -12,6 +13,11 @@ const localeConfig = {
|
||||
zh: { language: "cn", tab: "文章" },
|
||||
ja: { language: "jp", tab: "記事" },
|
||||
};
|
||||
const extraArticlePages = {
|
||||
en: [],
|
||||
zh: zhOnlyArticleRoutes.map((route) => `zh/${route}`),
|
||||
ja: [],
|
||||
};
|
||||
|
||||
test("all canonical Blog slugs are published in every Wiki locale", () => {
|
||||
const slugsByLocale = new Map();
|
||||
@@ -24,14 +30,23 @@ test("all canonical Blog slugs are published in every Wiki locale", () => {
|
||||
assert.deepEqual(slugsByLocale.get("ja"), slugsByLocale.get("en"));
|
||||
});
|
||||
|
||||
test("article tabs group every generated page exactly once", () => {
|
||||
test("article tabs group every generated Blog page exactly once", () => {
|
||||
for (const [locale, config] of Object.entries(localeConfig)) {
|
||||
const language = docs.navigation.languages.find((item) => item.language === config.language);
|
||||
const matchingTabs = language.tabs.filter((item) => item.tab === config.tab);
|
||||
assert.equal(matchingTabs.length, 1, `${locale} must have exactly one ${config.tab} tab`);
|
||||
const tab = matchingTabs[0];
|
||||
const pages = tab.groups.flatMap((group) => group.pages).filter((page) => page !== `${locale}/articles/index`);
|
||||
const expected = manifest.articles.filter((article) => article.locale === locale).map((article) => article.page);
|
||||
const manifestPages = manifest.articles
|
||||
.filter((article) => article.locale === locale)
|
||||
.map((article) => article.page);
|
||||
const extras = extraArticlePages[locale];
|
||||
assert.deepEqual(
|
||||
extras.filter((page) => manifestPages.includes(page)),
|
||||
[],
|
||||
`${locale} extra article pages must not overlap with the synchronized manifest`,
|
||||
);
|
||||
const expected = [...new Set(manifestPages.concat(extras))];
|
||||
assert.deepEqual([...pages].sort(), [...expected].sort());
|
||||
assert.equal(new Set(pages).size, pages.length, `${locale} has duplicate article navigation entries`);
|
||||
}
|
||||
|
||||
@@ -170,8 +170,8 @@ test("MDX compatibility normalization removes internal .html route suffixes", ()
|
||||
test("canonical MDX and nested OpenAPI sources are discovered", async () => {
|
||||
const docs = JSON.parse(await readFile(path.join(root, "docs.json"), "utf8"));
|
||||
const pages = await collectMdxDocuments(root);
|
||||
assert.equal(pages.length, 329);
|
||||
assert.deepEqual(Object.fromEntries([...pages.reduce((acc, page) => acc.set(page.split("/", 1)[0], (acc.get(page.split("/", 1)[0]) ?? 0) + 1), new Map()).entries()]), { en: 105, zh: 119, ja: 105 });
|
||||
assert.equal(pages.length, 332);
|
||||
assert.deepEqual(Object.fromEntries([...pages.reduce((acc, page) => acc.set(page.split("/", 1)[0], (acc.get(page.split("/", 1)[0]) ?? 0) + 1), new Map()).entries()]), { en: 105, zh: 122, ja: 105 });
|
||||
assert.deepEqual(collectOpenApiSources(docs), [
|
||||
{ locale: "en", source: "openapi/service-api-en.json", directory: "en/api-reference" },
|
||||
{ locale: "zh", source: "openapi/service-api-zh.json", directory: "zh/api-reference" },
|
||||
@@ -216,9 +216,9 @@ test("prebuild is deterministic and preserves local assets and SEO files", async
|
||||
const first = await prepareFumapress({ root, outRoot: temp });
|
||||
const second = await prepareFumapress({ root, outRoot: temp });
|
||||
assert.deepEqual(first, second);
|
||||
assert.equal(first.documents, 329);
|
||||
assert.equal(first.documents, 332);
|
||||
assert.equal(first.fallbackDefaults, 0);
|
||||
assert.equal(first.localeOnlyDocuments, 14);
|
||||
assert.equal(first.localeOnlyDocuments, 17);
|
||||
assert.equal(first.redirects, 103);
|
||||
assert.deepEqual(first.locales, ["en", "zh", "ja"]);
|
||||
await readFile(path.join(temp, "content/docs/insight/guide.mdx"), "utf8");
|
||||
|
||||
@@ -3,6 +3,7 @@ import { access, readdir, readFile, stat } from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
import test from "node:test";
|
||||
import { collectMdxDocuments } from "../scripts/prepare-fumapress.mjs";
|
||||
import { zhOnlyArticleRoutes } from "./article-routes.mjs";
|
||||
|
||||
const root = path.resolve(import.meta.dirname, "..");
|
||||
const publicRoot = path.join(root, "dist/public");
|
||||
@@ -45,7 +46,7 @@ function staticHtmlForUrlPath(urlPath) {
|
||||
|
||||
test("all canonical localized documents have static HTML", async () => {
|
||||
const documents = await collectMdxDocuments(root);
|
||||
assert.equal(documents.length, 329);
|
||||
assert.equal(documents.length, 332);
|
||||
const missing = [];
|
||||
for (const document of documents) {
|
||||
try {
|
||||
@@ -204,6 +205,7 @@ test("canonical sitemap preserves legacy routes and includes current documents",
|
||||
legacy.add(`/${locale}/usage/platforms/mattermost`);
|
||||
legacy.add(`/${locale}/plugin/certified-plugins`);
|
||||
}
|
||||
for (const route of zhOnlyArticleRoutes) legacy.add(`/zh/${route}`);
|
||||
const sitemap = await readFile(path.join(publicRoot, "sitemap.xml"), "utf8");
|
||||
const actual = new Set([...sitemap.matchAll(/<loc>https:\/\/langbot\.app\/docs(\/[^<]+)<\/loc>/g)]
|
||||
.map((match) => decodeURIComponent(match[1]).replace(/\/$/, "")));
|
||||
@@ -217,6 +219,7 @@ test("canonical sitemap preserves legacy routes and includes current documents",
|
||||
const locales = ["en", "zh", "ja"];
|
||||
const hreflangByLocale = { en: "en", zh: "zh-CN", ja: "ja" };
|
||||
const zhOnlyRoutes = [
|
||||
...zhOnlyArticleRoutes,
|
||||
"develop/adapter/discord/README",
|
||||
"develop/adapter/discord/api_reference",
|
||||
"develop/adapter/discord/design",
|
||||
@@ -353,7 +356,7 @@ test("the Chinese quick-start navigation keeps the incumbent troubleshooting pag
|
||||
assert.doesNotMatch(sidebar, /href="\/docs\/zh\/develop\/adapter\/discord\/troubleshooting"/);
|
||||
});
|
||||
|
||||
test("the exact 14 zh-only sources publish no fallback en or ja routes", async () => {
|
||||
test("the exact 17 zh-only sources publish no fallback en or ja routes", async () => {
|
||||
const documents = await collectMdxDocuments(root);
|
||||
const byLocale = Object.fromEntries(locales.map((locale) => [
|
||||
locale,
|
||||
|
||||
@@ -35,6 +35,6 @@ test("every localized HTML payload includes the preference client provider", asy
|
||||
}
|
||||
}
|
||||
for (const locale of ["en", "zh", "ja"]) await visit(path.join(root, locale));
|
||||
// 506 canonical content pages plus one framework 404 page per locale.
|
||||
assert.equal(count, 509);
|
||||
// 509 canonical content pages plus one framework 404 page per locale.
|
||||
assert.equal(count, 512);
|
||||
});
|
||||
|
||||
@@ -9,6 +9,12 @@ description: "同步自 LangBot Blog 的产品动态、技术解析、教程、
|
||||
|
||||
- [LangBot Cloud 新版上线:多用户 Workspace 也来到开源版](/zh/articles/langbot-cloud-multi-user-workspaces) — 2026-08-25
|
||||
|
||||
## 在线体验
|
||||
|
||||
- [企业微信客服:体验 LangBot 知识库](/zh/articles/langbot-wecom-customer-service-knowledge-base) — 2026-09-17
|
||||
- [Telegram:体验 LangBot 沙箱 Agent](/zh/articles/langbot-telegram-sandbox-agent) — 2026-09-17
|
||||
- [LangBot 公众号:体验基础 AI 问答](/zh/articles/langbot-wechat-official-account) — 2026-09-17
|
||||
|
||||
## 技术解析
|
||||
|
||||
- [LangBot v4.10.0:Agent 沙箱与技能——让 Agent 真正像开发者一样工作](/zh/articles/langbot-v4100-sandbox-skills) — 2026-06-04
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
---
|
||||
title: "Telegram:体验 LangBot 沙箱 Agent"
|
||||
description: "通过 Telegram 与 LangBot 沙箱 Agent 对话,让 AI 运行命令、处理文件、编写代码并完成实际任务。"
|
||||
---
|
||||
|
||||
发布于 2026-09-17 · 作者:LangBot Team
|
||||
|
||||
普通 AI 对话只能告诉你“应该怎么做”,连接沙箱后的 LangBot Agent 则可以在隔离工作区中真正执行任务。
|
||||
|
||||
你可以直接在 Telegram 中描述目标,让 Agent 运行命令、创建文件、修改内容、搜索资料或执行代码,再把结果返回给你。
|
||||
|
||||

|
||||
|
||||
## 不只是回答,而是动手完成
|
||||
|
||||
沙箱为 Agent 提供了一个可以操作的工作区。根据你的要求,它可以:
|
||||
|
||||
- 运行 Shell 命令
|
||||
- 读取工作区中的文件
|
||||
- 创建或覆盖文件
|
||||
- 修改已有文件内容
|
||||
- 按文件名查找文件
|
||||
- 搜索文件中的文字
|
||||
- 执行 Python 等代码
|
||||
- 启动并管理任务进程
|
||||
|
||||
整个过程通过 Telegram 对话完成,不需要在聊天窗口和命令行之间反复切换。
|
||||
|
||||
## 可以让它做什么
|
||||
|
||||
### 处理文本和文件
|
||||
|
||||
你可以让 Agent 创建或整理文件:
|
||||
|
||||
- 帮我生成一份项目 README
|
||||
- 把这段内容整理成 Markdown
|
||||
- 创建一个包含标题和表格的报告
|
||||
- 查找工作区中所有包含某个关键词的文件
|
||||
- 修改配置文件中的指定参数
|
||||
|
||||
Agent 会在工作区中完成操作,并告诉你处理结果。
|
||||
|
||||
### 编写和运行代码
|
||||
|
||||
你可以直接描述一个小程序或数据处理任务:
|
||||
|
||||
- 写一个 Python 脚本统计 CSV 中每一列的平均值
|
||||
- 生成 100 条测试数据并保存为 JSON
|
||||
- 检查这段代码为什么运行失败
|
||||
- 创建一个简单的网页并启动预览
|
||||
- 运行测试并根据错误修改代码
|
||||
|
||||
连接沙箱后,Agent 不仅能生成代码,还能实际运行命令并根据结果继续处理。
|
||||
|
||||
### 分析工作区内容
|
||||
|
||||
当工作区中已有文件时,可以让 Agent 帮你快速定位信息:
|
||||
|
||||
- 列出当前目录下的所有 Markdown 文件
|
||||
- 搜索哪些文件使用了某个函数
|
||||
- 找出配置文件中重复的字段
|
||||
- 读取日志并归纳最常见的错误
|
||||
|
||||
它会使用文件查找和内容搜索工具完成这些任务。
|
||||
|
||||
## 如何描述任务
|
||||
|
||||
任务越明确,Agent 越容易给出符合预期的结果。建议同时说明目标、输入和输出格式。
|
||||
|
||||
例如,不要只说:
|
||||
|
||||
> 帮我处理这个文件。
|
||||
|
||||
可以说得更具体:
|
||||
|
||||
> 读取工作区中的 sales.csv,按月份统计销售额,将结果保存为 summary.csv,并告诉我销售额最高的月份。
|
||||
|
||||
如果任务包含多个步骤,也可以一次完整说明。Agent 会根据执行结果继续推进,并在必要时向你确认信息。
|
||||
|
||||
## 关于沙箱
|
||||
|
||||
沙箱是 Agent 的独立执行环境,用于降低运行命令和处理文件时对其他环境的影响。不同会话的文件是否共享,取决于当前沙箱的作用域设置。
|
||||
|
||||
请不要在对话中发送密码、API Key、身份证件或其他敏感信息。对于删除文件、批量修改和长时间运行等操作,建议先明确范围,并在执行前确认。
|
||||
|
||||
## 在 LangBot Cloud 部署 Telegram 沙箱 Agent
|
||||
|
||||
LangBot Cloud 已经准备好托管环境、公网访问地址和沙箱,不需要购买服务器、安装 Docker 或配置运行时。开始前只需准备一个 Telegram 账号。
|
||||
|
||||
### 1. 创建 LangBot Cloud 实例
|
||||
|
||||
1. 打开 [LangBot Cloud](https://cloud.langbot.app),登录 LangBot Account。
|
||||
2. 为机器人选择一个名称。这个名称也会成为实例的 `.langbot.cloud` 访问地址。
|
||||
3. 选择当前可用的体验版、免费版或订阅套餐。不同套餐的可用平台、资源和自动休眠规则以页面显示为准。
|
||||
4. 确认配置并部署。实例通常会在 1 到 2 分钟内完成初始化。
|
||||
5. 状态变为**运行中**后,点击**打开机器人**进入 LangBot 控制台。
|
||||
|
||||
Cloud 会为实例提供可直接使用的 LangBot Models 及一定的模型积分。你也可以在**模型**页面接入自己的模型 API Key。
|
||||
|
||||
### 2. 配置沙箱 Agent 流水线
|
||||
|
||||
进入**流水线**页面,打开默认流水线或创建一条新流水线,然后在 **AI 能力**中:
|
||||
|
||||
1. 将运行器选择为**内置 Agent**。
|
||||
2. 选择一个支持工具调用的模型。接入自有模型时,需要同时启用模型的**工具使用能力**。
|
||||
3. 确认沙箱已启用。Cloud 已经配置好沙箱后端,无需额外安装。
|
||||
4. 选择沙箱作用域。个人私聊建议使用**每个会话**;多人群聊且需要隔离文件时,建议使用**每个用户**。
|
||||
5. 保存流水线,并在**对话调试**中让 Agent 执行一个简单任务,例如“用 Python 计算 1 到 100 的和”。
|
||||
|
||||
如果 Agent 只返回代码但没有执行,请检查模型是否支持工具调用、是否启用了工具使用能力,以及流水线运行器是否为内置 Agent。
|
||||
|
||||
### 3. 在 Telegram 创建机器人
|
||||
|
||||
1. 打开 [BotFather](https://t.me/botfather),发送 `/newbot`。
|
||||
2. 按提示设置机器人名称和以 `bot` 结尾的用户名。
|
||||
3. 保存 BotFather 返回的 API Token,不要将它发送给其他人。
|
||||
4. 如果机器人需要读取群聊中的普通消息,在 BotFather 中执行 `/setprivacy`,选择该机器人并关闭 Privacy Mode;只用于私聊时可以保持默认设置。
|
||||
|
||||
### 4. 将 Telegram 接入 LangBot
|
||||
|
||||
回到 LangBot 控制台,进入**机器人**页面并创建机器人:
|
||||
|
||||
1. 平台选择 **Telegram**。
|
||||
2. 填入 BotFather 提供的 API Token。
|
||||
3. 绑定前面配置好的内置 Agent 流水线。
|
||||
4. 保存并启用机器人。
|
||||
|
||||
打开 Telegram,进入刚创建的机器人会话并点击 **Start**,发送:
|
||||
|
||||
> 请用 Python 生成一份包含 20 条示例数据的 CSV 文件,并统计其中数值列的平均值。
|
||||
|
||||
Agent 能执行命令、创建文件并返回统计结果,就说明模型、沙箱、流水线和 Telegram 接入均已配置成功。完整配置项可继续参考 [Telegram 接入文档](/zh/usage/platforms/telegram)和[沙箱文档](/zh/usage/sandbox/readme)。如有私有部署要求,再参考 [Docker 部署文档](/zh/deploy/langbot/docker)。
|
||||
|
||||
## 扫码开始体验
|
||||
|
||||
使用 Telegram 扫描下方二维码,打开 LangBot 沙箱 Agent 后直接发送任务。
|
||||
|
||||

|
||||
|
||||
如果不知道从哪里开始,可以先试试:
|
||||
|
||||
> 请用 Python 生成一份包含 20 条示例数据的 CSV 文件,并统计其中数值列的平均值。
|
||||
@@ -0,0 +1,145 @@
|
||||
---
|
||||
title: "LangBot 公众号:体验基础 AI 问答"
|
||||
description: "通过 LangBot 公众号进行基础 AI 问答,并获取产品动态、使用教程和应用实践。"
|
||||
---
|
||||
|
||||
发布于 2026-09-17 · 作者:LangBot Team
|
||||
|
||||
LangBot 是一个开源的 AI 机器人平台,可以将大模型、知识库、Agent、插件和工作流连接到企业微信、Telegram、飞书、钉钉、QQ、Discord 等消息平台。
|
||||
|
||||
关注 **LangBot 公众号**,不仅可以了解产品更新、使用方法和真实应用实践,还可以直接发送消息,体验基础 AI 问答服务。
|
||||
|
||||
## 直接使用基础 AI 问答
|
||||
|
||||
在公众号中发送问题,即可与 LangBot 进行基础对话。例如:
|
||||
|
||||
- 帮我解释一个技术概念
|
||||
- 把这段文字概括成三句话
|
||||
- 帮我写一封简短的邮件
|
||||
- 为一个活动想几个标题
|
||||
- 翻译或润色一段内容
|
||||
- 给我一些学习或工作建议
|
||||
|
||||
公众号适合日常咨询、内容生成、翻译润色和一般知识问答,打开微信即可使用。
|
||||
|
||||
## 三个入口有什么区别
|
||||
|
||||
公众号提供的是**基础 AI 问答**,当前不接入企业知识库,也不提供沙箱工具。请根据需要选择对应入口:
|
||||
|
||||
| 入口 | 提供的能力 | 适合的问题 |
|
||||
| --- | --- | --- |
|
||||
| LangBot 公众号 | 基础 AI 问答 | 日常咨询、写作、总结、翻译和一般知识问答 |
|
||||
| 企业微信客服 | LangBot 知识库 | 查询产品手册、价格政策、实施流程、公司制度和会议纪要 |
|
||||
| Telegram | LangBot 沙箱 Agent | 运行代码和命令、创建或修改文件、处理数据和完成多步骤任务 |
|
||||
|
||||
如果需要查询企业资料,请使用[企业微信客服知识库](/zh/articles/langbot-wecom-customer-service-knowledge-base)。如果需要让 Agent 执行命令、处理文件或运行代码,请使用[Telegram 沙箱 Agent](/zh/articles/langbot-telegram-sandbox-agent)。
|
||||
|
||||
## 你可以看到什么
|
||||
|
||||
### 产品动态
|
||||
|
||||
了解 LangBot 新版本带来的能力,包括模型支持、知识库、Agent 沙箱、Skills、插件系统和平台适配等更新。
|
||||
|
||||
每次重要版本发布后,公众号会用更容易理解的方式介绍新功能能解决什么问题,以及适合哪些使用场景。
|
||||
|
||||
### 使用教程
|
||||
|
||||
从部署 LangBot 到接入消息平台,从配置模型到使用知识库,公众号会持续发布可直接参考的教程。
|
||||
|
||||
内容包括:
|
||||
|
||||
- 快速部署 LangBot
|
||||
- 接入企业微信、Telegram、飞书和钉钉
|
||||
- 配置 GPT、Claude、Gemini、DeepSeek 等模型
|
||||
- 创建企业知识库问答机器人
|
||||
- 使用 Agent 沙箱执行任务
|
||||
- 安装和使用插件
|
||||
- 连接 Dify、n8n、Langflow 等外部工作流
|
||||
|
||||
### 应用案例
|
||||
|
||||
你可以了解 LangBot 在不同场景中的使用方式:
|
||||
|
||||
- 企业知识库与内部问答
|
||||
- 微信客服与售前咨询
|
||||
- 群聊 AI 助手
|
||||
- 文件处理和代码执行 Agent
|
||||
- 客户支持与故障排查
|
||||
- 工作流自动化
|
||||
|
||||
这些案例可以帮助你判断 LangBot 是否适合自己的团队,也可以作为搭建机器人时的参考。
|
||||
|
||||
### 社区精选
|
||||
|
||||
LangBot 社区持续产生新的插件、用法和解决方案。公众号会整理值得关注的项目进展、社区实践和优秀案例,帮助你更快发现可以直接使用的能力。
|
||||
|
||||
## 在 LangBot Cloud 部署微信公众号 AI 助手
|
||||
|
||||
LangBot Cloud 自带公网域名和 HTTPS,不需要购买服务器、安装 Docker 或配置反向代理。开始前只需准备一个可登录[微信公众平台](https://mp.weixin.qq.com/)的公众号。
|
||||
|
||||
### 1. 创建 LangBot Cloud 实例
|
||||
|
||||
1. 打开 [LangBot Cloud](https://cloud.langbot.app),登录 LangBot Account。
|
||||
2. 为机器人选择一个名称。这个名称也会成为实例的 `.langbot.cloud` 访问地址。
|
||||
3. 选择支持微信公众号的套餐,确认价格、资源和消息平台范围后继续。
|
||||
4. 确认配置并部署。实例通常会在 1 到 2 分钟内完成初始化。
|
||||
5. 状态变为**运行中**后,点击**打开机器人**进入 LangBot 控制台。
|
||||
|
||||
### 2. 配置模型和流水线
|
||||
|
||||
进入 LangBot 控制台的**模型**页面:
|
||||
|
||||
1. Cloud 会提供可直接使用的 LangBot Models 及一定的模型积分;也可以添加自己的模型供应商、Base URL 和 API Key。
|
||||
2. 选择或添加一个对话模型。
|
||||
3. 进入**流水线**页面,打开默认流水线。
|
||||
4. 在 **AI 能力**中选择**内置 Agent**和刚添加的模型,然后保存。
|
||||
5. 使用**对话调试**发送一条消息,确认模型可以正常回复。
|
||||
|
||||
只有调试对话成功后再继续接入公众号,这样出现问题时更容易区分是模型配置还是微信回调配置导致的。
|
||||
|
||||
### 3. 获取公众号开发配置
|
||||
|
||||
登录微信公众平台,进入**设置与开发 > 开发接口管理**:
|
||||
|
||||
1. 记录公众号的 `AppID` 和 `AppSecret`。
|
||||
2. 按微信公众平台要求配置 IP 白名单。Cloud 实例需要填写的出口 IP 以实例或平台页面显示的信息为准。
|
||||
3. 打开服务器配置,准备一个自定义 `Token`,并生成 `EncodingAESKey`。
|
||||
4. 将消息加解密方式选择为**安全模式**。
|
||||
|
||||
`AppSecret`、`Token` 和 `EncodingAESKey` 都属于敏感信息,不要放进截图、公开仓库或聊天记录。
|
||||
|
||||
### 4. 在 LangBot 创建公众号机器人
|
||||
|
||||
进入 LangBot 控制台的**机器人**页面,创建一个**微信公众号**机器人,然后:
|
||||
|
||||
1. 填入 `AppID`、`AppSecret`、`Token` 和 `EncodingAESKey`。
|
||||
2. `Mode` 选择 `drop` 时,公众号直接返回模型回答,但必须在微信规定的 15 秒内完成。
|
||||
3. 模型响应可能超过 15 秒时,建议选择 `passive`;用户会先收到等待提示,再发送任意文字获取结果。
|
||||
4. 绑定前面配置好的流水线,将 `enable` 设为 `true`,保存并启用机器人。
|
||||
5. 从机器人配置页面复制 Webhook 回调地址。
|
||||
|
||||
### 5. 完成微信回调验证
|
||||
|
||||
回到微信公众平台的服务器配置,粘贴 LangBot 生成的完整 Webhook 地址。Cloud 地址已经配置好公网 HTTPS,形式类似:
|
||||
|
||||
```text
|
||||
https://你的实例名.langbot.cloud/bots/xxxxx
|
||||
```
|
||||
|
||||
确认微信公众平台和 LangBot 两边填写的 `Token`、`EncodingAESKey` 及加密模式完全一致,然后保存并启用服务器配置。微信提示保存成功,说明回调验证已经通过。
|
||||
|
||||
最后关注公众号并发送一条测试消息。如果回调验证失败,请优先检查 IP 白名单、Webhook 地址以及两端的 `Token`、`EncodingAESKey` 和加密模式是否一致。更多截图和字段说明见[微信公众号接入文档](/zh/usage/platforms/wxoa)。如有私有部署要求,再参考 [Docker 部署文档](/zh/deploy/langbot/docker)。
|
||||
|
||||
## 关注并开始问答
|
||||
|
||||
在微信中搜索 **LangBot** 公众号并关注。进入公众号后直接发送消息,即可开始基础 AI 问答。
|
||||
|
||||
也可以使用微信扫描下方二维码关注:
|
||||
|
||||

|
||||
|
||||
你还可以访问以下资源了解 LangBot:
|
||||
|
||||
- [LangBot GitHub](https://github.com/langbot-app/LangBot)
|
||||
- [LangBot 官方文档](https://langbot.app/docs)
|
||||
- [LangBot Cloud](https://cloud.langbot.app)
|
||||
@@ -0,0 +1,175 @@
|
||||
---
|
||||
title: "企业微信客服:体验 LangBot 知识库"
|
||||
description: "通过企业微信客服,用自然语言查询产品、价格、服务流程、公司制度和最新业务信息。"
|
||||
---
|
||||
|
||||
发布于 2026-09-17 · 作者:LangBot Team
|
||||
|
||||
产品有几个版本?学校客户能参加优惠吗?客户签约后应该先做什么?去杭州出差能报销多少住宿费?
|
||||
|
||||
这些问题的答案通常分散在产品手册、销售政策、实施流程、员工制度和会议纪要中。现在,你不必逐份查找文档,直接在微信里向 LangBot 知识库提问即可。
|
||||
|
||||

|
||||
|
||||
## 知识库里有什么
|
||||
|
||||
当前 LangBot 知识库汇集了企业日常使用的多类资料,包括:
|
||||
|
||||
- 客户案例:记录不同行业、团队规模、使用平台和方案选择
|
||||
- 产品手册:介绍产品功能、版本区别、适用人数和部署方式
|
||||
- 销售政策:包含标准价格、活动规则和适用条件
|
||||
- 实施流程:说明签约交接、实施周期、测试和上线要求
|
||||
- 故障处理手册:提供问题分级、排查顺序和处理方法
|
||||
- 报销标准与员工制度:包含差旅住宿、交通、请假和费用报销规则
|
||||
- 会议纪要:记录产品计划、功能调整和最新业务信息
|
||||
|
||||
知识库支持导入 **PDF、Word、Markdown** 等多种常用文档格式。不同部门可以直接使用已有资料建立知识库,不必把所有内容重新整理成固定问答。
|
||||
|
||||

|
||||
|
||||
## 像聊天一样查询企业资料
|
||||
|
||||
打开企业微信客服后,直接说出你想知道的事情。你不需要记住文件名,也不需要使用固定格式。
|
||||
|
||||
可以这样问:
|
||||
|
||||
- 200 人的公司应该购买哪个版本?
|
||||
- 企业微信最低需要哪个版本?
|
||||
- 学校客户 9 月购买专业版,可以享受 88 折吗?
|
||||
- 客户昨天刚签合同,今天应该做什么?
|
||||
- 机器人突然不回复,应该先检查什么?
|
||||
- 去杭州出差,酒店最多可以报销多少?
|
||||
- 企业微信新版文件解析什么时候上线?
|
||||
|
||||
LangBot 知识库会从相关资料中寻找依据,再把答案整理成容易理解的回复。
|
||||
|
||||
## 一个问题可以包含多个条件
|
||||
|
||||
你也可以把完整需求一次说清楚。例如:
|
||||
|
||||
> 我们有一个 260 人的教育客户,希望使用飞书,9 月份上线,还希望参加本月优惠。应该推荐哪个版本?有哪些风险?
|
||||
|
||||
面对这类问题,LangBot 知识库会同时参考产品版本、人数限制、行业政策、活动规则和类似客户案例,而不是只回答其中一个条件。
|
||||
|
||||
如果客户还要求数据本地存储,也可以继续追问:
|
||||
|
||||
> 客户要求数据必须保存在本地,版本选择会发生变化吗?
|
||||
|
||||
LangBot 知识库会结合私有化部署要求给出补充说明。
|
||||
|
||||
## 查询产品和价格
|
||||
|
||||
你可以询问产品能力、版本区别、适用人数和标准价格:
|
||||
|
||||
- 基础版、专业版和企业版有什么区别?
|
||||
- 专业版最多支持多少人?
|
||||
- 哪个版本支持 API?
|
||||
- 哪个版本支持私有化部署?
|
||||
- 专业版的标准价格是多少?
|
||||
|
||||
## 查询交付和故障处理
|
||||
|
||||
LangBot 知识库也可以根据实施流程和故障处理手册回答:
|
||||
|
||||
- SaaS 标准实施通常需要几个工作日?
|
||||
- 正式上线前至少需要完成哪些测试?
|
||||
- 知识库准确率只有 82%,建议上线吗?
|
||||
- 单一客户完全不可用属于什么故障级别?
|
||||
- API 连续失败几次后需要升级?
|
||||
|
||||
## 查询公司制度和最新消息
|
||||
|
||||
除了产品资料,你还可以查询员工制度和会议决定:
|
||||
|
||||
- 去上海出差的住宿标准是多少?
|
||||
- 出差结束后多久需要提交报销?
|
||||
- 某项功能的最新上线日期是什么时候?
|
||||
|
||||
当正式手册和最新会议纪要涉及同一件事时,LangBot 知识库会结合更新后的信息回答,帮助你减少使用旧资料的情况。
|
||||
|
||||
## 在 LangBot Cloud 部署企业微信客服知识库
|
||||
|
||||
LangBot Cloud 会托管运行环境,并提供企业微信回调所需的公网域名和 HTTPS。开始前请准备:
|
||||
|
||||
- 已完成企业认证并开通[微信客服](https://kf.weixin.qq.com/kf)的企业微信账号
|
||||
- 用于问答的 PDF、Word 或 Markdown 文档
|
||||
|
||||
### 1. 创建 LangBot Cloud 实例
|
||||
|
||||
1. 打开 [LangBot Cloud](https://cloud.langbot.app),登录 LangBot Account。
|
||||
2. 为机器人选择一个名称。这个名称也会成为实例的 `.langbot.cloud` 访问地址。
|
||||
3. 选择支持企业微信客服的套餐,确认价格、资源和消息平台范围后继续。
|
||||
4. 确认配置并部署。实例通常会在 1 到 2 分钟内完成初始化。
|
||||
5. 状态变为**运行中**后,点击**打开机器人**进入 LangBot 控制台。
|
||||
|
||||
### 2. 配置对话模型和嵌入模型
|
||||
|
||||
进入 LangBot 控制台的**模型**页面:
|
||||
|
||||
1. Cloud 会提供可直接使用的 LangBot Models 及一定的模型积分;也可以添加自己的模型供应商、Base URL 和 API Key。
|
||||
2. 选择或添加一个对话模型,用于根据检索结果生成最终回答。
|
||||
3. 准备一个嵌入模型,用于将文档和问题转换为向量。可以添加供应商提供的 Embedding 模型,也可以选择零配置的 `chroma-内置`。
|
||||
|
||||
先在流水线的**对话调试**中确认对话模型能正常回复,再继续创建知识库。
|
||||
|
||||
### 3. 创建并填充知识库
|
||||
|
||||
进入**知识库**页面,点击**创建知识库**:
|
||||
|
||||
1. 填写知识库名称和说明。
|
||||
2. 选择已安装的 RAG 引擎。不同引擎的参数不同,使用内置方案时按页面提示选择刚才准备的嵌入模型。
|
||||
3. 设置分块参数;首次使用可以先保留默认值,后续再根据文档结构和检索效果调整。
|
||||
4. 创建完成后进入知识库的**文档**页面,上传 PDF、Word 或 Markdown 文件。
|
||||
5. 等待解析和索引完成,确认文档状态正常后再测试问答。
|
||||
|
||||
建议先上传少量具有明确答案的资料,并用几个可以从原文核对的问题验证效果。资料中如有过期制度或互相冲突的版本,应先清理或标明生效日期。
|
||||
|
||||
### 4. 将知识库绑定到流水线
|
||||
|
||||
进入**流水线**页面,编辑默认流水线或创建一条客服专用流水线:
|
||||
|
||||
1. 在 **AI 能力**中将运行器选择为**内置 Agent**。
|
||||
2. 选择已经配置好的对话模型。
|
||||
3. 在知识库选项中勾选刚创建的知识库。
|
||||
4. 如已配置 Rerank 模型,可以同时启用重排序并设置 Top-K;这一步是可选的。
|
||||
5. 保存后进入**对话调试**,提出一个只能从上传文档中找到答案的问题。
|
||||
|
||||
回答能够引用文档中的有效信息后,再进行企业微信接入。知识库创建和检索参数的完整说明见[知识库文档](/zh/usage/knowledge/readme)。
|
||||
|
||||
### 5. 准备企业微信客服配置
|
||||
|
||||
登录[企业微信客服后台](https://kf.weixin.qq.com/kf):
|
||||
|
||||
1. 在**企业信息**中记录企业 ID。
|
||||
2. 进入**开发配置**并点击**开始使用**。
|
||||
3. 生成并保存 `Token` 和 `EncodingAESKey`。
|
||||
4. 暂时保留该页面,稍后需要填写 LangBot 生成的 Webhook URL,并复制企业微信生成的 `Secret`。
|
||||
|
||||
`Secret`、`Token` 和 `EncodingAESKey` 都属于敏感信息,不要公开或提交到代码仓库。
|
||||
|
||||
### 6. 在 LangBot 创建企业微信客服机器人
|
||||
|
||||
进入 LangBot 控制台的**机器人**页面,创建一个**企业微信客服**机器人:
|
||||
|
||||
1. 填入企业 ID、`Token` 和 `EncodingAESKey`。
|
||||
2. 首次保存时 `Secret` 可先填写临时值。
|
||||
3. 绑定前面配置好的知识库流水线,保存并启用机器人。
|
||||
4. 从机器人配置页面复制完整的 Webhook 回调地址。Cloud 已经为 `.langbot.cloud` 地址配置好公网 HTTPS,无需替换域名。
|
||||
|
||||
回到企业微信客服后台,将该 URL 填入开发配置并保存。验证成功后,复制企业微信页面生成的 `Secret`,再回到 LangBot 用真实 `Secret` 替换临时值并保存。
|
||||
|
||||
### 7. 创建客服账号并验收
|
||||
|
||||
在企业微信客服后台进入**客服账号**,创建一个客服账号并获取对外服务入口。使用普通微信打开该入口,发送一个知识库测试问题。
|
||||
|
||||
如果能够收到依据上传文档生成的回答,说明企业微信回调、客服机器人、流水线和知识库均已连通。如果企业微信无法保存回调 URL,请优先检查 Webhook 地址以及两端的 `Token` 和 `EncodingAESKey` 是否一致。更多字段截图见[企业微信客服接入文档](/zh/usage/platforms/wecom/wecomcs)。如有私有部署要求,再参考 [Docker 部署文档](/zh/deploy/langbot/docker)。
|
||||
|
||||
## 扫码开始体验
|
||||
|
||||
使用微信扫描下方二维码,进入企业微信客服后即可直接提问。
|
||||
|
||||

|
||||
|
||||
如果不知道从哪里开始,可以先发送:
|
||||
|
||||
> 给我介绍一下产品手册。
|
||||
Reference in New Issue
Block a user