2023-04-26-【迁移】基于Chroma搭建个人知识库的全文索引.md 5.8 KB


title: 【迁移】基于Chroma搭建个人知识库的全文索引 urlname: -qian-yi--ji-yu-Chroma-da-jian-ge-ren-zhi-shi-ku-de-quan-wen-suo-yin date: 2023-04-26 19:57:21

tags: ['chroma', 'docker']

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

构建Docker镜像

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
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镜像

nano docker-compose.yml
sudo docker-compose up -d
sudo docker-compose logs
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

安装客户端

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

测试用例

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 测试持久化