一、前言
在之前的文章中,我们研究了如何使用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 支持的应用程序:
-
检测数据类型并加载数据
-
创建有意义的块
-
为每个块创建嵌入
-
将块存储在矢量数据库中
当用户提出查询时,会发生以下过程来查找答案:
-
为查询创建嵌入
-
从向量数据库中查找与查询相似的文档
-
将类似文档作为上下文传递给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_URI
和 ZILLIZ_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_KEY
和 PINECONE_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_URL
和 QDRANT_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 用作 csv
。 csv
允许远程 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 配置来配置应用程序的不同组件( llm
、 embedding model
或 vector 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
部分:
-
config
: -
id
(字符串):全栈应用程序的 ID 或名称。
llm
部分:
-
provider
(字符串):语言模型的提供者,设置为“openai”。你可以在我们的文档中找到 llm 提供商的完整列表。 -
model
(字符串):正在使用的特定型号,“gpt-3.5-turbo”。 -
config
: -
temperature
(Float):控制模型输出的随机性。较高的值(接近 1)使输出更加随机。 -
max_tokens
(整数):控制响应中使用的令牌数量。 -
top_p
(Float):控制单词选择的多样性。较高的值(接近 1)使单词选择更加多样化。 -
stream
(布尔值):控制是否将响应流式传输回用户(设置为 false)。 -
template
(字符串):模型用于生成响应的提示的自定义模板。 -
system_prompt
(字符串):模型在生成响应时遵循的系统提示,在本例中,它设置为莎士比亚的风格。
vectordb
部分:
-
provider
(字符串):矢量数据库的提供者,设置为“色度”。你可以在我们的文档中找到矢量数据库提供商的完整列表。 -
config
: -
collection_name
(字符串):数据库的初始集合名称,设置为“full-stack-app”。 -
dir
(字符串):数据库的目录,设置为“db”。 -
allow_reset
(布尔值):表示是否允许重置数据库,设置为true。
embedder
部分:
-
provider
(字符串):嵌入器的提供者,设置为“openai”。你可以在我们的文档中找到嵌入模型提供程序的完整列表。 -
config
: -
model
(字符串):用于文本嵌入的特定模型,“text-embedding-ada-002”。
十、References
[1]. Embedchain GitHub: https://github.com/embedchain/embedchain
[2]. Data Platform for LLMs: https://app.embedchain.ai/