RasaGPT - 💬 RasaGPT是第一个建立在Rasa和Langchain之上的无头LLM聊天机器人平台。构建 w/ Rasa, FastAPI, Langchain, LlamaIndex, SQLModel, pgvector, ngrok, telegram

Created at: 2023-04-25 22:33:51
Language: Python
License: MIT

拉萨GPT标志



🏠概述

💬RasaGPT是第一个建立在RasaLangchain之上的无头LLM聊天机器人平台。它是Rasa和Telegram的样板和参考实现,利用像Langchain这样的LLM库进行索引,检索和上下文注入。




RasaGPT 优酷视频



💬什么是拉莎?

用他们自己的话说:

💬Rasa 是一个开源 (Python) 机器学习框架,用于自动化基于文本和语音的对话:NLU、对话管理、连接到 Slack、Facebook 等 - 创建聊天机器人和语音助手


用我的话说:

Rasa是一个非常受欢迎的(我敢说是事实上的吗?)并且易于使用聊天机器人框架,内置的NLU ML管道已经过时,并且是LLM世界中重新设计聊天机器人框架的概念起点。



💁‍♀️为什么选择RasaGPT?

RasaGPT开箱即用。许多实施难题都已解决,因此你不必这样做,包括:

  • 使用 FastAPI 创建你自己的专有机器人端点,包括文档上传和“培训”管道
  • 如何整合 Langchain/LlamaIndex 和 Rasa
  • 库与 LLM 库冲突并传递元数据
  • MacOS 上对运行 Rasa 的 Docker 化支持
  • 通过 ngrok 使用聊天机器人进行反向代理
  • 使用自己的自定义模式实现 pgvector,而不是使用 Langchain 高度固执己见的 PGVector 类
  • 在 Rasa 和你自己的后端/应用程序之间添加多租户(Rasa 本身不支持此功能)、会话和元数据

背景故事很熟悉。一个朋友带着一个问题来找我。我在Google和Github上搜索了LLM与Rasa集成的体面参考实现,但空手而归。我认为这是满足我好奇心的好机会,两天后我有了概念证明,一周后这就是我想出的。


⚠️ 警告:这与生产代码相去甚远,并且充斥着快速注入和一般安全漏洞。我只是希望有人觉得这有用 😊



快速入门

入门很容易,只需确保你满足以下依赖项即可。


⚠️⚠️⚠️ ** 非 MACOS 用户注意: ** 如果你使用的是 Linux 或 Windows,则需要将映像名称从 to 更改为 在 docker-compose.yml 第 #64 行和此处 #1 行的操作 Dockerfile

khalosa/rasa-aarch64:3.5.2
rasa/rasa:latest


# Get the code
git clone https://github.com/paulpierre/RasaGPT.git
cd RasaGPT

## Setup the .env file
cp .env-example .env

# Edit your .env file and add all the necessary credentials
make install

# Type "make" to see more options
make



🔥特征

完整的应用程序和应用程序

  • LLM使用Langchain在任意数据语料库上“学习”
  • 通过 FastAPI 上传文档并“培训”
  • 上传时实施文档版本控制和自动“重新训练”
  • 通过 FastAPISQLModel 自定义你自己的异步端点和数据库模型
  • 机器人确定是否需要人工交接
  • 机器人根据用户问题和响应自动生成标记
  • 包括通过 SwaggerRedoc 的完整 API 文档
  • 包括PGAdmin,因此你可以浏览数据库
  • Ngrok 端点在启动时自动生成,因此始终可以通过
    https://t.me/yourbotname
  • 通过 pgvector 和 Postgres 函数嵌入 Postgres 内置的相似性搜索
  • 包括虚拟数据供你测试和实验
  • 来自帮助台、客户支持、测验、电子学习、龙与地下城等的无限用例

拉莎整合

  • 建立在聊天平台的开源黄金标准Rasa之上
  • 通过 Docker 支持 MacOS M1/M2(规范的 Rasa 镜像缺少 MacOS 架构支持)。)
  • 支持电报,轻松集成Slack,Whatsapp,Line,SMS等。
  • 使用NLU模型设置复杂的对话管道,形成Huggingface(如BERT)或库/框架(如Keras),Tensorflow与OpenAI GPT作为后备

灵活性

  • 扩展代理、内存等。朗链的功能
  • 架构支持多租户、会话、数据存储
  • 自定义座席个性
  • 保存所有聊天记录并从所有交互中创建嵌入,让你的检索策略经得起未来的考验
  • 根据知识库语料库和客户反馈自动生成嵌入



🧑‍💻安装

要求


设置

git clone https://github.com/paulpierre/RasaGPT.git
cd RasaGPT
cp .env-example .env

# Edit your .env file and all the credentials

在任何时候,只需键入即可,它将显示选项列表,这些选项对调试最有用:

make


制作文件主


Docker-compose

最简单的入门方法是在根目录中使用 。它将以正确的顺序安装和运行 RasaGPT 的所有服务。

Makefile

make install

# This will automatically install and run RasaGPT
# After installation, to run again you can simply run

make run

本地蟒蛇环境

如果你希望专注于在 API 之上进行开发,这将非常有用,为此单独制作了一个。这将为你创建一个本地虚拟环境。

Makefile

# Assuming you are already in the RasaGPT directory
cd app/api
make install

# This will automatically install and run RasaGPT
# After installation, to run again you can simply run

make run

同样,输入以查看命令的完整列表

make

生成文件 API


安装过程

安装应该是自动化的,应该如下所示:

安装

👉完整安装日志:https://app.warp.dev/block/vflua6Eue29EPk8EVvW8Kd


Docker 的安装过程在高级别上执行以下步骤

  1. 检查以确保你有空
    .env
  2. 数据库使用 pgvector 初始化
  3. 数据库模型创建数据库架构
  4. 训练 Rasa 模型,使其准备好运行
  5. 使用 Rasa 设置 ngrok,以便 Telegram 有一个网络钩子回到你的 API 服务器
  6. 设置 Rasa 操作服务器,以便 Rasa 可以与 RasaGPT API 通信
  7. 数据库填充虚拟数据通过以下方式
    seed.py



☑️后续步骤


💬开始聊天

可以通过访问 👉 https://t.me/yourbotsname 开始与机器人聊天

电报



👀查看日志

你可以通过访问 https://localhost:9999/👉查看所有日志,该日志将显示所有docker容器的实时日志

晕眩



📖接口文档

通过访问 👉 https://localhost:8888/docs 查看 API 终端节点文档

在此页面中,你可以创建和更新实体,以及将文档上载到知识库。

招摇文档



✏️例子

该机器人只是一个概念验证,尚未针对检索进行优化。它目前使用 1000 个字符长度的分块进行索引,并使用基本的欧几里得距离进行检索,质量是否达到或未命中。

你可以在结果中查看机器人的示例命中和未命中。MD 文件。总的来说,我估计索引优化和LLM配置更改可以将输出质量提高70%以上。


👉点击查看RESULTS中演示数据的问答结果。医学博士



💻API 架构和用法

REST API 很简单,请访问文档 👉 http://localhost:8888/docs

以下实体具有基本的 CRUD 操作并返回 JSON



组织

这可以被认为是一家公司在SaaS /多租户世界中是你的客户。默认情况下,已提供虚拟组织列表

截图 2023-05-05 在 8.45.28 上午.png

[
  {
    "id": 1,
    "uuid": "d2a642e6-c81a-4a43-83e2-22cee3562452",
    "display_name": "Pepe Corp.",
    "namespace": "pepe",
    "bot_url": null,
    "created_at": "2023-05-05T10:42:45.933976",
    "updated_at": "2023-05-05T10:42:45.933979"
  },
  {
    "id": 2,
    "uuid": "7d574f88-6c0b-4c1f-9368-367956b0e90f",
    "display_name": "Umbrella Corp",
    "namespace": "acme",
    "bot_url": null,
    "created_at": "2023-05-05T10:43:03.555484",
    "updated_at": "2023-05-05T10:43:03.555488"
  },
  {
    "id": 3,
    "uuid": "65105a15-2ef0-4898-ac7a-8eafee0b283d",
    "display_name": "Cyberdine Systems",
    "namespace": "cyberdine",
    "bot_url": null,
    "created_at": "2023-05-05T10:43:04.175424",
    "updated_at": "2023-05-05T10:43:04.175428"
  },
  {
    "id": 4,
    "uuid": "b7fb966d-7845-4581-a537-818da62645b5",
    "display_name": "Bluth Companies",
    "namespace": "bluth",
    "bot_url": null,
    "created_at": "2023-05-05T10:43:04.697801",
    "updated_at": "2023-05-05T10:43:04.697804"
  },
  {
    "id": 5,
    "uuid": "9283d017-b24b-4ecd-bf35-808b45e258cf",
    "display_name": "Evil Corp",
    "namespace": "evil",
    "bot_url": null,
    "created_at": "2023-05-05T10:43:05.102546",
    "updated_at": "2023-05-05T10:43:05.102549"
  }
]

项目

这可以被认为是属于公司的产品。你可以查看属于组织的项目列表,如下所示:

组织项目.png

[
  {
    "id": 1,
    "documents": [
      {
        "id": 1,
        "uuid": "92604623-e37c-4935-bf08-0e9efa8b62f7",
        "display_name": "project-pepetamine.md",
        "node_count": 3
      }
    ],
    "document_count": 1,
    "uuid": "44a4b60b-9280-4b21-a676-00612be9aa87",
    "display_name": "Pepetamine",
    "created_at": "2023-05-05T10:42:46.060930",
    "updated_at": "2023-05-05T10:42:46.060934"
  },
  {
    "id": 2,
    "documents": [
      {
        "id": 2,
        "uuid": "b408595a-3426-4011-9b9b-8e260b244f74",
        "display_name": "project-frogonil.md",
        "node_count": 3
      }
    ],
    "document_count": 1,
    "uuid": "5ba6b812-de37-451d-83a3-8ccccadabd69",
    "display_name": "Frogonil",
    "created_at": "2023-05-05T10:42:48.043936",
    "updated_at": "2023-05-05T10:42:48.043940"
  },
  {
    "id": 3,
    "documents": [
      {
        "id": 3,
        "uuid": "b99d373a-3317-4699-a89e-90897ba00db6",
        "display_name": "project-kekzal.md",
        "node_count": 3
      }
    ],
    "document_count": 1,
    "uuid": "1be4360c-f06e-4494-bf20-e7c73a56f003",
    "display_name": "Kekzal",
    "created_at": "2023-05-05T10:42:49.092675",
    "updated_at": "2023-05-05T10:42:49.092678"
  },
  {
    "id": 4,
    "documents": [
      {
        "id": 4,
        "uuid": "94da307b-5993-4ddd-a852-3d8c12f95f3f",
        "display_name": "project-memetrex.md",
        "node_count": 3
      }
    ],
    "document_count": 1,
    "uuid": "1fd7e772-365c-451b-a7eb-4d529b0927f0",
    "display_name": "Memetrex",
    "created_at": "2023-05-05T10:42:50.184817",
    "updated_at": "2023-05-05T10:42:50.184821"
  },
  {
    "id": 5,
    "documents": [
      {
        "id": 5,
        "uuid": "6deff180-3e3e-4b09-ae5a-6502d031914a",
        "display_name": "project-pepetrak.md",
        "node_count": 4
      }
    ],
    "document_count": 1,
    "uuid": "a389eb58-b504-48b4-9bc3-d3c93d2fbeaa",
    "display_name": "PepeTrak",
    "created_at": "2023-05-05T10:42:51.293352",
    "updated_at": "2023-05-05T10:42:51.293355"
  },
  {
    "id": 6,
    "documents": [
      {
        "id": 6,
        "uuid": "2e3c2155-cafa-4c6b-b7cc-02bb5156715b",
        "display_name": "project-memegen.md",
        "node_count": 5
      }
    ],
    "document_count": 1,
    "uuid": "cec4154f-5d73-41a5-a764-eaf62fc3db2c",
    "display_name": "MemeGen",
    "created_at": "2023-05-05T10:42:52.562037",
    "updated_at": "2023-05-05T10:42:52.562040"
  },
  {
    "id": 7,
    "documents": [
      {
        "id": 7,
        "uuid": "baabcb6f-e14c-4d59-a019-ce29973b9f5c",
        "display_name": "project-neurokek.md",
        "node_count": 5
      }
    ],
    "document_count": 1,
    "uuid": "4a1a0542-e314-4ae7-9961-720c2d092f04",
    "display_name": "Neuro-kek",
    "created_at": "2023-05-05T10:42:53.689537",
    "updated_at": "2023-05-05T10:42:53.689539"
  },
  {
    "id": 8,
    "documents": [
      {
        "id": 8,
        "uuid": "5be007ec-5c89-4bc4-8bfd-448a3659c03c",
        "display_name": "org-about_the_company.md",
        "node_count": 5
      },
      {
        "id": 9,
        "uuid": "c2b3fb39-18c0-4f3e-9c21-749b86942cba",
        "display_name": "org-board_of_directors.md",
        "node_count": 3
      },
      {
        "id": 10,
        "uuid": "41aa81a9-13a9-4527-a439-c2ac0215593f",
        "display_name": "org-company_story.md",
        "node_count": 4
      },
      {
        "id": 11,
        "uuid": "91c59eb8-8c05-4f1f-b09d-fcd9b44b5a20",
        "display_name": "org-corporate_philosophy.md",
        "node_count": 4
      },
      {
        "id": 12,
        "uuid": "631fc3a9-7f5f-4415-8283-78ff582be483",
        "display_name": "org-customer_support.md",
        "node_count": 3
      },
      {
        "id": 13,
        "uuid": "d4c3d3db-6f24-433e-b2aa-52a70a0af976",
        "display_name": "org-earnings_fy2023.md",
        "node_count": 5
      },
      {
        "id": 14,
        "uuid": "08dd478b-414b-46c4-95c0-4d96e2089e90",
        "display_name": "org-management_team.md",
        "node_count": 3
      }
    ],
    "document_count": 7,
    "uuid": "1d2849b4-2715-4dcf-aa68-090a221942ba",
    "display_name": "Pepe Corp. (company)",
    "created_at": "2023-05-05T10:42:55.258902",
    "updated_at": "2023-05-05T10:42:55.258904"
  }
]

公文

这可以被视为与产品相关的工件,例如常见问题解答页面或包含财务报表收益的PDF。你可以查看与组织项目关联的所有文档,如下所示:

文件.png

{
  "id": 1,
  "uuid": "44a4b60b-9280-4b21-a676-00612be9aa87",
  "organization": {
    "id": 1,
    "uuid": "d2a642e6-c81a-4a43-83e2-22cee3562452",
    "display_name": "Pepe Corp.",
    "bot_url": null,
    "status": 2,
    "created_at": "2023-05-05T10:42:45.933976",
    "updated_at": "2023-05-05T10:42:45.933979",
    "namespace": "pepe"
  },
  "document_count": 1,
  "documents": [
    {
      "id": 1,
      "uuid": "92604623-e37c-4935-bf08-0e9efa8b62f7",
      "organization_id": 1,
      "project_id": 1,
      "display_name": "project-pepetamine.md",
      "url": "",
      "data": "# Pepetamine\n\nProduct Name: Pepetamine\n\nPurpose: Increases cognitive focus just like the Limitless movie\n\n**How to Use**\n\nPepetamine is available in the form of rare Pepe-coated tablets. The recommended dosage is one tablet per day, taken orally with a glass of water, preferably while browsing your favorite meme forum for maximum cognitive enhancement. For optimal results, take Pepetamine 30 minutes before engaging in mentally demanding tasks, such as decoding ancient Pepe hieroglyphics or creating your next viral meme masterpiece.\n\n**Side Effects**\n\nSome potential side effects of Pepetamine may include:\n\n1. Uncontrollable laughter and a sudden appreciation for dank memes\n2. An inexplicable desire to collect rare Pepes\n3. Enhanced meme creation skills, potentially leading to internet fame\n4. Temporary green skin pigmentation, resembling the legendary Pepe himself\n5. Spontaneously speaking in \"feels good man\" language\n\nWhile most side effects are generally harmless, consult your memologist if side effects persist or become bothersome.\n\n**Precautions**\n\nBefore taking Pepetamine, please consider the following precautions:\n\n1. Do not use Pepetamine if you have a known allergy to rare Pepes or dank memes.\n2. Pepetamine may not be suitable for individuals with a history of humor deficiency or meme intolerance.\n3. Exercise caution when driving or operating heavy machinery, as Pepetamine may cause sudden fits of laughter or intense meme ideation.\n\n**Interactions**\n\nPepetamine may interact with other substances, including:\n\n1. Normie supplements: Combining Pepetamine with normie supplements may result in meme conflicts and a decreased sense of humor.\n2. Caffeine: The combination of Pepetamine and caffeine may cause an overload of energy, resulting in hyperactive meme creation and potential internet overload.\n\nConsult your memologist if you are taking any other medications or substances to ensure compatibility with Pepetamine.\n\n**Overdose**\n\nIn case of an overdose, symptoms may include:\n\n1. Uncontrollable meme creation\n2. Delusions of grandeur as the ultimate meme lord\n3. Time warps into the world of Pepe\n\nIf you suspect an overdose, contact your local meme emergency service or visit the nearest meme treatment facility. Remember, the key to enjoying Pepetamine is to use it responsibly, and always keep in mind the wise words of our legendary Pepe: \"Feels good man.\"",
      "hash": "fdee6da2b5441080dd78e7850d3d2e1403bae71b9e0526b9dcae4c0782d95a78",
      "version": 1,
      "status": 2,
      "created_at": "2023-05-05T10:42:46.755428",
      "updated_at": "2023-05-05T10:42:46.755431"
    }
  ],
  "display_name": "Pepetamine",
  "created_at": "2023-05-05T10:42:46.060930",
  "updated_at": "2023-05-05T10:42:46.060934"
}

节点

尽管这未在 API 中公开,但节点是为其生成嵌入的文档块。节点用于检索搜索以及上下文注入。节点属于文档。


用户

用户表示与机器人交谈的人。用户不一定属于组织或产品,但这种关系在下面的聊天会话中捕获。


聊天会话

不通过 API 公开,但这表示用户和机器人之间的问题和答案。这些对象中的每一个都可以通过自动生成的灵活识别。聊天会话包含可用于训练和优化的丰富元数据。通过端点的聊天会话实际上与组织相关联(出于多租户安全目的)

session_id
/chat



📚工作原理


拉莎

  1. Rasa 处理与通信通道的集成,在本例中为 Telegram。
    • 它专门处理提交用户反馈应通过的目标 Webhook。在我们的例子中,它是我们的 FastAPI 服务器通过
      /webhooks/{channel}/webhook
  2. Rasa 有两个组件,核心 Rasa 应用程序和单独运行的 Rasa 动作服务器
  3. Rasa 必须通过一些 yaml 文件进行配置(已经完成):
    • config.yml - 包含 NLU 管道和策略配置。重要的是设定阈值
      FallbackClassifier
    • credentials.yml - 包含我们的 webhook 和 Telegram 凭证的路径。这将由帮助程序服务通过 app/rasa-credentials/main 进行更新.py
      rasa-credentials
    • domain.yml - 包含聊天入口点逻辑配置,如意图和针对意图执行的操作。在这里,我们添加将触发我们的操作服务器的动作
      action_gpt_fallback
    • endpoints.yml - 这是我们为 Rasa 设置自定义操作端点以触发回退的地方
    • nlu.yml - 这是我们设定意图的地方
      out_of_scope
    • rules.yml - 我们为此意图设置了一个规则,它应该触发操作
      action_gpt_fallback
    • actions.py - 这是我们通过类定义和表达我们的行动的地方。该方法返回我们为上面的意图定义的操作
      ActionGPTFallback
      name
  4. Rasa的NLU模型必须经过训练,这可以通过CLI完成。这是在你运行时自动为你完成的
    rasa train
    make install
  5. 拉萨的核心必须在训练后通过
    rasa run
  6. Rasa 的操作服务器必须单独运行
    rasa run actions

电报

  1. Rasa 使用来自 credentials.yml 的回调 webhook 自动更新 Telegram Bot API。
  2. 默认情况下,这是静态的。由于我们在本地机器上运行,因此我们利用 Ngrok 生成一个可公开访问的 URL 和反向隧道进入我们的 docker 容器
  3. rasa-credentials
    服务部门会为你处理此过程。Ngrok 作为服务运行,准备就绪后调用本地 ngrok API 来检索隧道 URL 并更新文件并为你重新启动 Rasa。
    rasa-credentials
    credentials.yml
  4. webhook Telegram 将发送消息到我们的 FastAPI 服务器。为什么是这个而不是拉莎?因为我们希望灵活地捕获Rasa制作的PITA元数据,并且集中到API服务器是理想的选择
  5. FastAPI 服务器将其转发到 Rasa webhook
  6. 然后,Rasa 将根据用户意图确定要采取的操作。由于此演示的意图已被削弱,因此它将转到运行中的回退操作
    actions.py
  7. 自定义操作将捕获元数据并将响应从 FastAPI 转发给用户

PGVector

pgvector
是Postgres的插件,并自动安装,使你能够存储和计算矢量数据类型。我们有自己的实现,因为 Langchain PGVector 类不能灵活地适应我们的模式,我们需要灵活性。

  1. 默认情况下,在 postgres 中,如果数据库尚未初始化,则容器路径中的任何文件都将运行。在 postgres Dockerfile 中,我们复制create_db.sh为我们的数据库创建数据库和用户
    /docker-entry-initdb.d
  2. Makefilemodels 命令中,我们在 API 容器中运行 models.py,该容器从模型创建表。
  3. enable_vector方法在数据库中启用 pgvector 扩展

朗链

  1. 训练数据加载到数据库中
  2. 如果索引不存在,则数据将被索引并存储在名为 index.json 的文件中
  3. LlamaIndex使用基本来查找相关数据并将其注入提示中。
    GPTSimpleVectorIndex
  4. 通过提示的护栏用于保持对话集中

机器人流

  1. 用户将在电报中聊天,消息将被过滤为现有意图
  2. 如果它检测到没有意图匹配,而是根据 rules.yml 匹配,它将触发操作
    out_of_scope
    action_gpt_fallback
  3. 然后,ActionGPTFallback 函数将调用 FastAPI API 服务器
  4. 使用 LlamaIndex 的 API 将找到相关的索引内容,并将其注入到发送到 OpenAI 进行推理的提示中。
  5. 提示包含对话护栏,包括:
    • 以 JSON 格式返回的请求数据
    • 根据用户的问题创建分类标签
    • 如果对话应升级到人类(如果没有上下文匹配),则返回布尔值



📝待办事项

  • [ ] 编写测试 😅
  • [ ] 实施美洲驼索引优化
  • [ ] 实现聊天记录
  • [ ] 实现查询路由器抽象以了解要使用的搜索策略(单次与几次)
  • [ ] 探索其他索引方法,如树索引、关键字索引
  • [ ] 添加聊天记录以立即调用和设置上下文
  • [ ] 添加具有以下潜在功能的辅助对抗代理(双模式模型):
    • [ ] 确定问题是否已得到解答,如果没有,请重新优化搜索策略
    • [ ] 确保不会发生快速注入
  • [ ] 通过探索以下内容来增加基线相似性搜索:
    • [ ] 根据历史查询定期生成“假”文档嵌入,并通过 HyDE 模式链接到实际文档
    • [ ] 定期根据文档生成“假”用户查询并链接到实际文档,以便用户输入搜索和“假”查询可以更好地匹配



🔍故障 排除

通常,只需转到 👉 http://localhost:9999/ 即可检查 docker 容器日志


恩格罗克问题

始终检查你的 ngrok 和 Telegram 网络钩子是否匹配。只需通过以下方式执行此操作

curl -sS "https://api.telegram.org/bot<your-bot-secret-token>/getWebhookInfo" | json_pp

..应该返回这个:

{
    "ok": true,
    "result": {
        "url": "https://b280-04-115-40-112.ngrok-free.app/webhooks/telegram/webhook",
        "has_custom_certificate": false,
        "pending_update_count": 0,
        "max_connections": 40,
        "ip_address": "1.2.3.4"
    }
}

..应与文件中的 URL 匹配或访问 Ngrok 管理员 UI 👉 http://localhost:4040/status

credentials.yml

ngrok-admin.png


看起来是一场比赛。如果没有,请通过运行以下命令重新启动所有内容:

make restart



💪贡献/问题

  • 欢迎拉取请求
  • 请通过Github提交问题,我会尽力解决这些问题
  • 如果你想取得联系,请随时通过@paulpierre在推特上发送hmu`



竖起大拇指
恭喜你,你所有的基地都属于我们!克特克斯拜



📜开源许可证

版权所有 (c) 2023 保罗·皮埃尔。特此免费授予获得本软件和相关文档文件(“软件”)副本的任何人不受限制地处理本软件的权限,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件副本的权利,并允许向其提供本软件的人这样做, 符合以下条件:上述版权声明和本许可声明应包含在软件的所有副本或大部分内容中。本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权所有者均不对因本软件或本软件的使用或其他交易而引起、产生或与之相关的任何索赔、损害赔偿或其他责任负责,无论是在合同、侵权或其他诉讼中。