Sign In
Free Sign Up
  • English
  • Español
  • 简体中文
  • Deutsch
  • 日本語
Sign In
Free Sign Up
  • English
  • Español
  • 简体中文
  • Deutsch
  • 日本語

使用 MyScale 将您的知识库与 OpenAI 的 GPTs 连接起来

2023年11月6日,OpenAI 宣布发布了他们的 GPTs。在这个无代码平台上,作为专业开发人员(或业余爱好者),您可以使用自己的工具和提示构建定制的 GPTs 或聊天机器人,从而有效改变与 OpenAI 的 GPT 的交互方式。以前的交互需要使用 LangChain (opens new window)LlamaIndex (opens new window) 来检索 GPT 的响应。现在,OpenAI 的 GPTs 通过调用外部 API 或工具来处理动态提示,这也改变了我们(MyScale)构建 RAG 系统的方式,从使用服务器端上下文构建提示到将这些上下文注入到 GPTs 模型中。

MyScale 简化了您向 GPTs 注入上下文的方式。例如,OpenAI 的方法是通过 Web UI 将文件上传到 GPTs 平台。相比之下,MyScale 允许您使用 SQL WHERE 子句 (opens new window) 混合结构化数据过滤和语义搜索,以更低的成本处理和存储更大的知识库,并且可以在多个 GPTs 之间共享一个知识库。

现在就在 GPT Store 上尝试 MyScaleGPT 🚀,或者使用我们在 Hugging Face 上托管的 API,将 MyScale 的开放知识库与您的应用程序集成起来:

# BYOK:带上您自己的知识

GPT 在过去的一年中发展迅速,在共享知识领域的知识比它刚发布时要丰富得多。然而,它仍然对某些特定主题一无所知或不确定,比如领域特定的知识和当前事件。因此,正如我们在我们之前的文章 (opens new window)中所描述的那样,将外部知识库(存储在 MyScale 中)集成到 GPT 中是必要的,可以提高其真实性和实用性。

在我们构建 RAG 时,我们在我们的链条(或堆栈)中引入了一个 LLM(或语言模型)。这一次,我们需要将 MyScale 数据库引入到 GPTs 平台中。不幸的是,目前无法直接在 GPTs 和 MyScale 之间建立连接。因此,我们调整了查询接口,将其作为 REST API 公开。

由于我们之前在 OpenAI 函数调用 (opens new window) 中的成功经验,我们现在可以设计一个类似的接口,让 GPT 可以使用类似 SQL 的过滤字符串编写向量搜索查询。参数如下所示,使用 OpenAPI (opens new window) 编写:

"parameters": [
  {
    "name": "subject",
    "in": "query",
    "description": "A sentence or phrase describes the subject you want to query.",
    "required": true,
    "schema": {
      "type": "string"
    }
  },
  {
    "name": "where_str",
    "in": "query",
    "description": "a SQL-like where string to build filter",
    "required": true,
    "schema": {
      "type": "string"
    }
  },
  {
    "name": "limit",
    "in": "query",
    "description": "desired number of retrieved documents",
    "schema": {
      "type": "integer",
      "default": 4
    }
  }
]

有了这样的接口,GPT 可以提取关键词来描述带有 SQL 过滤器的所需查询。

# 向不同的表提供查询入口

我们有时可能需要查询不同的表。这可以通过使用单独的 API 入口来实现。每个 API 入口都有自己的模式和文档下的提示。GPTs 将读取适用的 API 文档并编写正确的查询到相应的表中。

值得注意的是,我们之前介绍的方法,如自查询检索器 (opens new window)向量 SQL (opens new window),需要动态或半动态提示来描述表结构。相反,GPTs 的功能类似于 LangChain 中的对话代理 (opens new window),代理使用不同的工具来查询表。

例如,API 入口可以使用以下 OpenAPI 3.0 编写:

"paths": {
  // 查询 arxiv 表的入口
  "/get_related_arxiv": {
    "get": {
      // 描述将被注入到工具提示中
      // 这样 GPT 就会知道如何以及何时使用此查询工具
      "description": "Get some related papers."
                      "You should use schema here:\n"
                      "CREATE TABLE ArXiv ("
                      "    `id` String,"
                      "    `abstract` String,"
                      "    `pubdate` DateTime,"
                      "    `title` String,"
                      "    `categories` Array(String), -- arxiv category"
                      "    `authors` Array(String),"
                      "    `comment` String,"
                      "ORDER BY id",
      "operationId": "get_related_arxiv",
      "parameters": [
        // 上述提到的参数
      ],
    }
  },
  // 查询 wiki 表的入口
  "/get_related_wiki": {
    "get": {
      "description": "Get some related wiki pages. "
                      "You should use schema here:\n\n"
                      "CREATE TABLE Wikipedia ("
                      "    `id` String,"
                      "    `text` String,"
                      "    `title` String,"
                      "    `view` Float32,"
                      "    `url` String, -- URL to this wiki page"
                      "ORDER BY id\n"
                      "You should avoid using LIKE on long text columns.",
      "operationId": "get_related_wiki",
      "parameters": [
        // 上述提到的参数
      ]
    }
  }
}

基于这段代码片段,GPT 知道有两个知识库可以帮助回答用户的问题。

在配置 GPT 的知识库检索 Actions 后,我们只需填写 Instructions 并告诉 GPT 如何查询知识库,然后回答用户的问题:

尽力回答问题。可以随意使用任何可用的工具查找相关信息。在调用搜索函数时,请将所有细节保留在查询中。在使用 MyScale 知识库进行查询时,对于字符串数组,请使用 has(column, value to match)。对于发布日期,请使用 parseDateTime32BestEffort() 将时间戳值从字符串格式转换为日期时间对象,永远不要使用此函数将日期时间类型的列转换。您应始终为您使用的文档添加参考链接。

Boost Your AI App Efficiency now
Sign up for free to benefit from 150+ QPS with 5,000,000 vectors
Free Trial
Explore our product

# 将您的数据库托管为 OpenAPI

GPTs 适配了 OpenAI 3.0 标准下的 API。某些应用程序,如数据库,没有 OpenAPI 接口。因此,我们需要使用中间件将 GPTs 与 MyScale 集成起来。

OpenAI GPTs Actions

我们已经在 Hugging Face (opens new window) 上托管了与 OpenAI 兼容的接口的数据库。我们使用 flask-restx (opens new window) 来简化和自动化实现,使代码变得简洁、干净且易于阅读:app.py (opens new window)funcs.py (opens new window)

这样做的好处是提示和函数都绑定在一起。因此,您不需要过多考虑提示、功能和可扩展性的组合;将其以人类可读的格式编写,就可以了。GPT 将从转储的 OpenAI JSON 文件中读取此文档。

注意:

flask-restx 仅生成 Swagger 2.0 格式的 API。您必须先使用 Swagger Editor (opens new window) 将其转换为 OpenAPI 3.0 格式。您可以使用 我们在 Hugging Face 上的 JSON API (opens new window) 作为参考。

Join Our Newsletter

# 使用 API 从上下文中运行 GPT

在正确的指示下,GPT 将使用特殊函数仔细处理不同的数据类型。这些数据类型的示例包括 ClickHouse SQL 函数,如 has(column, value) 用于数组列和 parseDateTime32BestEffort(value) 用于时间戳列。

在向 API 发送正确的查询之后,它(或 API)将使用 WHERE 子句字符串构建我们的向量搜索查询。返回的值被格式化为字符串,作为从数据库检索到的额外知识。如下面的代码示例所描述的那样,这个实现非常简单。

class ArXivKnowledgeBase:
    def __init__(self, embedding: SentenceTransformer) -> None:
        # 这是我们的开放知识库,其中包含 default.ChatArXiv 和 wiki.Wikipedia
        self.db = clickhouse_connect.get_client(
            host='msc-950b9f1f.us-east-1.aws.myscale.com',
            port=443,
            username='chatdata',
            password='myscale_rocks'
        )
        self.embedding: SentenceTransformer = INSTRUCTOR('hkunlp/instructor-xl')
        self.table: str = 'default.ChatArXiv'
        self.embedding_col = "vector"
        self.must_have_cols: List[str] = ['id', 'abstract', 'authors', 'categories', 'comment', 'title', 'pubdate']


    def __call__(self, subject: str, where_str: str = None, limit: int = 5) -> Tuple[str, int]:
        q_emb = self.embedding.encode(subject).tolist()
        q_emb_str = ",".join(map(str, q_emb))
        if where_str:
            where_str = f"WHERE {where_str}"
        else:
            where_str = ""
        # 简单地将查询向量和 where_str 注入到查询中
        # 如果需要,您可以检查它
        q_str = f"""
            SELECT dist, {','.join(self.must_have_cols)}
            FROM {self.table}
            {where_str}
            ORDER BY distance({self.embedding_col}, [{q_emb_str}])
                AS dist ASC
            LIMIT {limit}
            """
        docs = [r for r in self.db.query(q_str).named_results()]
        return '\n'.join([str(d) for d in docs]), len(docs)

# 结论

GPTs 确实是 OpenAI 的开发者界面的重大改进。工程师们不需要编写太多的代码来构建他们的聊天机器人,工具现在可以是自包含的,包含了提示。我们认为为 GPTs 创建一个生态系统是非常美妙的。另一方面,这也将鼓励开源社区重新思考如何将 LLM 和工具结合起来的现有方式。

我们非常兴奋地迎接这个新的挑战,一如既往地寻找将向量数据库(如 MyScale)与 LLM 集成的新方法。我们坚信,将外部知识库(存储在外部数据库中)引入将提高您的 LLM 的真实性和实用性。

立即将 MyScaleGPT (opens new window) 添加到您的账户中。或者加入我们的 Discord (opens new window)Twitter (opens new window),开始深入而有意义的关于 LLM 和数据库集成的讨论吧。

Keep Reading
images
RAG vs. 大背景LLM:RAG将继续存在

生成AI(GenAI)的迭代速度呈指数增长。其中一个结果是上下文窗口的扩展,即一个大型语言模型(LLM)一次可以使用的标记数量,用于生成响应。 2024年2月发布的Google Gemini 1.5 Pro创下了迄今为止最长的上下文窗口记录:100万个标记,相当于1小时的视频或70万个单词。Gemini在处理长上下文方面的出色表现使一些人宣称“检索增强生成(RAG)已经死了”。他们说,LLM已经 ...

images
实现复制的 MyScale 集群在 Kubernetes 升级期间的零停机

在本博客中,我们将深入探讨 MyScale 如何在复制的集群中实现 Kubernetes(k8s)升级期间的零停机。MyScale 托管在 AWS 云上,并利用 Amazon EKS,提供弹性和可扩展的数据库即服务(DBaaS)。我们将探讨 MyScale 架构的全局和区域方面,解决自动扩展和 Kubernetes 升级的挑战,并概述我们的策略,以实现无缝用户集群迁移,同时确保服务不间断。 ...

Start building your Al projects with MyScale today

Free Trial
Contact Us