使用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のパラメータを設定

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)上访问。(根据前端构建方法适当更换)

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



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

在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中使用的示例。由于对象存储在云服务中具有不同的方言,并且往往会出现首次使用的需求,因此在方便快捷性方面具有优势。(当然,在非功能方面,使用托管服务可以实现更高级的功能,因此根据情况选择使用。)