这个小项目旨在将 WordPress 博客条目合并到利用检索增强生成 (RAG) 技术的知识库中。
该项目的前提很简单 - 一系列脚本将通过命令行执行特定操作。每个脚本都是独立的,这有助于相对简单地在其自己的上下文中演示每个操作。
默认情况下,包含的脚本使用免费和开源的库和模型,但如果您有访问权限,也可以选择使用 OpenAI 的 LLM。如果您没有兼容的 GPU,那么这个示例应该能够在 CPU 上运行,但是 YMMV。
RAG 使用两个组件:检索系统和生成语言模型。检索系统从数据存储/知识库(例如,博客文章的集合)中查询与查询相关的文档。然后,检索到的文档被输入到语言模型中,该模型为用户生成明智的响应。使用 RAG 的主要好处之一是它允许 AI 系统扩展到训练数据之外,而无需微调或重新训练 - 可以在数据存储中动态添加和更新数据。查询结果不仅可以包括语言模型提供的文本,还可以包括相关文档或来源的集合。您可以在 IBM 研究博客上阅读有关 RAG 的更多信息。
这是一个相当容易启动和运行的项目......
首先设置项目的虚拟环境并激活
python3 -m venv virtualenv
source ./virtualenv/bin/activate
您可以使用requirements.txt
文件安装该项目的所有依赖项。如果这样做,则无需在本文档中通过pip
手动安装其他软件包。
pip install -r requirements.txt
使用env.example
作为指导创建.env
文件。
cp env.example .env
这对于下载您的 WordPress 数据非常重要。确保将您的 WordPress 用户名、应用程序密码和博客域复制到.env
中。注意:这假设博客位于根路径。
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
将 WordPress 内容下载到./data
目录(目前假设您的博客位于域根目录):
python3 wordpress-dl.py
PGVector 用于在 Postgresql 数据库中存储和查询文本嵌入(向量)。 PGVector 的好处之一是它可以添加到现有的数据库系统中,并且不需要专有的第三方产品。
对于 pgvector 嵌入支持:
pip install pgvector psycopg2-binary
确保您具有正确的.env
值。虽然默认设置适合本地开发,但如果使用现有的 Postgres 数据库(即不运行 docker 映像),您可能会遇到不同的情况。在这里,我们使用 Docker 映像来保持设置简单,但如果您能够自己添加和加载 pgvector 扩展,您可以轻松使用另一个 PostgreSQL 实例。
要在./postgres
中运行 docker 镜像:
docker compose up
运行嵌入脚本以获取 wordpress 下载并将嵌入保存到 postgres 数据库。这可能需要一些时间。 _如果要将数据插入数据库,即擦除并从干净的数据开始,请传递--embed
CLI 参数:
python3 embed.py --embed
默认情况下,仅插入 1 条记录进行测试(即,通过不指定--limit
,然后指定某个整数 > 1,它只会为第一条记录创建向量嵌入) - 因此您可以更轻松地进行测试,而无需花费太多额外的计算时间。
如果您对其他信息感到好奇,请传递--verbose
示例调用可能如下所示:
python3 embed.py --verbose --embed --limit 100
...但是适当增加您的 WordPress 博客的限制大小。如果数字大于条目数也没有问题 - 它足够智能,可以导入最大记录数。
此存储库演示了本地和基于 API 的用例。本地运行模型的好处之一是您的数据保持私密,不会用于训练其他模型。此外,通过将查询保留在服务器或网络本地可以带来一些性能提升,但在自托管系统上不会产生 API 使用成本。另一方面,可能需要使用 API,因为 OpenAI 的上下文窗口比该项目中使用的模型大得多,并且 OpenAI 模型可能非常好。
本地语言模型的使用需要trsnformers
python 包和 pytorch ( torch
)
pip install transformers torch llama-cpp-python
接下来,下载此离线方法中使用的模型。因为语言模型可能很大(几个 GB),所以我选择了一个较小的 Llama 模型来演示。甚至可以使用更小的模型,但通常会受到上下文窗口的限制,这可以得到缓解,但超出了本项目的范围。该项目使用TheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
)
(如果您没有安装huggingface-cli
,您可以在此处找到详细信息)。
huggingface-cli download TheBloke/Llama-2-7b-Chat-GGUF llama-2-7b-chat.Q4_K_M.gguf --local-dir ./models/ --local-dir-use-symlinks True
此命令会将模型下载到用户帐户的缓存控制器,并从模型目录进行符号链接。
下载模型后,您可以运行本地推理,这是默认选项。请参阅下一节“查询”以获取说明。
使用 OpenAI API 需要安装
pip install langchain_openai
确保您已将 OpenAI API 密钥保存到.env
文件中。您可以在 OpenAI Platform API 密钥选项卡中进行配置: OPENAI_API_KEY="...
文档(嵌入和检索,顺便说一句)在该项目中具有以下一般结构。
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
结果通常作为元组List
(idx、Document)返回,因此枚举该列表是合适的:
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
用于增强 LLM 响应的最有用的数据将包含在metadata
属性中,即嵌入期间输入的数据字典。
从 CLI 运行查询很简单。
...本地模型:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? "
...使用 OpenAI:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? " --use-api
几分钟后,期望看到这样的响应,
❓ 'Does RaspberryPi have GPIO that swift can use?'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yes, RasbperryPi has GPIO that swift can use as per the context given.
- - Supporing Docs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
? Accessing Raspberry Pi GPIO Pins (With Swift) ? https://archive.mistercameron.com/2016/06/accessing-raspberry-pi-gpio-pins-with-swift/
? Currently, Swift on Raspberry Pi3 ? https://archive.mistercameron.com/2016/04/currently-swift-on-raspberry-pi3/
? Compile Swift 3.0 on Your ARM computers (Raspberry Pi, BeagleBone Black, etc) ? https://archive.mistercameron.com/2016/06/compile-swift-3-0-on-your-arm-computer/
? Ready Your Raspberry Pi for Swift ? https://archive.mistercameron.com/2016/05/ready-your-raspberry-pi-for-swift/
~ ~ ~ ~ ~ Finished in 14.80s ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
在测试数据和模型时,还有一些其他参数可能会有所帮助。运行python3 query.py --help
以获取更多选项。