【迁移】基于Chroma搭建个人知识库的全文索引

Last updated on March 19, 2024 pm

Chroma是一个可以帮助计算机理解文本的工具。它可以让你把文本放到一个“盒子”里,这个“盒子”可以让计算机更容易地找到和理解文本。你可以用它来创建一个文本库,然后通过输入问题,找到和问题相关的文本。比如,你可以创建一个文本库,里面有许多关于历史的文章,然后你可以输入“什么是古代中国的四大发明”,Chroma就可以帮你找到相关的文章。Chroma还有很多其他的功能,可以让你更方便地管理和搜索文本。它是完全免费和开放的,任何人都可以使用它。

构建Docker镜像

1
2
3
4
5
mkdir -p ~/app/chroma && cd ~/app/chroma && nano Dockerfile && nano docker-compose.yml
git clone --depth=1 https://ghproxy.com/https://github.com/chroma-core/chroma.git
sudo docker build -t limour/chroma .
cp ./chroma/bin/docker_entrypoint.sh ./docker_entrypoint.sh
nano ./docker_entrypoint.sh 添加上pip镜像 -i https://pypi.tuna.tsinghua.edu.cn/simple
1
2
3
4
5
6
7
FROM python:3.10
WORKDIR /chroma
COPY ./chroma/requirements.txt requirements.txt
RUN pip install --no-cache-dir --upgrade -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY ./chroma/bin/docker_entrypoint.sh /docker_entrypoint.sh
COPY ./chroma /chroma
CMD ["/docker_entrypoint.sh"]

部署Docker镜像

1
2
3
nano docker-compose.yml
sudo docker-compose up -d
sudo docker-compose logs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
version: '3.9'

networks:
net:
driver: bridge

services:
server:
image: limour/chroma
restart: always
volumes:
- ./chroma:/chroma
- ./index_data:/index_data
- ./docker_entrypoint.sh:/docker_entrypoint.sh
command: uvicorn chromadb.app:app --reload --workers 1 --host 0.0.0.0 --port 8000 --log-config log_config.yml
environment:
- CHROMA_DB_IMPL=clickhouse
- CLICKHOUSE_HOST=clickhouse
- CLICKHOUSE_PORT=8123
ports:
- 5800:8000
depends_on:
- clickhouse
networks:
- net

clickhouse:
image: clickhouse/clickhouse-server:22.9-alpine
restart: always
environment:
- ALLOW_EMPTY_PASSWORD=yes
- CLICKHOUSE_TCP_PORT=9000
- CLICKHOUSE_HTTP_PORT=8123
ports:
- '8123:8123'
- '9000:9000'
volumes:
- ./clickhouse_data:/bitnami/clickhouse
- ./backups:/backups
- ./chroma/config/backup_disk.xml:/etc/clickhouse-server/config.d/backup_disk.xml
- ./chroma/config/chroma_users.xml:/etc/clickhouse-server/users.d/chroma.xml
networks:
- net

安装客户端

1
2
3
4
5
6
conda create -n chroma -c conda-forge python=3.10 -y
conda activate chroma
pip install chromadb -i https://pypi.tuna.tsinghua.edu.cn/simple
conda install -c conda-forge ipykernel -y
python -m ipykernel install --user --name python-chroma
# 更简单的:# conda create -n chroma -c conda-forge chromadb -y

测试用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import chromadb
from chromadb.config import Settings

chroma_client = chromadb.Client(Settings(chroma_api_impl="rest",
chroma_server_host="172.17.0.1",
chroma_server_http_port="5800",
chroma_server_ssl_enabled=False
))
collection = chroma_client.get_or_create_collection(name="test")

test_documents = [
"长城:中国的标志性建筑之一,是世界上最长的城墙,也是中国古代的军事防御工程,被誉为世界七大奇迹之一。",
'故宫:位于北京市中心,是明清两代的皇宫,也是中国最著名的古建筑之一,被誉为“中华民族的瑰宝”。',
"大雁塔:位于中国古都西安市,是一座古代佛教文化遗产,建于唐朝,是中国古代建筑艺术的杰出代表。"
]
collection.add(
documents = test_documents,
metadatas = [{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}],
ids = ["id1", "id2", "id3"]
)

collection.query(
query_texts=["长城是哪个朝代修建的?"],
n_results=1
)
# {'ids': [['id1']],
# 'embeddings': None,
# 'documents': [['长城:中国的标志性建筑之一,是世界上最长的城墙,也是中国古代的军事防御工程,被誉为世界七大奇迹之一。']],
# 'metadatas': [[{'chapter': '3', 'verse': '16'}]],
# 'distances': [[0.6134731769561768]]}

collection.query(
query_texts=["在中国历史上,哪位皇帝曾经居住在位于北京市中心的那座古代宫殿?"],
n_results=1
)
# {'ids': [['id2']],
# 'embeddings': None,
# 'documents': [['故宫:位于北京市中心,是明清两代的皇宫,也是中国最著名的古建筑之一,被誉为“中华民族的瑰宝”。']],
# 'metadatas': [[{'chapter': '3', 'verse': '5'}]],
# 'distances': [[0.4222669303417206]]}

collection.query(
query_texts=["营造法式"],
n_results=3
)
# {'ids': [['id2', 'id3', 'id1']],
# 'embeddings': None,
# 'documents': [['故宫:位于北京市中心,是明清两代的皇宫,也是中国最著名的古建筑之一,被誉为“中华民族的瑰宝”。',
# '大雁塔:位于中国古都西安市,是一座古代佛教文化遗产,建于唐朝,是中国古代建筑艺术的杰出代表。',
# '长城:中国的标志性建筑之一,是世界上最长的城墙,也是中国古代的军事防御工程,被誉为世界七大奇迹之一。']],
# 'metadatas': [[{'chapter': '3', 'verse': '5'},
# {'chapter': '29', 'verse': '11'},
# {'chapter': '3', 'verse': '16'}]],
# 'distances': [[1.073906660079956, 1.2695903778076172, 1.2703778743743896]]}
  • sudo docker-compose restart 测试持久化

【迁移】基于Chroma搭建个人知识库的全文索引
https://hexo.limour.top/-qian-yi--ji-yu-Chroma-da-jian-ge-ren-zhi-shi-ku-de-quan-wen-suo-yin
Author
Limour
Posted on
April 26, 2023
Updated on
March 19, 2024
Licensed under