一、前言

在之前的文章中,我们研究了如何使用LangChain结合大型语言模型(LLM)API来构建用户友好且直观的聊天机器人。现在,我们将探索一个新的Python包来进一步简化LangChain的实现。只需3-4行代码,我们就可以轻松地与任何外部数据进行通信!这个神奇的包叫Embedchain!⭐

这些库各有优点。我认为LangChain的性能更好,并且具备更多功能。另一方面,Embedchain则更容易使用,并且免费提供开源的语言模型。总之,这两个库都旨在为您创建专属的语言模型。

选择使用哪个库取决于你的具体需求。例如,如果您需要处理数据,在LangChain库中有20多种工具可供选择,比如与PDF文件互动或者从医疗网站Pubmed获取信息等等;同时还能够从YouTube下载视频并将其转换为文本进行对话等等——所有这些都是LangChain库所擅长的领域。而Embedchain也有其自身的优势。

综上所述,我的建议是掌握这两个库,并在不同情况下做出最佳选择。

二、EmbedChain 介绍

EmbedChain 是一个功能强大的框架,旨在简化使用任何数据集创建语言模型 (LLM) 支持的机器人的过程。它提供了一个抽象层,用于处理数据集加载、分块、嵌入创建以及矢量数据库中的存储。它使用LangChain、OpenAI的Ada嵌入模型、OpenAI的ChatGPT API和Chroma作为存储嵌入的向量数据库。

通过使用 .add.add_local 函数,您可以轻松地将单个或多个数据集添加到您的机器人中。然后,您可以利用 .query 函数从添加的数据集中检索答案。

如果你想创建一个包含 YouTube 视频、PDF 格式的书籍、两篇博客文章和问答对的 Naval Ravikant 机器人,你只需添加相应的链接即可。 Embedchain 将负责剩下的工作,为你创建一个机器人。

from embedchain import App

naval_bot = App()
# 添加在线数据
naval_bot.add("https://www.youtube.com/watch?v=3qHkcs3kG44")
naval_bot.add("https://navalmanack.s3.amazonaws.com/Eric-Jorgenson_The-Almanack-of-Naval-Ravikant_Final.pdf")
naval_bot.add("https://nav.al/feedback")
naval_bot.add("https://nav.al/agi")
naval_bot.add("The Meanings of Life", 'text', metadata={'chapter': 'philosphy'})

# 添加本地资源
naval_bot.add(("谁是海军拉维坎特?", "纳瓦尔·拉维坎特是一位印度裔美国企业家和投资者。"))

naval_bot.query("海军认为人类在理解解释或概念方面拥有哪些独特的能力?")
# 答:海军认为,人类拥有在这个物理现实中最大程度地理解解释或概念的独特能力。

2.1、基本原理

Embedchain 为你抽象出以下步骤,以轻松创建 LLM 支持的应用程序:

  1. 检测数据类型并加载数据

  2. 创建有意义的块

  3. 为每个块创建嵌入

  4. 将块存储在矢量数据库中

当用户提出查询时,会发生以下过程来查找答案:

  1. 为查询创建嵌入

  2. 从向量数据库中查找与查询相似的文档

  3. 将类似文档作为上下文传递给LLM以获得最终答案

加载数据集和查询的过程涉及多个步骤,每个步骤都有自己的细微差别:

  • 我应该如何对数据进行分块?什么是有意义的块大小?

  • 我应该如何为每个块创建嵌入?我应该使用哪种嵌入模型?

  • 我应该如何将块存储在矢量数据库中?我应该使用哪个矢量数据库?

  • 我应该将元数据与嵌入一起存储吗?

  • 我应该如何找到类似的查询文档?我应该使用哪种排名模型?

Embedchain 照顾所有这些细微差别,并提供一个简单的界面来在任何数据上创建应用程序。

三、快速开始

快速安装 embedchain:

pip install --upgrade embedchain

创建应用程序涉及 3 个步骤:

# 导入应用实例
import os
from embedchain import App

os.environ["OPENAI_API_KEY"] = "xxx"
elon_bot = App()

# 添加不同的数据源
elon_bot.add("https://en.wikipedia.org/wiki/Elon_Musk")
elon_bot.add("https://www.forbes.com/profile/elon-musk")
# 你还可以添加本地数据源,例如pdf、csv文件等。
# elon_bot.add("/path/to/file.pdf")

# 查询你的数据并获得答案
response = elon_bot.query("埃隆·马斯克今天的净资产是多少?")
print(response)
# 答:埃隆·马斯克如今的净资产是2587亿美元。

四、大语言模型

Embedchain 内置了对各种流行的大型语言模型的支持。我们为你处理集成这些模型的复杂性,使你可以通过用户友好的界面轻松自定义语言模型交互。

4.1、OpenAI

要使用 OpenAI LLM 模型,您必须设置 OPENAI_API_KEY 环境变量。您可以从OpenAI平台获取OpenAI API密钥。

获得密钥后,您可以像这样使用它:

import os
from embedchain import App

os.environ['OPENAI_API_KEY'] = 'xxx'

app = App()
app.add("https://en.wikipedia.org/wiki/OpenAI")
app.query("What is OpenAI?")

如果您希望配置 LLM 的不同参数,可以通过使用 yaml 配置文件加载应用程序来实现。

import os
from embedchain import App

os.environ['OPENAI_API_KEY'] = 'xxx'

# load llm configuration from config.yaml file
app = App.from_config(yaml_path="config.yaml")

# config.yaml
llm:
  provider: openai
  config:
    model: 'gpt-3.5-turbo'
    temperature: 0.5
    max_tokens: 1000
    top_p: 1
    stream: false

4.2、Hugging Face

使用以下命令安装相关依赖:

pip install --upgrade 'embedchain[huggingface_hub]'

首先,在环境变量中设置 HUGGINGFACE_ACCESS_TOKEN ,您可以从他们的平台获取该环境变量。

获得令牌后,使用配置 yaml 文件加载应用程序:

import os
from embedchain import App

os.environ["HUGGINGFACE_ACCESS_TOKEN"] = "xxx"

# 从config. yaml文件加载llm配置
app = App.from_config(yaml_path="config.yaml")

# config.yaml
llm:
  provider: huggingface
  config:
    model: 'google/flan-t5-xxl'
    temperature: 0.5
    max_tokens: 1000
    top_p: 0.5
    stream: false

五、Embedding 模型

Embedchain 支持以下提供商的多种嵌入模型:

5.1、OpenAI

要使用OpenAI嵌入功能,您必须设置 OPENAI_API_KEY 环境变量。您可以从OpenAI平台获取OpenAI API密钥。

获得密钥后,您可以像这样使用它:

import os
from embedchain import App

os.environ['OPENAI_API_KEY'] = 'xxx'

# 从config. yaml文件加载嵌入模型配置
app = App.from_config(yaml_path="config.yaml")

app.add("https://en.wikipedia.org/wiki/OpenAI")
app.query("What is OpenAI?")

# config.yaml
embedder:
  provider: openai
  config:
    model: 'text-embedding-ada-002'

5.2、Hugging Face

Hugging Face 支持使用 Sentence Transformer 库生成任意长度的文本文档的嵌入。下面给出了如何使用拥抱脸生成嵌入的示例:

from embedchain import App

# 从config. yaml文件加载嵌入模型配置
app = App.from_config(yaml_path="config.yaml")

# config.yaml
llm:
  provider: huggingface
  config:
    model: 'google/flan-t5-xxl'
    temperature: 0.5
    max_tokens: 1000
    top_p: 0.5
    stream: false

embedder:
  provider: huggingface
  config:
    model: 'sentence-transformers/all-mpnet-base-v2'

六、向量数据库

将矢量数据库与 Embedchain 结合使用是一个无缝过程。你需要做的就是在 YAML 配置文件中配置它。我们为下面每个受支持的数据库提供了示例:

6.1、ChromaDB

from embedchain import App

# 从yaml文件加载色度配置
app = App.from_config(yaml_path="config1.yaml")

# config1.yaml
vectordb:
  provider: chroma
  config:
    collection_name: 'my-collection'
    dir: db
    allow_reset: true

# config2.yaml
vectordb:
  provider: chroma
  config:
    collection_name: 'my-collection'
    host: localhost
    port: 5200
    allow_reset: true

6.2、Elasticsearch

使用以下命令安装相关依赖:

pip install --upgrade 'embedchain[elasticsearch]'
from embedchain import App

# 从yaml文件加载elasticsearch配置
app = App.from_config(yaml_path="config.yaml")

# config.yaml
vectordb:
  provider: elasticsearch
  config:
    collection_name: 'es-index'
    es_url: http://localhost:9200
    allow_reset: true
    api_key: xxx

6.3、OpenSearch

使用以下命令安装相关依赖:

pip install --upgrade 'embedchain[opensearch]'
from embedchain import App

# 从yaml文件加载opensearch配置
app = App.from_config(yaml_path="config.yaml")

# config.yaml
vectordb:
  provider: opensearch
  config:
    opensearch_url: 'https://localhost:9200'
    http_auth:
      - admin
      - admin
    vector_dimension: 1536
    collection_name: 'my-app'
    use_ssl: false
    verify_certs: false

6.4、Milvus

使用以下命令安装相关依赖:

pip install --upgrade 'embedchain[milvus]'

设置 Zilliz 环境变量 ZILLIZ_CLOUD_URIZILLIZ_CLOUD_TOKEN ,您可以在其云平台上找到它。

import os
from embedchain import App

os.environ['ZILLIZ_CLOUD_URI'] = 'https://xxx.zillizcloud.com'
os.environ['ZILLIZ_CLOUD_TOKEN'] = 'xxx'# 从yaml文件加载zilliz配置
app = App.from_config(yaml_path="config.yaml")

# config.yaml
vectordb:
  provider: zilliz
  config:
    collection_name: 'zilliz-app'
    uri: https://xxxx.api.gcp-region.zillizcloud.com
    token: xxx
    vector_dim: 1536
    metric_type: L2

6.5、Pinecone

使用以下命令安装pinecone相关依赖项:

pip install --upgrade 'embedchain[pinecone]'

为了使用 Pinecone 作为矢量数据库,请设置环境变量 PINECONE_API_KEYPINECONE_ENV ,您可以在 Pinecone 仪表板上找到它们。

from embedchain import App

# 从yaml文件加载松果配置
app = App.from_config(yaml_path="config.yaml")

# config.yaml
vectordb:
  provider: pinecone
  config:
    metric: cosine
    vector_dimension: 1536
    collection_name: my-pinecone-index

6.6、Qdrant

为了将 Qdrant 用作矢量数据库,请设置环境变量 QDRANT_URLQDRANT_API_KEY ,您可以在 Qdrant Dashboard 上找到它们。

from embedchain import App

# 从yaml文件加载qdrant配置
app = App.from_config(yaml_path="config.yaml")

# config.yaml
vectordb:
  provider: qdrant
  config:
    collection_name: my_qdrant_index

七、数据源

Embedchain 内置了12种数据源的支持。我们处理从这些数据源加载非结构化数据的复杂性,使你可以通过用户友好的界面轻松自定义你的应用程序。

7.1、CSV 文档

要添加任何 csv 文件,请将 data_type 用作 csvcsv 允许远程 URL 和常规文件路径。每行都包含标题,因此如果你有 age 列,则 18 将添加为 age: 18 。例如:

from embedchain import App

app = App()
app.add('https://people.sc.fsu.edu/~jburkardt/data/csv/airtravel.csv', data_type="csv")
# 或者使用本地文件路径添加
# app.add('/path/to/file.csv', data_type="csv")

app.query("总结航空旅行数据")
# 答:航空旅行数据显示了1958年、1959年和1960年7月的航班数量。1958年7月有491个航班,1959年7月有548个航班,1960年7月有622个航班。

注意:csv 文件有一个大小限制,超过该限制可能会引发错误。该限制由LLM设定。请考虑将大型 csv 文件分成较小的 csv 文件。

7.2、代码文档

要将任何代码文档网站添加为加载程序,请使用 data_type 作为 docs_site 。例如:

from embedchain import App

app = App()
app.add("https://docs.embedchain.ai/", data_type="docs_site")
app.query("什么是 Embedchain?")
# 答:Embedchain是一个平台,它利用各种组件,包括付费/专有组件,来提供被认为是最好的配置。它使用LLM(语言模型)提供程序,如OpenAI、Anthproic、Vertex_AI、GPT4ALL、Azure_OpenAI、LLAMA2、JINA和COHere。嵌入式链允许用户为他们的应用程序导入和利用这些LLM提供程序。'

其他支持的数据源类型就不一一列举了,具体可以查阅官方文档,基本上差异就是指定 data_type 属性为文档的类型即可。同时 add 方法既支持传入在线URL地址,也支持传入本地文档地址。

data_type 可选值为:
csv
docs_site
docs
mdx
notion
pdf_file
qna_pair
sitemap
text
web_page
youtube_video

八、数据类型处理

8.1、自动数据类型检测

add 方法根据你对源参数的输入自动尝试检测 data_type。因此 app.add('https://www.youtube.com/watch?v=dQw4w9WgXcQ') 足以嵌入 YouTube 视频。

此检测适用于所有格式。它基于是否是 URL、本地文件、源数据类型等因素。

8.1.1、调试自动检测

在配置yaml中设置 log_level: DEBUG 来调试数据类型检测是否正确。否则,你将不知道何时将无效的文件路径解释为原始文本。

8.1.2、强制数据类型

要忽略数据类型检测的任何问题,你可以通过将 data_type 添加为 add 方法参数来强制使用它。下面的示例向你展示了强制相应 data_type 的关键字。

强制还可以用于边缘情况,例如将站点地图解释为网页,以读取其原始文本而不是跟随链接。

8.2、远程数据类型

在远程数据类型中使用本地文件

某些 data_types 适用于远程内容并且仅适用于 URL。你可以通过使用 file: URI 方案格式化路径来传递本地文件,例如 file:///info.pdf

8.3、重用向量数据库

默认情况下,会在./db目录中创建一个持久化的向量数据库。您可以将应用程序拆分为两个Python脚本:一个用于创建本地的向量数据库,另一个用于重用这个本地的持久化向量数据库。当您想要对数百个文档进行索引,并单独实现聊天界面时,这非常有用。

from embedchain import App

naval_chat_bot = App()
naval_chat_bot.add("https://www.youtube.com/watch?v=3qHkcs3kG44")
naval_chat_bot.add("https://navalmanack.s3.amazonaws.com/Eric-Jorgenson_The-Almanack-of-Naval-Ravikant_Final.pdf")

你可以使用相同的代码重用本地索引,但无需添加新文档:

from embedchain import App

naval_chat_bot = App()print(naval_chat_bot.query("海军认为人类在理解解释或概念方面拥有哪些独特的能力?"))

九、自定义配置

Embedchain 开箱即用。对于高级用户,还提供配置选项。这些配置选项都是可选的并且具有合理的默认值。

你可以通过 Embedchain 提供的简单 yaml 配置来配置应用程序的不同组件( llmembedding modelvector database )。以下是 yaml 配置的通用全栈示例:

app:
  config:
    id: 'full-stack-app'

llm:
  provider: openai
  config:
    model: 'gpt-3.5-turbo'
    temperature: 0.5
    max_tokens: 1000
    top_p: 1
    stream: false
    template: |
      最后使用以下上下文来回答查询。
      如果你不知道答案,就说你不知道,不要试图编造答案。

      $context

      Query: $query

      Helpful Answer:
    system_prompt: |
      扮演威廉·莎士比亚。以威廉·莎士比亚的风格回答以下问题。

vectordb:
  provider: chroma
  config:
    collection_name: 'full-stack-app'
    dir: db
    allow_reset: true

embedder:
  provider: openai
  config:
    model: 'text-embedding-ada-002'

针对上面 yaml 配置中每个键的含义解释如下:

app 部分:

  1.   config:

  2.     id (字符串):全栈应用程序的 ID 或名称。

llm 部分:

  1.   provider (字符串):语言模型的提供者,设置为“openai”。你可以在我们的文档中找到 llm 提供商的完整列表。

  2.   model (字符串):正在使用的特定型号,“gpt-3.5-turbo”。

  3.   config:

  4.     temperature (Float):控制模型输出的随机性。较高的值(接近 1)使输出更加随机。

  5.     max_tokens (整数):控制响应中使用的令牌数量。

  6.     top_p (Float):控制单词选择的多样性。较高的值(接近 1)使单词选择更加多样化。

  7.     stream (布尔值):控制是否将响应流式传输回用户(设置为 false)。

  8.     template (字符串):模型用于生成响应的提示的自定义模板。

  9.     system_prompt (字符串):模型在生成响应时遵循的系统提示,在本例中,它设置为莎士比亚的风格。

vectordb 部分:

  1.   provider (字符串):矢量数据库的提供者,设置为“色度”。你可以在我们的文档中找到矢量数据库提供商的完整列表。

  2.   config:

  3.     collection_name (字符串):数据库的初始集合名称,设置为“full-stack-app”。

  4.     dir (字符串):数据库的目录,设置为“db”。

  5.     allow_reset (布尔值):表示是否允许重置数据库,设置为true。

embedder 部分:

  1.   provider (字符串):嵌入器的提供者,设置为“openai”。你可以在我们的文档中找到嵌入模型提供程序的完整列表。

  2.   config:

  3.     model (字符串):用于文本嵌入的特定模型,“text-embedding-ada-002”。

十、References

[1]. Embedchain GitHub: https://github.com/embedchain/embedchain

[2]. Data Platform for LLMs: https://app.embedchain.ai/

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐