embedchainjs
embedchain 是一个框架,可以轻松创建基于任何数据集的 LLM 驱动的机器人。embedchainjs 是 embedchain 的 Javascript 版本。如果你想要 Python 版本,请查看 embedchain-python。
🤝 让我们讨论 Embedchain!
与创始人 Taranjeet 安排 反馈会话,讨论任何问题、提供反馈或探索改进。
工作原理
它抽象了整个加载数据集、分块、创建嵌入并存储到向量数据库的过程。
你可以使用 .add
和 .addLocal
函数添加单个或多个数据集,然后使用 .query
函数从添加的数据集中找到答案。
如果你想创建一个包含他的两个博客文章和你提供的一对问答的 Naval Ravikant 机器人,您只需添加博客文章的链接和 QnA 对,embedchain 会为你创建一个机器人。
const dotenv = require("dotenv");
dotenv.config();
const { App } = require("embedchain");
// 仅在异步函数中运行应用程序命令
async function testApp() {
const navalChatBot = await App();
// 嵌入在线资源
await navalChatBot.add("web_page", "https://nav.al/feedback");
await navalChatBot.add("web_page", "https://nav.al/agi");
await navalChatBot.add(
"pdf_file",
"https://navalmanack.s3.amazonaws.com/Eric-Jorgenson_The-Almanack-of-Naval-Ravikant_Final.pdf"
);
// 嵌入本地资源
await navalChatBot.addLocal("qna_pair", [
"Who is Naval Ravikant?",
"Naval Ravikant is an Indian-American entrepreneur and investor.",
]);
const result = await navalChatBot.query(
"What unique capacity does Naval argue humans possess when it comes to understanding explanations or concepts?"
);
console.log(result);
// 答案:Naval 认为人类具备在这个物理现实中最大限度地理解解释或概念的独特能力。
}
testApp();
入门
安装
- 首先,确保你已经安装了包。如果没有,则使用
npm
安装。
npm install embedchain && npm install -S openai@^3.3.0
-
目前,它仅与 openai 3.X 兼容,而不是最新的 4.X 版本。请确保使用正确的版本,否则你会看到
ChromaDB
错误TypeError: OpenAIApi.Configuration is not a constructor
-
确保已安装 dotenv 包,并在根文件夹中创建一个名为
.env
的文件,输入你的OPENAI_API_KEY
。你可以通过以下方式安装 dotenv:
npm install dotenv
-
通过访问 此链接 下载并安装 Docker 在你的设备上。你需要这个来在你的机器上运行 Chroma 向量数据库。
-
运行以下命令以在 Docker 中设置 Chroma 容器
git clone https://github.com/chroma-core/chroma.git
cd chroma
docker-compose up -d --build
- 一旦设置了 Chroma 容器,请在 Docker 内运行它。
使用
-
我们使用 OpenAI 的嵌入模型为块创建嵌入,并使用 ChatGPT API 作为 LLM 以获取相关文档的答案。确保你有一个 OpenAI 账号和 API 密钥。如果你没有 API 密钥,可以通过访问 此链接 创建一个。
-
拥有 API 密钥后,将其设置在名为
OPENAI_API_KEY
的环境变量中。
// 将此内容放在你的 .env 文件中
OPENAI_API_KEY = "sk-xxxx";
- 使用以下命令在你的 .js 文件中加载环境变量。
const dotenv = require("dotenv");
dotenv.config();
- 接下来,从 embedchain 导入
App
类并使用.add
函数添加任何数据集。 - 现在你的应用程序已创建。你可以使用
.query
函数来获取任何查询的答案。
const dotenv = require("dotenv");
dotenv.config();
const { App } = require("embedchain");
async function testApp() {
const navalChatBot = await App();
// 嵌入在线资源
await navalChatBot.add("web_page", "https://nav.al/feedback");
await navalChatBot.add("web_page", "https://nav.al/agi");
await navalChatBot.add(
"pdf_file",
"https://navalmanack.s3.amazonaws.com/Eric-Jorgenson_The-Almanack-of-Naval-Ravikant_Final.pdf"
);
// 嵌入本地资源
await navalChatBot.addLocal("qna_pair", [
"Who is Naval Ravikant?",
"Naval Ravikant is an Indian-American entrepreneur and investor.",
]);
const result = await navalChatBot.query(
"What unique capacity does Naval argue humans possess when it comes to understanding explanations or concepts?"
);
console.log(result);
// 答案:Naval 认为人类具备在这个物理现实中最大限度地理解解释或概念的独特能力。
}
testApp();
- 如果你的脚本或应用程序中有其他应用程序实例,你可以更改导入方式为
const { App: EmbedChainApp } = require("embedchain");
// 或者
const { App: ECApp } = require("embedchain");
支持的格式
我们支持以下格式:
PDF文件
要添加任何 PDF 文件,使用 pdf_file
作为数据类型。例如:
await app.add("pdf_file", "a_valid_url_where_pdf_file_can_be_accessed");
网页
要添加任何网页,使用 web_page
作为数据类型。例如:
await app.add("web_page", "a_valid_web_page_url");
问答对
要提供你自己的一对问答,使用 qna_pair
作为数据类型,并输入一个元组。例如:
await app.addLocal("qna_pair", ["Question", "Answer"]);
更多格式即将推出
- 如果你想添加任何其他格式,请创建一个 问题,我们将其添加到支持格式列表中。
测试
在你使用宝贵的令牌之前,你应该确保嵌入的效果,并且它接收到正确的文件。
为此,你可以使用 dryRun
方法。
按照上面的示例,将其添加到你的脚本中:
let result = await naval_chat_bot.dryRun("What unique capacity does Naval argue humans possess when it comes to understanding explanations or concepts?");console.log(result);
'''
使用以下上下文片段回答末尾的查询。如果你不知道答案,只需说你不知道,不要试图编造答案。
terms of the unseen. And I think that’s critical. That is what humans do uniquely that no other creature, no other computer, no other intelligence—biological or artificial—that we have ever encountered does. And not only do we do it uniquely, but if we were to meet an alien species that also had the power to generate these good explanations, there is no explanation that they could generate that we could not understand. We are maximally capable of understanding. There is no concept out there that is possible in this physical reality that a human being, given sufficient time and resources and
Query: What unique capacity does Naval argue humans possess when it comes to understanding explanations or concepts?
Helpful Answer:
'''
嵌入被确认正常工作。即使问题稍有不同,也会返回正确的文档。不消耗提示令牌。
干运行仍会消耗令牌来嵌入你的查询,但它只有 ~1/15 的提示。
它如何工作?
在任何数据集上创建聊天机器人需要以下步骤:
- 加载数据
- 创建有意义的分块
- 每个分块创建嵌入
- 将分块存储在向量数据库中
每当用户提出查询时,以下过程会发生以找到查询的答案:
- 创建查询的嵌入
- 从向量数据库中找到与此查询相似的文档
- 将相似文档作为上下文传递给 LLM 以获取最终答案。
加载数据集然后查询的过程涉及多个步骤,并且每个步骤都有其细微差别。
- 我应该如何分块数据?什么是有意义的分块大小?
- 我应该如何为每个分块创建嵌入?我应该使用哪个嵌入模型?
- 我应该如何将分块存储在向量数据库中?我应该使用哪个向量数据库?
- 我应该与嵌入一起存储元数据吗?
- 我应该如何为查询找到相似的文档?我应该使用哪个排序模型?
这些问题对于一些人来说可能是微不足道的,但对于很多人来说,需要调查、实验和时间来找到准确的答案。
embedchain 是一个框架,负责处理所有这些细微差别,并提供一个简单的接口,以在任何数据集上创建机器人。
在首次发布中,我们让任何人都能在不到一分钟的时间内轻松启动并运行一个聊天机器人。你只需创建一个应用程序实例,使用 .add
函数添加数据集,然后使用 .query
函数获取相关答案即可。
技术栈
embedchain 构建在以下栈上:
- Langchain 作为一个 LLM 框架来加载、分块和索引数据
- OpenAI 的 Ada 嵌入模型 创建嵌入
- OpenAI 的 ChatGPT API 作为 LLM 在给定上下文的情况下获取答案
- Chroma 作为存储嵌入的向量数据库
团队
作者
- Taranjeet Singh (@taranjeetio)
维护者
引用
如果你使用此库,请考虑引用它:
@misc{embedchain,
author = {Taranjeet Singh},
title = {Embechain: Framework to easily create LLM powered bots over any dataset},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/embedchain/embedchainjs}},
}