使用Azure OpenAI的RAG与MinIO(OSS对象存储)一起

Minio是什么?

MinIO是一个开源的Amazon S3兼容的对象存储服务器软件。它可以使用Java、Go、Node.js、Python、.NET等编程语言进行开发,并且特别适用于Python,可以使用Boto3等库进行操作,非常吸引人。

使用Kubernetes,可以在公有云和私有云中实现无缝的使用。在Kubeflow中,它也被用作工件存储的地方(用于存储训练模型和执行日志等)。需要注意的是,集成在Kubeflow中的MinIO版本较旧(gcr.io/ml-pipeline/minio:RELEASE.2019-08-14T20-37-41Z-license-compliance)。

最新版本是RELEASE.2023-10-24T04-42-36Z,GUI界面也发生了重大改变,操作性也得到了改善,因此总结了安装和使用最新版本的步骤。

使用Azure OpenAI(chatgpt)RAG進行協作的方式

如果在RAG中存储源文件实体,并将其链接作为元数据存储在VectorStore中,那么可以将其作为ChatGPT答案的依据源显示出来,这对于抑制幻觉效果是有效的。
当然,Azure Blob、S3和GCS也可以,但Azure Blob在使用上稍显复杂,而且在S3和GCS上专门实施多云化也不太好。因此,我尝试在AKS上构建并使用MinIO服务器来解决这个问题。
(由于AKS的PV以及在Azure上,文件保存在块设备上,因此在可用性方面需要考虑基础架构层面的措施。)

 

在Kubernetes上安装MinIO。

在Kubernetes上安装的步骤如下(应用清单)。
在AKS上构建好k8s集群的前提下继续进行。

curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O
kubectl apply -f minio-dev.yaml

配置文件(编辑yaml)

随时调整宣言。

    • 専用のネームスペース(minio)を作成

 

    PasswordはSecretにbase64キーを入れる(セキュリティ)
apiVersion: v1
kind: Namespace
metadata:
  name: minio
---
apiVersion: v1
kind: Secret
metadata:
  namespace: minio
  name: minio
type: Opaque
data:
  MINIO_ROOT_PASSWORD: 【base64-key】
---

在中文中,可以这样表达:
通过以下命令获取Base64密钥。
(登录时使用原始密钥。)

$ echo "【key】" |base64
【base64-key】

音量和部署配置

    • 環境変数MINIO_ROOT_USER、MINIO_ROOT_PASSWORDにて管理ユーザ、パスワードを設定する。管理ユーザはadmin(パスワードは上記で設定のSecretを参照させる)

 

    • PVC 10GBで確保(要件に合わせて拡張)、/dataにマウント。

 

    • ポートは9000と9001をあける。

 

    9001は管理アクセス(ダッシュボード)。/minio/でアクセスする。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-minio
  namespace: minio
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: default
  resources:
    requests:
      storage: 10Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: minio
  name: minio
  labels:
    app: minio
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
    spec:
      containers:
        - name: minio
          image: minio/minio:latest
          command:
          - /bin/bash
          - -c
          args:
          - minio server /data  --console-address :9001


          resources: {}
          ports:
            - containerPort: 9000
            - containerPort: 9001
          imagePullPolicy: Always

          env:
            - name: MINIO_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: minio
                  key: MINIO_ROOT_PASSWORD

            - name: MINIO_ROOT_USER
              value: admin

            - name: MINIO_BROWSER_REDIRECT_URL
              value: https://【URL】/minio/

          volumeMounts:
            - name: minio-vol
              mountPath: /data

      volumes:
        - name: minio-vol
          persistentVolumeClaim:
            claimName: pvc-minio
---

在前端部署NGINX。这是为了区分管理访问和内容访问。

    • /minio/ アクセスは9001に振り分け→管理用アクセス

 

    • /file/ アクセスは9000に振り分け→コンテンツ用アクセス

 

    configmapにてnginxのパラメータを設定
image.png
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: minio
data:
  nginx.conf: |-


    server {
        listen       80;
        listen  [::]:80;
        #server_name  localhost;
        server_name  【URL】;

        # To allow special characters in headers
        ignore_invalid_headers off;
        # Allow any size file to be uploaded.
        # Set to a value such as 1000m; to restrict file size to a specific value
        client_max_body_size 0;
        # To disable buffering
        proxy_buffering off;
        proxy_request_buffering off;

        location /minio/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-NginX-Proxy true;

            # This is necessary to pass the correct IP to be hashed
            real_ip_header X-Real-IP;

            proxy_connect_timeout 300;
            
            # To support websocket
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            
            chunked_transfer_encoding off;

            proxy_pass http://minio.minio.svc.cluster.local:9001/;
        }



        location /file/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_connect_timeout 300;
            # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            chunked_transfer_encoding off;


            proxy_pass http://minio.minio.svc.cluster.local:9000/;
        }
    }

---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: minio
  name: minio-nginx
  labels:
    app: minio-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minio-nginx
  template:
    metadata:
      labels:
        app: minio-nginx
    spec:
      containers:
        - name: minio-nginx
          image: nginx:1.19.2-alpine
          ports:
            - containerPort: 80
          volumeMounts:
            - name: conf
              mountPath: /etc/nginx/conf.d/
      volumes:
        - name: conf
          configMap:
            name: nginx-config

---
kind: Service
apiVersion: v1
metadata:
  namespace: minio
  name: minio-nginx
  labels:
    app: minio-nginx
spec:
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80

  selector:
    app: minio-nginx
  type:  ClusterIP

---
kind: Service
apiVersion: v1
metadata:
  namespace: minio
  name: minio
  labels:
    app: minio
spec:
  ports:
    - name: http
      protocol: TCP
      port: 9001
      targetPort: 9001


    - name: http2
      protocol: TCP
      port: 9000
      targetPort: 9000

  selector:
    app: minio
  type:  ClusterIP
---

根据需要为外部访问进行配置。
按需设置虚拟服务。
(以下是在Kubeflow内部部署的情况下。)

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: minio
  namespace: minio
spec:
  gateways:
  - kubeflow/kubeflow-gateway
  hosts:
  - '*'
  http:
  - match:
    - uri:
        prefix: /minio
    rewrite:
      uri: /minio
    route:
    - destination:
        host: minio-nginx.minio.svc.cluster.local
        port:
          number: 80

  - match:
    - uri:
        prefix: /file
    rewrite:
      uri: /file
    route:
    - destination:
        host: minio-nginx.minio.svc.cluster.local
        port:
          number: 80

利用 – 利用 (lì – to make use of/utilize/exploit

可以通过使用浏览器进行管理访问,或通过API操作(例如boto3)来对MinIO进行文件操作。下面是通过浏览器进行操作的说明。

管理访问

可以根据浏览器设置,在适当的地址(URL/minio)上访问。(根据前端构建方法适当更换)

image.png

创建一个桶

使用「创建桶」来创建一个 Bucket。

image.png
image.png
image.png

文件上传

使用对象浏览器,将文件拖放到通过创建的存储桶中进行上传。

image.png

在LLM的RAG中的使用

可以通过URL/file/~来访问文件,将其设置为Cognitive Search的元数据(源)链接,并提供作为RAG问题解答的依据(来源)(理由)。

将以下句子用中文进行释义,只需一种选项:
例)将Source设置为一个指向文件的访问URL
https://【URL】/file/【Bucket名称】/【文件名称】

# Cognitive Searchへの登録例
documents = [{'@search.action': 'upload',
              'content': t.page_content,
              'id': prefix + str(i),
              'title': t.metadata['title'],
              'source': t.metadata['source'],
             } for i, t in enumerate(splitted_docs)]

result = search_client.upload_documents(documents=documents)

“请用中文将以下提示的语句改写成另一种表达方式:プロンプト例。”

Sourcesを元にmarkdown書式で回答してください。
回答の最後に参照した全てのSourceのリンクを[title](source)の書式で箇条書きで示してください。

以下为问题的其中一个答案:

回答
  xxxx

参照したSources:
  [title](URL "タイトル")  ※titleの内容の外部リンク

关于网关功能

如果在Kubeflow中使用,安装分发版时,文件实体将不会存储在MinIO的持久卷中,而是使用托管的云服务的对象存储(如GCS等)进行了网关配置。当前最新版本中,该功能已被冻结,无法使用。(似乎难以追随S3 API的变化)

总结

整理了OSS对象存储MinIO的安装、配置以及从Azure OpenAI等的RAG中使用的示例。由于对象存储在云服务中具有不同的方言,并且往往会出现首次使用的需求,因此在方便快捷性方面具有优势。(当然,在非功能方面,使用托管服务可以实现更高级的功能,因此根据情况选择使用。)

广告
将在 10 秒后关闭
bannerAds