注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它对 Oracle Cloud Infrastructure 身份证明、租户和区间使用示例值。完成实验室后,请使用特定于云环境的那些值替换这些值。
使用 Oracle Digital Assistant、OCI Data Science、LangChain 和 Oracle Database 23ai 构建企业聊天机器人
简介
在当今的数字环境中,聊天机器人正逐渐变得智能化、响应迅速,并能够处理复杂的交互。在本教程中,我们将利用 Oracle Cloud Infrastructure (OCI) 数据科学功能(例如 AI 快速操作和模型部署、Mistral-7B-Instruct-v0.2、Oracle Database 23ai、LangChain 和 Oracle Digital Assistant)的强大功能,深入探讨如何创建新一代聊天机器人。每种技术都为桌面带来了独特的优势,使我们能够构建一个聊天机器人,不仅可以非常准确地理解和响应用户查询,还可以提供无缝且引人入胜的对话体验。
Oracle Database 23ai 的突出功能之一是其高级向量搜索功能。该技术允许通过将文本转换为高维向量来高效检索信息,然后将其进行比较以实现相关性。将 Oracle Database 23ai 的向量搜索集成到检索增强生成 (RAG) 管道中后,聊天机器人便能够从庞大的数据集访问和提供最相关的信息。这样可以确保生成的响应不仅在上下文上准确,而且与用户的查询高度相关。
Oracle Digital Assistant 提供了一个用于构建、部署和管理对话式 AI 解决方案的强大平台,进一步提升了聊天机器人的功能。它提供预构建连接器、自然语言理解 (NLU) 和对话管理,可简化开发流程并确保顺畅的用户体验。借助 Oracle Digital Assistant 与 RAG 管道的结合,聊天机器人可以处理复杂的交互,并保持自然对话流,从而提高用户参与度和满意度。
通过在 RAG 管道中利用 Oracle Database 23ai 和 Oracle Digital Assistant 的协同作用,开发人员可以创建在检索准确性和对话流动性方面都表现出色的聊天机器人。这种集成方法不仅可以减少构建复杂的聊天机器人所需的时间和精力,还可以提供可扩展、高效且能够提供卓越的用户体验的解决方案。无论您是开发人员、技术爱好者还是希望提高客户参与度的业务负责人,本教程都将为您提供知识和工具,以构建在拥挤的数字领域中脱颖而出的高级聊天机器人。
有关流程的逐步演练,请参阅 AI 示例 GitHub 存储库。
用例
以下是一些有用的用例示例:
-
个性化客户支持:查询指南手册和客户历史记录可以更好地了解客户问题,并帮助更快地诊断和解决问题。
-
供应链优化:使用内部业务订购或发运数据查询供应商数据可以做出更好的决策,并更快地响应供应链的变化。
-
优化销售:查询 CRM 数据以识别高潜力销售线索,并建议策略以提高交易达成概率。
Oracle AI Vector Search 的优势
Oracle Database 是一个先进的运营和企业数据存储库。企业应用通常需要搜索业务数据与非结构化数据的组合。例如,零售网站可以基于自然语言产品描述和目标产品图像以及其他筛选器(例如价格、门店位置、制造商和当前可用性)提供搜索功能。此搜索需要同时搜索非结构化目录数据(产品描述和图像)、结构化目录数据(价格、存储位置和制造商)以及实时事务处理数据(例如当前库存)。
高级别体系结构解决方案概览
图:RAG 管道的高级架构
下图说明了使用 Mistral-7B-Instruct-v0.2、Oracle Database 23ai、RAG、LangChain 和 Oracle Digital Assistant 构建高级聊天机器人的体系结构和工作流。下面是以下体系结构中涉及的详细步骤。
-
用户交互:用户通过 Oracle Digital Assistant 界面向聊天机器人发送请求。
-
请求处理:Oracle Digital Assistant 会收到请求并将其转发到 OCI Data Science 基础设施。
-
查询处理:涉及 2 个步骤。
- 在 OCI Data Science 中,请求路由到 LangChain,LangChain 充当编排器来管理各种模型部署之间的交互。
- LangChain 处理请求并确定需要从外部文档和企业数据中检索信息。
-
矢量化:此步骤涉及以下子流程:
- 将请求发送到嵌入模型部署,该部署将查询转换为高维向量表示。
- 然后将此向量化查询发送到 Oracle Database 23ai 进行向量搜索。
-
数据检索:此步骤涉及以下子流程:
- Oracle Database 23ai 以 PDF 和 HTML 格式对文档形式的非结构化数据执行相似性搜索,并将该搜索与对数据库中其他业务数据的常规搜索相结合。
- 将检索相关文档或块,并将其发送到下一步以进行进一步处理。
-
重新排名:
- 生成的响应可以通过重新排序模型部署进一步细化。
- 重新排序模型对响应进行评估和排名,以确保选择最相关和最准确的响应。
-
查询外部模型:在此步骤中,检索数据并生成响应。
- 检索到的信息用于为使用 OCI Data Science 中的 AI Quick Actions 功能预配的 Mistral-7B-Instruct-v0.2 模型部署生成查询。
- Mistral-7B-Instruct-v0.2 模型处理查询,并根据其训练和检索的上下文生成响应。
-
响应生成:细化的响应将发送回 LangChain,其中合并最终输出。
-
将响应返回给用户:
- 最终响应将返回给数字助手。
- 然后,Oracle Digital Assistant 会向用户提供响应。
目标
- 利用 OCI Data Science 等新技术构建聊天机器人,例如 AI Quick Actions 和 Model Deployment、Mistral-7B-Instruct-v0.2、Oracle Database 23ai、LangChain 和 Oracle Digital Assistant。我们将引导您完成从设置基础 AI 模型到将它们集成到无缝对话体验的每一步。在本教程结束时,您将全面了解如何利用这些高级工具来创建智能、响应迅速且高效的聊天机器人,从而以自然且引人入胜的方式理解用户并与用户进行交互。
先决条件
在 OCI 数据科学服务上继续运行分布式微调流程之前,您需要设置的关键先决条件。
-
需要以下策略:
-
使用安全列表配置定制子网,以允许从源自子网的 CIDR 块中的 IP 入站到任何端口。这是为了确保子网上的主机在分布式训练期间可以相互连接。有关更多信息,请参见 Networking 。
-
设置允许 OCI 数据科学服务资源访问 OCI 对象存储存储桶、网络和其他资源的策略。有关详细信息,请参阅 OCI 策略。
-
从 HuggingFace 访问令牌以下载 Mistral-7B-Instruct-v0.2 模型。要对模型进行微调,首先需要访问预先训练的模型。预先训练的模型可从 HuggingFace 获取。在本教程中,我们将使用 HuggingFace 访问令牌从 HuggingFace 下载预先训练的模型(通过设置
HUGGING_FACE_HUB_TOKEN
环境变量)。 -
从 OCI 日志记录服务记录组和日志。这将用于监视培训进度。
-
转至 OCI 日志记录服务,然后选择日志组。
-
选择现有日志组之一或创建新日志组。
-
在日志组中,创建两个日志:一个预测日志和一个访问日志。
- 单击创建定制日志。
-
指定名称(预测) access) 并选择要使用的日志组。 - 在创建代理配置下,选择稍后添加配置。
- 单击创建代理配置。
-
-
用于启动分布式训练和访问微调模型的记事本会话。有关详细信息,请参阅记事本会话。
-
安装最新版本的 Oracle Accelerated Data Science (ADS)
pip install oracle-ads[opctl] -U
任务 1:部署必需的模型
任务 1.1:部署 Mistral-7B-Instruct-v0.2 模型
我们将利用 AI 快速操作模型部署功能,只需单击几下即可部署 Mistral-7B-Instruct-v0.2。AI Quick Actions 模型部署可帮助用户只需单击几下即可部署 Mistral-7B-Instruct-v0.2,并为用户提供端点。
任务 1.2:部署 Jina 嵌入模型
-
在记事本中,将 Jine Embedding 模型文件从 https://huggingface.co/jinaai/jina-embeddings-v2-base-en/tree/main 复制到
ads_embedding_model_dir
目录。 -
将
score.py
文件上载到当前目录(例如,/home/datascience/
)。 -
运行以下代码。
import tempfile import ads from ads.model.generic_model import GenericModel from config import CONDA_PACK_PATH, LOG_GROUP_ID, EMBEDDING_MODEL_ACCESS_LOG_LOG_ID, EMBEDDING_MODEL_PREDICT_LOG_LOG_ID ads.set_auth("resource_principal") embedding_model = GenericModel( model_file_name="model-w-mean-pooling.onnx" ,artifact_dir="ads_embedding_model_dir",estimator=None, serialize=False) embedding_model.summary_status() embedding_model.prepare( inference_conda_env=CONDA_PACK_PATH, inference_python_version = "3.9", model_file_name="model.onnx", score_py_uri= "score.py", force_overwrite=True ) op=embedding_model.verify(['Can you please give some overview on Oracle Database 23.4']) print(op['embeddings']); embedding_model.save(display_name="jina-embedding") embedding_md = embedding_model.deploy( display_name = "Jina Embedding Model Deployment", deployment_log_group_id = LOG_GROUP_ID, deployment_access_log_id = EMBEDDING_MODEL_ACCESS_LOG_LOG_ID, deployment_predict_log_id = EMBEDDING_MODEL_PREDICT_LOG_LOG_ID, ) output = embedding_md.predict(['Can you please give some overview on Oracle Database 23.4']) print(output['embeddings']);
任务 1.3:部署 Bge-Reranker 模型
运行以下代码。
import ads
from FlagEmbedding import FlagReranker
from ads.model.generic_model import GenericModel
from ads.model.model_metadata import MetadataCustomCategory
from config import CONDA_PACK_PATH, LOG_GROUP_ID, RERANKER_MODEL_ACCESS_LOG_LOG_ID, RERANKER_MODEL_PREDICT_LOG_LOG_ID
#
# This custom class wrap the reranker model
#
class Reranker:
def __init__(self, model_id):
self.model_id = model_id
self.reranker = FlagReranker(self.model_id, use_fp16=True)
def predict(self, x):
# x is expected as a list of list of str
# [["x1", "x2"]] -> y = [score12]
scores = self.reranker.compute_score(x)
return scores
reranker_model = Reranker(model_id="BAAI/bge-reranker-large")
reranker_payload = [
["what is panda?", "It is an animal living in China. In the future model input will be serialized by.In the future model input will be serialized by.In the future model input will be serialized by"],
["what is panda?", "The giant panda is a bear species endemic to China.In the future model input will be serialized by.In the future model input will be serialized by.In the future model input will be serialized by.In the future model input will be serialized by"],
]
reranker_model.predict(reranker_payload)
reranker_generic_model = GenericModel(estimator=reranker_model, artifact_dir="./reranker_dir")
reranker_generic_model.summary_status()
reranker_generic_model.prepare(
reload=False,
inference_conda_env=CONDA_PACK_PATH,
inference_python_version="3.9",
model_file_name="reranker.pkl",
force_overwrite=True
)
reranker_generic_model.save(
display_name="reranker2-baai-large",
bucket_uri="oci://reranker_bucket@bigdatadatasciencelarge/reranker/",
ignore_introspection=True
)
reranker_md = reranker_generic_model.deploy(
display_name = "reranker2-baai-large",
deployment_log_group_id = LOG_GROUP_ID,
deployment_access_log_id = RERANKER_MODEL_ACCESS_LOG_LOG_ID,
deployment_predict_log_id = RERANKER_MODEL_PREDICT_LOG_LOG_ID,
deployment_instance_shape="VM.Standard2.4",
)
任务 2:设置 Oracle Database 23ai
我们将使用 Oracle Database 23ai 的最新功能,特别是 Oracle AI Vector Search。在此方案中,我们将从数据集生成的嵌入导入 Oracle Database 23ai。当用户使用 RAG 进行查询时,将通过为 LLM 提供附加上下文来增强响应。下图显示了使用 Oracle Database 23ai 的一些优势。
图:Oracle Database 23ai 搜索功能图示(源)
这将增强他们的知识,从而做出更准确和更适合客户查询的响应。要设置 Oracle Database 23ai,请按照上述选项进行操作。
-
使用容器实例。有关详细信息,请参阅使用 Oracle Autonomous Database Free Container Image 。
-
使用 Python 客户端。
我们将使用 Oracle Database 23ai 的托管实例来演示 Oracle AI Vector Search 的强大功能。
任务 3:在 Oracle Database 23ai 中进行语法分析、分块和存储嵌入
以下代码片段简要概述了如何对文档进行语法分析、如何将文档转换为块,以及如何在 Oracle Database 23ai 中存储嵌入。有关详细信息,请参阅 oda-oci-data-science-oracledb-23ai-llm 。
初始化 Oracle Database 23ai
def load_documents(embedding_model):
# connect to db
# Configure logging
logging.basicConfig(
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
)
logging.info("Connecting to Oracle DB...")
DSN = f"{DB_HOST_IP}/{DB_SERVICE}"
with oracledb.connect(user=DB_USER, password=DB_PWD, dsn=DSN) as connection:
logging.info("Successfully connected to Oracle Database...")
num_pages = []
for book in INPUT_FILES:
logging.info(f"Processing book: {book}...")
if ENABLE_CHUNKING is False:
# chunks are pages
logging.info("Chunks are pages of the book...")
nodes_text, nodes_id, pages_num = read_and_split_in_pages([book])
num_pages.append(len(nodes_text))
else:
logging.info(f"Enabled chunking, chunck_size: {MAX_CHUNK_SIZE}...")
nodes_text, nodes_id, pages_num = read_and_split_in_chunks([book])
# create embeddings
# process in batch (max 96 for batch, chosen BATCH_SIZE, see above)
logging.info("Computing embeddings...")
embeddings = compute_embeddings(embedding_model, nodes_text)
# determine book_id and save in table BOOKS
logging.info("Registering document...")
book_id = register_document(book, connection)
# store embeddings
# here we save in DB
save_embeddings_in_db(embeddings, nodes_id, connection)
# store text chunks (pages for now)
save_chunks_in_db(nodes_text, nodes_id, pages_num, book_id, connection)
# a txn is a book
connection.commit()
任务 4:连接到 Mistral-7B-Instruct-v0.2 AI 快速操作 LLM
使用 AI Quick Actions 创建模型部署并从那里获取模型部署端点。运行以下代码以连接到 LLM。
import ads
ads.set_auth("resource_principal")
command_md = OCIModelDeploymentVLLM(
endpoint="https://modeldeployment.eu-frankfurt-1.oci.customer-oci.com/ocid1.datasciencemodeldeployment.oc1.<ocid>/predict",
model="odsc-llm"
)
任务 5:设置 RAG
以下 RAG 体系结构将包含以下步骤:
任务 5.1:上载到 23ai 向量数据库
class CustomRetriever(BaseRetriever):
def _get_relevant_documents(
self, query: str, *, run_manager: CallbackManagerForRetrieverRun
) -> List[Document]:
matching_documents = []
#Embedding model
rps = oci.auth.signers.get_resource_principals_signer()
prediction = requests.post(EMBEDDING_MD_ENDPOINT, data=f'["{query}"]', auth=rps)
#Search in DB
q_result = test_oracle_query(prediction.json()['embeddings'][0], TOP_K, True, False)
text_list = []
for n, id, sim in zip(q_result.nodes, q_result.ids, q_result.similarities):
text_list.append(n.text)
paired_list = [[query, text] for text in text_list]
print(f'Reranker payload: {paired_list}')
#ReRanker model
reranker_results = requests.post(RERANKER_MD_ENDPOINT, data=json.dumps(paired_list), auth=rps) # make a prediction request
max_value = max(reranker_results.json()['prediction'])
if max_value < -3:
return matching_documents;
# Find the index of the maximum value
max_index = reranker_results.json()['prediction'].index(max_value)
print(f"The maximum value is: {max_value}")
print(f"The index of the maximum value is: {max_index}")
doc = Document(page_content=paired_list[max_index][1], metadata={"source": "local"})
matching_documents.append(doc)
return matching_documents
customRetriever = CustomRetriever()
chain = RetrievalQA.from_chain_type(
llm=command_md,
retriever=customRetriever
)
prompt = "Can you please give some overview on Oracle Database 23.4?"
res = chain(prompt)
print('Output::')
print(res['result'])
我们使用 Langchain 提供的提示模板和 QA 链来创建聊天机器人,这有助于将上下文和问题直接传递给 LLM。
任务 5.2:部署 LangChain 模型
import tempfile
import ads
from ads.model.generic_model import GenericModel
from config import CONDA_PACK_PATH, LOG_GROUP_ID, LANGCHAIN_MODEL_ACCESS_LOG_LOG_ID, LANGCHAIN_MODEL_PREDICT_LOG_LOG_ID
ads.set_auth("resource_principal")
langchain_model = GenericModel( artifact_dir="langchain_model",estimator=None, serialize=False)
langchain_model.summary_status()
#Copy required python scripts to artifact dir
langchain_model.prepare(
inference_conda_env=CONDA_PACK_PATH,
inference_python_version = "3.9",
model_file_name="test",
score_py_uri= "score_langchain_final.py",
force_overwrite=True
)
op=langchain_model.verify('Can you please give some overview on Oracle Database 23.4?')
model_id = langchain_model.save(display_name="langchain-model")
deploy = langchain_model.deploy(
display_name="Langchain Model Deployment",
deployment_log_group_id = LOG_GROUP_ID,
deployment_access_log_id = LANGCHAIN_MODEL_ACCESS_LOG_LOG_ID,
deployment_predict_log_id = LANGCHAIN_MODEL_PREDICT_LOG_LOG_ID,
environment_variables={"CRYPTOGRAPHY_OPENSSL_NO_LEGACY":"1"},
deployment_instance_shape="VM.Standard2.4",
)
deploy.predict('Can you please give some overview on Oracle Database 23.4?')
任务 6:使用 Oracle Digital Assistant 为托管 RAG 的聊天机器人应用程序创建数字助手
任务 6.1:获取模型部署端点并添加策略
向调用模型提供方的实例添加 REST 服务。我们以 Oracle 模型部署为例,但您可以为任何 LLM 使用 REST 服务。
添加策略,以便 Oracle Digital Assistant 可以访问模型部署预测端点。转到身份和安全、策略,然后单击创建策略。
动态组的策略
Allow any-user to {DATA_SCIENCE_MODEL_DEPLOYMENT_PREDICT} in compartment Demo where request.principal.id='ocid1.odainstance.oc1.iad.<ocid>'
创建策略后,我们可以启动到 Oracle Digital Assistant 并将其在浏览器中打开。
任务 6.2:创建 LLM 提供程序 REST 服务
-
转到 Oracle Digital Assistant,导航到 Settings 、 API Services 、 LLM Services ,然后单击 +Add LLM Service 。
-
在 Create LLM Service(创建 LLM 服务)页面中,输入以下信息以向提供商的端点创建 Post 操作,然后单击 Create(创建)。
- 名称:为服务输入易于识别的名称。稍后您将引用此名称。
- 端点:复制和粘贴模型部署端点。
- Methods(方法):选择 POST 。
-
通过添加 API 密钥以及请求和响应有效负载示例来完成服务。
-
验证类型:选择 OCI 资源主用户。
-
内容类型:选择 application/json 。
-
正文:添加发送到请求的有效负载。例如:
{ "query": "Can you please give some overview on Oracle Database 23.4?" }
-
-
单击测试请求可检查
200
响应。
任务 6.3:创建技能
将 LLM 提供程序 REST 服务添加到实例后,我们现在需要创建一种技能,该技能可以调用此服务并通过其对话框流定义将用户连接到此服务。要创建此技能,请执行以下操作:
-
转到 Oracle Digital Assistant,导航到 Development(开发)和 +Skills 。
-
单击 + 新技能。
-
在创建技能页面中,输入以下信息,然后单击创建。
- 显示名称:添加名称。
- 对话框模式:选择可视。
- 对于其他字段,保留默认值。
任务 6.4:将技能连接到模型
现在,我们将通过使用事件处理程序创建定制组件来启用访问 LLM REST 服务的技能,该事件处理程序将 REST 有效负载转换为 LLM 提供程序和 Oracle Digital Assistant 均可接受的格式。
-
单击左侧导航栏中的组件图标和添加服务。
-
在创建服务页中,输入以下信息,然后单击创建。
- 名称:输入用于描述服务的名称。
- 服务类型:接受默认设置,选择嵌入式容器。
- 组件服务包创建类型:选择新建组件。
- 组件类型:选择 LLM 转换。
- 组件名:输入说明性名称。
- 模板:选择定制(位于其他下)。
-
完成的组件将显示在组件页中。
-
从组件页中选择组件以检查其部署状态。显示 Ready 时,您可以继续执行下一步。
确保启用了 Service Enabled(启用服务)(默认设置)。
任务 6.5:映射 LLM 服务提供商和 Oracle Digital Assistant 请求和响应
需要将技能对模型服务提供商的请求从 Oracle Digital Assistant 使用的接口(称为通用 LLM 接口 (CLMI))转换为服务提供商接受的格式。同样,从服务提供商返回的结果也需要转换为 CLMI。要启用此映射,以下 REST 服务事件处理程序方法必须具有特定于提供者的代码。
transformRequestPayload
.transformResponsePayload
.transformErrorResponsePayload
.
要打开事件处理程序代码编辑器并更新转换代码(在本例中为 Azure OpenAI),请按照以下步骤操作:
-
展开服务并选择事件处理程序。
-
单击 Edit 图标以打开编辑器。
-
将
transformRequestPayload
处理程序事件方法代码(围绕第 24-26 行)替换为以下代码。-
transformRequestPayload
:transformRequestPayload: async (event, context) => { return { "query": event.payload.messages[event.payload.messages.length - 1].content }; },
我们只需要将最后一个用户输入传递到 LLM 提示符。
-
-
将
transformResponsePayload
处理程序事件方法代码(围绕第 35-37 行)替换为以下代码。-
transformRequestPayload
:transformResponsePayload: async (event, context) => { return { candidates: [ { "content": event.payload.prediction || "" }]}; },
-
-
将
transformErrorResponsePayload
处理程序事件方法代码(围绕第 47-49 行)替换为以下代码。-
transformRequestPayload
:transformErrorResponsePayload: async (event, context) => { let errorCode = 'unknown'; if (event.payload.error) { if ( 'context_length_exceeded' === event.payload.error.code) { errorCode = 'modelLengthExceeded'; } else if ('content_filter' === event.payload.error.code) { errorCode = 'flagged'; } return {"errorCode" : errorCode, "errorMessage": event.payload.error.message}; } return {"errorCode" : errorCode, "errorMessage": JSON.stringify(event.payload)}; }
-
-
单击验证以检查代码语法。如果遇到无法修复的语法错误,请使用它来替换编辑器中的代码。
-
单击保存和关闭。等待完成部署。显示 Ready 时,您可以继续执行下一步。
任务 6.6:定义技能的 LLM 服务
要使用户能够通过对话框流连接到模型,您需要创建一个 LLM 服务,该服务将调用模型的实例范围的 LLM 服务与转换事件处理程序(在这种情况下用于 Oracle 模型部署)相结合。
-
单击左侧导航栏中的设置图标。
-
单击配置。
-
在 Large Language Models Services(大语言模型服务)页面中,单击 +New LLM Service(LLM 服务)。
-
输入下列信息
-
名称:为 LLM 服务输入可轻松识别的名称。在下一步中构建对话框流时将引用此名称。
-
LLM 服务:选择您在任务 1:为模型创建 REST 服务中创建的实例范围 LLM 服务的名称。
-
转换处理程序:在任务 3:将技能连接到模型中选择作为 REST 服务的一部分创建的事件处理程序组件的名称。
-
将其余属性保留在其默认设置中。请注意,如果这是您迄今为止为本教程创建的唯一服务,则将启用默认。
-
-
单击保存。
-
取消选择交换机上的反馈和其他缺省值。
任务 6.7:集成服务
现在,该技能已连接到 LLM,请通过创建一个对话框流组件来将技能的用户连接到模型,该对话框流组件可以调用该模型并告诉其执行什么操作。组件使用提示传达这些指令,提示是人类可读文本的块。在本任务中,我们将提供此提示,指示模型将用户反馈评估为正反馈或负反馈或中立反馈。
-
单击左侧导航栏中的流图标。
-
选择 unresolvedIntent 。
-
在 unresolvedMessage 状态下,单击 ellipsis(...) 图标,然后从菜单中选择添加状态。
-
选择 Service Integration(服务集成)和 Invoke Large Language Model(调用大语言模型)。
-
输入类似于情绪分析的说明,然后单击插入。
对话框流现在包括
unresolvedMessage
(发送消息)状态、invokeLLM
状态和showLLMError
状态。 -
在
unresolvedMessage
状态下,单击 ellipsis(...) 图标,然后从菜单中选择删除,因为我们不想显示 UnresolvedIntent 的错误消息。对话框流现在仅包括
invokeLLM
状态和showLLMError
状态。 -
打开
invokeLLM
状态。在组件页中,选择我们在任务 6.6 中创建的 LLM 服务。 -
通过在提示中粘贴以下内容,添加用于将指令发送到 LLM 服务的提示。所有用户对话都应作为提示输入进行传递。
-
创建
PROMPT_INPUT
变量。单击提示参数 + 以添加新参数及其值。 -
将使用流处理设置为假,以便消息完整地传送,而不是增量传送。
-
使用提示生成器测试提示,然后单击构建提示
-
添加 Prompt Parameter Mock Value(提示参数模拟值)并单击 Generate Output(生成输出)。通过这种方式,我们可以验证 LLM 集成。
任务 6.8:使用技能测试器测试提示
-
单击预览以打开技能测试器。
-
输入以下请求:能否概述 Oracle Database 23.4?。
输出应如下所示:
-
向 LLM 询问下一个查询:最新 oracle 数据库。
输出应如下所示:
任务 6.9:设置 Oracle Web 用户渠道
我们将创建一个 Oracle Digital Assistant 用户渠道,使 Oracle Web 客户机能够访问技能。为了确保只有我们的 Web 客户端才能使用此通道,我们将将其配置为需要客户端验证。
-
打开 Oracle Digital Assistant,导航到开发、渠道,然后单击 +Add 渠道。
-
在创建通道中,输入以下信息以对提供程序的端点创建 POST 操作,然后单击创建。
- 名称:以字母开头且仅包含字母、数字、句点和下划线的唯一名称。例如,
OCI_MD_LLM
。 - 说明(可选):渠道的用途。
- 渠道类型:选择 Oracle Web 。
- Allowed Domains(允许的域):输入
*
。 - Client Authentication Enabled(已启用客户机验证):取消选择。
- 名称:以字母开头且仅包含字母、数字、句点和下划线的唯一名称。例如,
-
取消选择 Client Authentication Enabled(启用客户机验证)(如果尚未禁用)。
-
在路由中,选择要使用的技能。我们选择了当前技能 LLM-MD-Skill 。
-
启用已启用渠道。
-
请注意为此通道显示的不带 https 的 Channel Id 和 ODA Domain URI 。
我们将在 Web 应用程序和令牌生成器的路由配置中使用这些值。
任务 6.10:安装 SDK
下载 zip 并将其提取到您的本地系统。此 zip 包含一个用户指南,其中描述了 SDK 的类,以及一个示例应用程序,演示了 SDK 的许多功能。
-
转到 Oracle Digital Assistant (ODA) 和 Oracle Mobile Cloud (OMC) 下载和 Oracle Native Client SDK(适用于 OCI Native Environment)Web SDK 部分。
-
下载 ODA Web SDK 24.06 。
-
在平台中,选择通用。
-
单击以下载最新的 ODA Js SDK,即
oda-native-client-sdk-js-24_06 for (GENERIC (All Platforms)
。 -
提取下载的 zip 文件。
任务 6.11:测试 Oracle Web 应用程序
-
转到下载的 Oracle Web SDK 的解压缩 zip 文件夹。
-
打开
samples/web/settings.js
文件并将<URI>
和<channelId>
替换为实际值。例如:
- URI:
oda-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-dax.data.digitalassistant.oci.oraclecloud.com
。 - ChannelId:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
.
- URI:
-
另外,确保
isClientAuthEnabled
为 false。let isClientAuthEnabled = false;
-
在任何浏览器上运行
samples/web/index.html
文件。 -
忽略索引文件内容。单击聊天图标,将显示 Oracle Assistant CONNECTED 状态。
-
这就是我们网站在右下角使用聊天图标的方式。我们可以开始谈话,就像我们之前在技能测试器上所做的那样。
任务 6.12:在 OCI 计算实例上发布
-
创建 OCI 计算实例。有关详细信息,请参阅创建实例
-
确保您具有以下入站规则。
-
将所有 Web 文件夹复制到新创建的实例。
-
安装 NGINX。有关更多信息,请参见 Install the NGINX Web Server and Proxy on Oracle Linux 。
-
打开浏览器并导航到
http://<IP_address>/
。如果您有自签名证书,则可以导航到https://<IP_address>/
。
结果
让我们比较直接询问 LLM 与使用 RAG 与 LLM 的输出:
-
LLM 的回应
-
来自 RAG 的响应
后续步骤
使用 Oracle Database 23ai、RAG、LangChain、Mistral-7B-Instruct-v0.2 和 Oracle Digital Assistant 构建高级聊天机器人,展示了集成尖端技术以创建高度响应和智能对话代理的强大功能。从请求处理到响应生成,详细的工作流程可确保聊天机器人能够高效地检索和处理大量信息,为用户提供准确且与上下文相关的答案。通过利用 Oracle Database 23ai 的向量搜索功能和 Oracle Digital Assistant 提供的强大平台,开发人员可以显著提高聊天机器人的性能和用户参与度。这种集成方法不仅简化了开发流程,而且还带来了可扩展、高效、高效的 AI 解决方案,在数字助手的竞争格局中脱颖而出。无论是客户服务、信息检索还是交互式支持,这种高级聊天机器人架构为创建满足现代用户需求的复杂对话体验铺平了道路。
有关如何使用 AI Quick Actions 的更多信息,请转到 Oracle Cloud Infrastructure Data Science YouTube 播放列表以查看 AI Quick Actions 演示视频,并查找我们的技术文档,以及有关提示和示例的 Github 存储库。
如果要向 AI Quick Actions 添加特定模型或有任何问题,请发送电子邮件至 OCI Data Science 组:ask-oci-data-science_grp@oracle.com 。
相关链接
-
试用 Oracle Cloud 免费试用!通过为期 30 天的试用版和价值 300 美元的免费储值,您可以访问 Oracle Cloud Infrastructure Data Science 服务。有关详细信息,请参见以下资源:
-
为我们的新 GitHub 存储库加星标并克隆!我们提供了笔记本教程和代码示例。
-
观看 YouTube 上的教程
-
搜索 Oracle 数据科学并尝试 LiveLabs 。
确认
-
作者 — Shekhar Chavan(OCI 数据科学技术人员首席成员)、Ashutosh Kumar(OCI 数据科学技术人员首席成员)
-
贡献者 — Piyush Gajjariya(OCI 数据科学软件开发经理)、Tzvi Keisar(产品管理总监)、SriRanjith R(OCI 数据科学高级技术人员)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Build an Enterprise Chatbot with Oracle Digital Assistant, OCI Data Science, LangChain and Oracle Database 23ai
G13780-01
August 2024