--- 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镜像 ```bash 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 ``` ```Dockerfile 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镜像 ```bash nano docker-compose.yml sudo docker-compose up -d sudo docker-compose logs ``` ```yml 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 ``` ## 安装客户端 ```bash 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 ``` ## 测试用例 ```python 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` 测试持久化