RAG的过程
实现一个RAG,自己需要写代码实现这样的两个阶段:
- 数据加载阶段:文件加载 -> 文件分片 -> 内容向量化 -> 存入向量库 -> 建立向量索引
- 检索阶段:用户问题 -> 向量化用户问题 -> 向量语议检索出相关内容 -> 问题增强(提示词) -> 提交给大语言模型 -> 返回结果。
Oracle 23ai RAG
RAG是一个面向数据的检索方法,因此,由数据层面的基础设施完成数据相关的工作是比较合理的。
Oracle 23ai 推出了 SelectAI RAG,用户不再需要写代码就可以实现整个RAG的过程,直接用SQL语句就可以返回RAG的结果:
详细配置步骤
主要包括以下这些步骤(前面六步是数据加载(Data Loading)的配置)。
- Data Loading Step1: Whitelist the provider for API access
BEGIN
-- allow connecting to outside hosts
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => 'OUSER',
principal_type => xs_acl.ptype_db));
END;
/
- Data Loading Step2: Create Credential for Vector Embedding
declare
jo json_object_t;
begin
jo := json_object_t();
jo.put('user_ocid','ocid1.user.oc1..aaaaaaaaxxxxxxx');
jo.put('tenancy_ocid','ocid1.tenancy.oc1..aaaaaaaaxxxxxx');
jo.put('compartment_ocid','ocid1.compartment.oc1..aaaaaaaapxxxxxxx');
jo.put('private_key','private key content string');
jo.put('fingerprint’,’xx:xx:xx:…');
dbms_vector.create_credential(
credential_name => 'VECTOR_OCI_GENAI_CRED',
params => json(jo.to_string));
end;
/
- Data Loading Step3: Create Embedding Profile
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'OCI_TEXT_TRANSFORMER',
attributes => '{"provider": "oci",
"credential_name": "VECTOR_OCI_GENAI_CRED",
"embedding_model": "cohere.embed-multilingual-v3.0",
"oci_compartment_id": "ocid1.compartment.oc1..aaaaaaaa…",
"region": "us-chicago-1"
}');
END;
/
- Data Loading Step4: Create Credential for Object Storage and OCI LLM Service
begin
DBMS_CLOUD.CREATE_CREDENTIAL (
credential_name => 'OCI_GENAI_CRED',
user_ocid => 'ocid1.user.oc1..aaaaaaaaxxxxxx',
tenancy_ocid => 'ocid1.tenancy.oc1..aaaaaaaaxxxxxx',
private_key => 'private key string',
fingerprint => 'xx:xx:xx……' );
end;
/
- Data Loading Step5: Create Vector Index For Files in Object Storage
BEGIN
DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
index_name => 'DEMO_VECTOR_INDEX',
attributes => '{"vector_db_provider": "oracle",
"location": "https://objectstorage.{region}.oraclecloud.com/n/{namespace}/b/{bucket}/o/{folder}",
"object_storage_credential_name": "OCI_GENAI_CRED",
"profile_name": "OCI_TEXT_TRANSFORMER",
"vector_dimension": 1024,
"vector_distance_metric": "cosine",
"chunk_overlap":128,
"chunk_size":1024,
"refresh_rate":120}');
END;
/
-- refresh_rate 这里设成了120分钟,表示每隔2小时数据库会自动检查对象存储中的内容变化及自动更新数据
- Data Loading Step6: Create SelectAI Profile
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'PROFILE_OCI_SELECTAI_RAG_LLAMA33_70B',
attributes => '{"provider": "oci",
"credential_name": "OCI_GENAI_CRED",
"vector_index_name": "DEMO_VECTOR_INDEX",
"temperature": 0,
"max_tokens": 4000,
"model": "meta.llama-3.3-70b-instruct",
"embedding_model": "cohere.embed-multilingual-v3.0",
"oci_compartment_id": "ocid1.compartment.oc1..aaaaaaaa…",
"region": "us-chicago-1",
"enable_sources": true }');
END;
/
完成前面六步数据加载的配置后,上传相关的一些文档到指定的对象存储目录,就可以通过SQL语句直接查询RAG结果了,比如:
“什么是 ADB Schema Advisor?” 这个问题,通过 SQL 可以直接查看:
EXEC DBMS_CLOUD_AI.SET_PROFILE('PROFILE_OCI_SELECTAI_RAG_LLAMA33_70B’);
SELECT AI NARRATE '什么是 ADB Schema Advisor?’;
得到如下结果:
非常简单方便,数据库直接帮我们做了整个RAG的过程,应用程序就只要像执行传统的SQL一样获取结果就行了。