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

Last updated on November 10, 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` 测试持久化

#docker #rag
【迁移】基于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
November 10, 2024
Licensed under
【迁移】Docker搭建vicuna Previous
【杂感】观《汪诘：在空中爆炸的星舰，为何赢得全程掌声？》有感 Next

#### Search

Keyword