Accelerating Care Delivery: Agentic AI Apps on Databricks | by AI on Databricks | Jul, 2025 | Mediumの翻訳です。
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
著者: Yatish Anand (Sr. Solutions Architect @ Databricks), Bo Cheng (Solutions Architect @ Databricks)
DatabricksはMosaic AIエージェントフレームワークを通じて、どのように医療保険の問い合わせと治療の推奨を効率的にするのか。
モダンな医療オペレーションにおいては、スピード、精度、スケーラビリティが重要となります。保険控除の検証から、複雑な治療においてコスト効率の高い医療従事者を特定に至るまで、管理者の意思決定は迅速で信頼できるものでなくてはなりません。ヘルスケアのデータは急激に複雑かつ散財するようになっているため、従来のシステムはついていくことに苦慮しています。ここで、推論、計画、複数ステップのタスクを実行できるインテリジェントかつゴール志向のエージェントAIアプリケーションがランドスケープを変革することになります。
このイノベーションの中心には、構造化、非構造化データを用いた複雑なワークフローを実行できる堅牢かつツールで拡張されたエージェントの作成を可能とするDatabricks Agent Frameworkが存在しています。Unity Catalog、Databricks SQL、レイクハウスアーキテクチャ、OpenAIモデルを活用することで、企業はヘルスケアデータ動的にやり取りを行い、同時に複数のツールをオーケストレーションし、迅速でコンテキストに基づくレスポンスを提供できるインテリジェントなエージェントを構築することができます。
この記事では、Databricks Agent Frameworkを用いて、収益の検証、医療従事者の比較のような複数ステップのクエリールーチンを自動化するDatabricksでヘルスケアフォーカスエージェントの設計、実装方法を探索します。ワークフローのガバナンス、可観測生、スケーラビリティを維持しつつもAIドリブンの意思決定を加速する方法を説明します。
課題: ヘルスケアQ&Aにおけるボトルネック
従来は、「近くで人工股関節置換術を行う際のコストは?それはカバーされているのか?私の住所の近くにあるベストな医療提供者は?」 というような保険の質問に回答するには複数のステップが含まれています:
- ユーザーと位置の特定
- 控除、ポリシー情報の収集
- 医療用語(CPTコードなど)の解釈
- 治療コストの見積もり
- 位置に基づいて医療従事者を提案
手動あるいは逐次的に回答する場合、それぞれのステップでの遅延を引き起こし、顧客や顧客サポートをイラつかせる遅れを生み出します。
ソリューションアクセラレータ: Databricksで並列にツールを呼び出すエージェントの構築
ヘルスケアAIエージェントシステムを構成するいくつかのキーとなるコンポーネントが存在します:
- チャットモデル(LLM): チャットモデルは入力としてメッセージのリストを受け取り、出力としてメッセージを返却するインタフェースを提供します。LLMにおける最新のイテレーションはツール呼び出しと構造化アウトプットを可能にしています。このソリューションアクセラレータでは、デフォルトでOpenAIはツールを並列で呼び出しますので、これらのモデルの一つであるgpt-4.1-miniを活用します。Anthropicのように並列ツール呼び出しをサポートする他のモデルプロバイダーを活用することも可能です。
- フレームワーク: langgraphのような低レベルオーケストレーションフレームワークやdatabricks-agentsのようなデプロイメントフレームワークを組み込むことで、LLMやツール呼び出しのための様々なAPIの間のやり取りを容易に組み込み、抽象化することができます。
- ツールと知識ベース: ここでは、DBSQLやPythonで定義されたUnity Catalog関数呼び出しが、追加の文脈を用いてエージェントを支援することができます。さらに、この例では住所固有の医者の推奨を提供するために、langchainからGoogle Search APIツールであるSerperを活用します。
- 構造化アウトプット: この場合、我々はエージェントに特定のスキーマにマッチするアウトプットを返却してほしいと考えています。回答、推奨の医師、関係する緯度経度を返却することで、地図に表示するために後段のDatabricks Appでこのテキストを抽出することができます。
- Databricks Apps: Databricksに直接デプロイされたAIアプリはUnity Catalog、DBSQL、Mosaic AIモデルサービングとネイティブで連携し、エンドユーザーはエンドポイントとチャットすることができ、streamlitの地図にトップの医師の住所を可視化します。
以降のセクションでは、複数のツールを呼び出し、構造化フォーマットでレスポンスを生成するシングルスレッドのチャットボットの構築、デプロイする方法の例をデモします。そして、databricks-agentsデプロイメントフレームワークとMosaic AIモデルサービングを用いてモデルをサービングし、エンドの利用者にサービスを提供するDatabricks Appの簡単なインタフェースを提供します。
注意:
このデモでは、(エージェントを開発する際にDatabricks AI Bridgeインテグレーションパッケージを含む)以下のライブラリを使用します。セットアップの観点では、ノートブックでDatabricksサーバレスコンピュートを活用します。この記事の最後には、カバーしたすべてのコードを含むGitHubリポジトリを含めています。
mlflow
langchain
langgraph==0.3.4
databricks-langchain
pydantic
databricks-agents
unitycatalog-langchain[databricks]
uv
langchain-openai
ツールとしてのUnity Catalog関数と知識ベースの活用
LLMの文脈でのヘルケアの拡張にはツール呼び出しが必要となります。Databricksにおいては、Vector Search インデックスの取得、キーコンポーネントの抽出などのルーチンでの特定のタスクを完了するために、ツールとしてDBSQLやPythonのUnity Catalog関数を作成、共有することができます。
Unity Catalog(UC)は、ヘルスケアデータ、AI資産に対する集中管理されたガバナンスフレームワークを提供し、重要なセキュリティ、発見可能性、再利用可能性、リネージなどのメリットを提供します。構造化データ(Deltaテーブル)や非構造化データ(Mosaic AI Vector Search)は同様にUCによって管理されます。これによって、UCによってホスト、管理されるカスタム関数(AIエージェントツール)を通じて資産に安全かつセキュアにアクセスできます。このアプローチは、開発の効率を改善し、すべてのデータのやり取りは管理、保護されることを確実にします。
我々の例では、AIヘルスケアエージェントのために以下のUnity Catalog関数を作成しています。
- extract_member_id: 後段のツールのために入力プロンプトから顧客のメンバーIDを抽出するための、Databricksの事前配備かつホストされているdatabricks-meta-llama-3–1–8b-instructとai_queryを活用するDBSQLの関数。
- extract_deductible: 入力としてmember_idが指定された際に関係するメンバーの控除の詳細を返却するDBSQL関数。
- cpt_codes_vector_search: 入力プロンプトに最も適切なテキストの説明文を収集し、最も関係するコードを返却するためにMosaic AI Vector Searchインデックスにクエリーを行うDBSQL関数。
- get_procedure_cost: 上の関数からprocedure_codeが提供された際、このDBSQL関数は対象の治療のコストを提供します。
これらをDBSQLコードとして、Databricks SQLエディタやDatabricksノートブックのSQLセルを使って直接実行することができます:
-- Create a SQL function that extracts member_id given a patient question
CREATE OR REPLACE FUNCTION catalog.schema.extract_member_id(
question STRING COMMENT 'input patient question'
)
RETURNS STRING
COMMENT 'Returns member_id given a patient question'
RETURN AI_QUERY(
'databricks-meta-llama-3-1-8b-instruct',
CONCAT(
'### Instruction:\nExtract only the member ID from the input text. '
|| 'Return only the member ID with no extra text.\n\n'
|| '### Input:\n',
question,
'\n\n### Response:'
),
'STRING'
)
-- Create a SQL function that returns the associated member’s deductible detail
CREATE OR REPLACE FUNCTION catalog.schema.extract_deductible(
member_id STRING COMMENT 'Member id'
)
RETURNS TABLE
COMMENT 'Returns member deductible details about a customer'
RETURN
SELECT
mem_deductible,
mem_ded_agg
FROM
catalog.schema.member_accumulators a
WHERE
a.member_id = member_id
LIMIT 1;
-- Create a SQL function that calls the vector_search() AI Function
CREATE OR REPLACE FUNCTION catalog.schema.cpt_codes_vector_search(
question STRING COMMENT 'The question string for searching insurance cpt codes and their descriptions'
)
RETURNS TABLE
COMMENT 'Executes a search on cpt codes to retrieve text descriptions most relevant to the input question.'
RETURN
SELECT
description,
code
FROM
vector_search(
index => 'catalog.schema.cpt_codes_index',
query => question,
num_results => 1
);
-- Create a SQL function that returns cost for a procedure code
CREATE OR REPLACE FUNCTION catalog.schema.get_procedure_cost(
procedure_code STRING COMMENT 'Procedure code'
)
RETURNS TABLE
COMMENT 'Returns cost for a procedure code'
RETURN
SELECT
cost as procedure_cost
FROM
catalog.schema.procedure_cost a
WHERE
a.procedure_code = procedure_code
LIMIT 1;
関数を作成したら、指定されたらカタログ、スキーマの関数タブで確認することができます。
しかし、この例ではWebから検索を行う必要がありますので、langchainの機能を組み込んでいます:
- GoogleSerperAPIWrapper: 指定されたIPアドレスに基づいて住所固有の医師の提案を提供するために、Webを検索します。
- ResponseFormatter: 構造化アウトプットスキーマを定義するためにPydanticを用いて、モデルに対するスキーマを呼び出すためにツールを使用することができます。
class ResponseFormatter(BaseModel):
"""Always use this tool to structure your response to the user."""
answer: str = Field(
description="The answer to the user's question without doctor's location data"
)
first_doctor: str = Field(description="The first recommended doctor's name")
first_doctor_lattitude: str = Field(
description="The first recommended doctor's latitude and direction"
)
first_doctor_longitude: str = Field(
description="The first recommended doctor's longitude and direction"
)
search = GoogleSerperAPIWrapper()
tools = [
ResponseFormatter,
Tool(
name="Intermediate_Answer",
func=search.run,
description="useful for when you need to ask with search",
),
]
LangGraphによるオーケストレーション
Databricksでコードを用いたAIエージェントの開発は、LangGraphオーケストレーションフレームワークと直接連携します。このソリューションでは、Databricks AI Bridgeの一部であるdatabricks-langchainインテグレーションのような構築済みのインテグレーションを用いることで、チャットモデル(LLM)に渡される関数をモジュール化するためにツールをどのように連携できるのかをカバーします。
システムプロンプトでは、以下のルーチンをLLMに提供していることを示しています。推論をスピードアップするためにルーチンで定義したツールのいくつかの呼び出しは並列で実行される場合があるため、OpenAIではparallel_tool_callパラメータをサポートしていることからChatOpenAIモデルのgpt-4.1-miniを活用することにしました。
AnthropicのClaude 4 SonnetのようなDatabricksネイティブモデル(ご存知なければこちらの発表をご覧ください)を使いたいとしましょう。この場合、ChatDatabricksモデルとして定義を行い、ChatOpenAIモデルの代わりにlanggraphに引き渡すことができます。一つ注意点としては、parallel_tool_call引数はまだサポートされておらず、ロードマップにあるということです:
LLM_ENDPOINT_NAME = "databricks-claude-sonnet-4"
llm = ChatDatabricks(endpoint=LLM_ENDPOINT_NAME, temperature=0.1)
このLangGraphワークフローは以下のように可視化されます:
デプロイメントする前に、パフォーマンスと品質の両方を確認するために、ヘルスケアエージェントをテストし、ネイティブにインテグレーションされたMLflow Tracingを活用することができます。MLflowトラッキングは、エージェントワークフローの入力、出力、それぞれの中間ステップと関連づけられたメタデータを監査する手段を提供し、予期しない挙動を簡単に特定することが可能になります。
Mosaic AI Agent FrameworkとMLflowを用いたエージェントのデプロイ
Databricks Appに対するモデルエンドポイントとしてエージェントを公開するために、コードで開発されたエージェントを容易にデプロイできるようにMosaic AI Agent Frameworkを活用しています。エージェントのモデルサービングエンドポイントをデプロイすると、テストにAI Playgroundを使用したり、フィードバックを提供するための専門家向けレビューアプリを活用することができます。
エージェントのモデルサービングエンドポイントをデプロイする前に、上述のMosaic AI Agent Frameworkと完全に互換性のある、マルチターンの会話型エージェントをシンプルにするために、(以下のコードで開発されたエージェントで説明されている)MLflowのChatAgentインタフェースを活用することをお勧めします。
from typing import Any, Generator, Optional, Sequence, Union
import mlflow
from databricks_langchain import (
ChatDatabricks,
VectorSearchRetrieverTool,
DatabricksFunctionClient,
UCFunctionToolkit,
set_uc_function_client,
)
from langchain_community.utilities import GoogleSerperAPIWrapper
from langchain_core.language_models import LanguageModelLike
from langchain_core.runnables import RunnableConfig, RunnableLambda
from langchain_core.tools import BaseTool, Tool
from langgraph.graph import END, StateGraph
from langgraph.graph.graph import CompiledGraph
from langgraph.graph.state import CompiledStateGraph
from langgraph.prebuilt.tool_node import ToolNode
from mlflow.langchain.chat_agent_langgraph import ChatAgentState, ChatAgentToolNode
from mlflow.pyfunc import ChatAgent
from mlflow.types.agent import (
ChatAgentChunk,
ChatAgentMessage,
ChatAgentResponse,
ChatContext,
)
from pydantic import BaseModel, Field
# testing
from langchain_openai import ChatOpenAI
mlflow.langchain.autolog()
client = DatabricksFunctionClient()
set_uc_function_client(client)
############################################
# Define your Schema definition for returning structured output
############################################
class ResponseFormatter(BaseModel):
"""Always use this tool to structure your response to the user."""
answer: str = Field(
description="The answer to the user's question without doctor's location data"
)
first_doctor: str = Field(description="The first recommended doctor's name")
first_doctor_lattitude: str = Field(
description="The first recommended doctor's latitude and direction"
)
first_doctor_longitude: str = Field(
description="The first recommended doctor's longitude and direction"
)
############################################
# Define your LLM endpoint and system prompt
############################################
# LLM_ENDPOINT_NAME = "databricks-claude-3-7-sonnet"
# llm = ChatDatabricks(endpoint=LLM_ENDPOINT_NAME, temperature=0.1)
LLM_ENDPOINT_NAME = "gpt-4.1-mini-2025-04-14"
llm = ChatOpenAI(model_name=LLM_ENDPOINT_NAME, temperature=0.1)
system_prompt = """
You are an healthcare policy Q&A agent.
You are given a task and you must complete it.
Use the following routine to support the customer.
# Routine:
1. Use the extract_member_id tool to extract member id.
2. Use member id from step 1 as input for the extract_deductible tool to get the member deductible and member deductible aggregate.
3. Use the cpt_codes_vector_search tool to get the most similar code and description given the original question.
4. Use code from step 3 as input for the get_procedure_cost tool to get the procedure cost.
5. If you are provided an IP address convert the IP address into a location to provide location specific recommendations using the Intermediate_Answer tool.
6. For the recommendations, please provide the latitude and longitude of the location 1 top recommended doctor related to the original question.
7. Do not mention the IP address in your response.
8. Following the ResponseFormatter summarize the member id, member deductible, member deductible aggregate, code, procedure cost in the answer
9. Associate the 1 top recommended doctor with their own location related latitude and longitude along with direction and be as concise as possible in the other fields in the ResponseFormatter.
10. Use the output from the ResponseFormatter as the final answer.
You can use the following tools to complete the task:
{tools}"""
###############################################################################
## Define tools for your agent, enabling it to retrieve data or take actions
## beyond text generation
## To create and see usage examples of more tools, see
## https://docs.databricks.com/generative-ai/agent-framework/agent-tool.html
###############################################################################
search = GoogleSerperAPIWrapper()
tools = [
ResponseFormatter,
Tool(
name="Intermediate_Answer",
func=search.run,
description="useful for when you need to ask with search",
),
]
# You can use UDFs in Unity Catalog as agent tools
uc_tool_catalog = "catalog"
uc_tool_schema = "schema"
uc_tool_names = [
f"{uc_tool_catalog}.{uc_tool_schema}.extract_member_id",
f"{uc_tool_catalog}.{uc_tool_schema}.extract_deductible",
f"{uc_tool_catalog}.{uc_tool_schema}.get_procedure_cost",
f"{uc_tool_catalog}.{uc_tool_schema}.cpt_codes_vector_search",
]
uc_toolkit = UCFunctionToolkit(function_names=uc_tool_names)
tools.extend(uc_toolkit.tools)
# vector_search_index_tools = [
# VectorSearchRetrieverTool(
# index_name="hls_yatish.agent_solution_accelerator.cpt_codes_index",
# num_results=1,
# tool_name="cpt_codes_retriever",
# tool_description="Retrieves information about cpt codes",
# query_type="ANN",
# )
# ]
# tools.extend(vector_search_index_tools)
# # (Optional) Use Databricks vector search indexes as tools
# # See https://docs.databricks.com/generative-ai/agent-framework/unstructured-retrieval-tools.html
# # for details
#
# # TODO: Add vector search indexes as tools or delete this block
# vector_search_tools = [
# VectorSearchRetrieverTool(
# index_name="",
# # filters="..."
# )
# ]
# tools.extend(vector_search_tools)
#####################
## Define agent logic
#####################
def create_tool_calling_agent(
model: LanguageModelLike,
tools: Union[Sequence[BaseTool], ToolNode],
system_prompt: Optional[str] = None,
) -> CompiledGraph:
# parallel_tool_calls parameter is currently only supported by OpenAI and Anthropic.
model = model.bind_tools(tools, parallel_tool_calls=True)
# Define the function that determines which node to go to
def should_continue(state: ChatAgentState):
messages = state["messages"]
last_message = messages[-1]
# If there are function calls, continue. else, end
if last_message.get("tool_calls"):
return "continue"
else:
return "end"
if system_prompt:
preprocessor = RunnableLambda(
lambda state: [{"role": "system", "content": system_prompt}]
+ state["messages"]
)
else:
preprocessor = RunnableLambda(lambda state: state["messages"])
model_runnable = preprocessor | model
def call_model(
state: ChatAgentState,
config: RunnableConfig,
):
response = model_runnable.invoke(state, config)
return {"messages": [response]}
workflow = StateGraph(ChatAgentState)
workflow.add_node("agent", RunnableLambda(call_model))
workflow.add_node("tools", ChatAgentToolNode(tools))
workflow.set_entry_point("agent")
workflow.add_conditional_edges(
"agent",
should_continue,
{
"continue": "tools",
"end": END,
},
)
workflow.add_edge("tools", "agent")
return workflow.compile()
class LangGraphChatAgent(ChatAgent):
def __init__(self, agent: CompiledStateGraph):
self.agent = agent
def predict(
self,
messages: list[ChatAgentMessage],
context: Optional[ChatContext] = None,
custom_inputs: Optional[dict[str, Any]] = None,
) -> ChatAgentResponse:
request = {"messages": self._convert_messages_to_dict(messages)}
messages = []
for event in self.agent.stream(request, stream_mode="updates"):
for node_data in event.values():
messages.extend(
ChatAgentMessage(**msg) for msg in node_data.get("messages", [])
)
return ChatAgentResponse(messages=messages)
def predict_stream(
self,
messages: list[ChatAgentMessage],
context: Optional[ChatContext] = None,
custom_inputs: Optional[dict[str, Any]] = None,
) -> Generator[ChatAgentChunk, None, None]:
request = {"messages": self._convert_messages_to_dict(messages)}
for event in self.agent.stream(request, stream_mode="updates"):
for node_data in event.values():
yield from (
ChatAgentChunk(**{"delta": msg}) for msg in node_data["messages"]
)
# Create the agent object, and specify it as the agent object to use when
# loading the agent back for inference via mlflow.models.set_model()
agent = create_tool_calling_agent(llm, tools, system_prompt)
AGENT = LangGraphChatAgent(agent)
mlflow.models.set_model(AGENT)
そして、MLflowのmodels from the codeアプローチを用いて、エージェントを記録、登録する必要があります。
# Determine Databricks resources to specify for automatic auth passthrough at deployment time
import mlflow
from agent import tools, LLM_ENDPOINT_NAME
from databricks_langchain import VectorSearchRetrieverTool
from mlflow.models.resources import (
DatabricksFunction,
DatabricksServingEndpoint,
DatabricksTable,
DatabricksVectorSearchIndex,
)
from unitycatalog.ai.langchain.toolkit import UnityCatalogTool
# TODO: Manually include underlying resources if needed. See the TODO in the markdown above for more information.
uc_tool_catalog = "hls_yatish"
uc_tool_schema = "agent_solution_accelerator"
resources = [
# DatabricksServingEndpoint(endpoint_name=LLM_ENDPOINT_NAME),
DatabricksVectorSearchIndex(
index_name=f"{uc_tool_catalog}.{uc_tool_schema}.cpt_codes_index"
),
]
tables = ["cpt_codes", "member_accumulators", "procedure_cost"]
for table in tables:
resources.append(
DatabricksTable(table_name=f"{uc_tool_catalog}.{uc_tool_schema}.{table}")
)
for tool in tools:
if isinstance(tool, VectorSearchRetrieverTool):
resources.extend(tool.resources)
elif isinstance(tool, UnityCatalogTool):
resources.append(DatabricksFunction(function_name=tool.uc_function_name))
input_example = {
"messages": [
{
"role": "user",
"content": "my member id is 1234. what is cost of hip replacement considering my IP address is 172.217.22.14?",
}
]
}
with mlflow.start_run():
logged_agent_info = mlflow.pyfunc.log_model(
artifact_path="agent",
python_model="agent.py",
input_example=input_example,
resources=resources,
extra_pip_requirements=[
"databricks-connect",
],
)
mlflow.set_registry_uri("databricks-uc")
# TODO: define the catalog, schema, and model name for your UC model
UC_MODEL_NAME = f"{catalog}.{schema}.{model}"
# register the model to UC
uc_registered_model_info = mlflow.register_model(
model_uri=logged_agent_info.model_uri,
name=UC_MODEL_NAME,
)
モデルが記録されると、バージョンやアーティファクトを参照するためにカタログを活用し、適切なUCオブジェクトを示すリネージの概要も取得することができます。
最後に、モデルサービングエンドポイントを作成し、専門家による評価のためのレビューアプリを起動するために、シンプルな agents.deploy() 関数呼び出しを使用することができます。ここでは、OpenAI APIやSerper APIキーのようなエージェントが認証に必要とするすべての環境変数も記録しています。
from databricks import agents
agents.deploy(
UC_MODEL_NAME,
uc_registered_model_info.version,
environment_vars={
"SERPER_API_KEY": "{{secrets/dbdemos/SERPER_API_KEY}}",
"OPENAI_API_KEY": "{{secrets/dbdemos/OpenAIBo}}",
},
tags={"endpointSource": "playground"},
)
エージェントモデルエンドポイントの準備ができるまで待ったら、専門家フィードバックのためのレビューアプリや、さまざまなクエリーをテストするためのAI Playgroundを活用することができます。AI Playgroundでカスタムエージェントのタブのエンドポイントの選択でカスタムヘルスケアエージェントを選択する必要があります。
レビューアプリとAI Playgroundの両方はフィードバックとテストの両方デメリットがありますが、ここでは、このソリューションアクセラレータがどのようにモデルサービングエンドポイント(REST API)がDatabricks Appと連携するのかをデモンストレーションしたいと思います。
Databricks Appを用いたお客様へのチャットボット体験の提供
我々の顧客アプリケーションのバックエンドを支援するためには、上述したすべてのコンポーネントは重要です。フロントエンドでは、Plotly Dash、Streamlit、Gradio、Shiny、FlaskのようなPythonフレームワークをすぐにサポートしており、DatabrikcsにおいてAIアプリを構築するもっともセキュアな手段を提供するDatabricks Appsを活用しています。このヘルスケアチャットエージェントでは、Streamlitを使うことにしました。
そして、認証を行うために簡単に利用できるサービスプリンシパルを活用し、レスポンスだけでなく、レスポンスの際にStreamlitの地図のために構造化アウトプットから緯度や軽度のようなスキーマを取得するためにモデルサービングエンドポイントとやり取りするためのMLflowデプロイメントクライアントを活用することができます。
そして、Streamlitの選択ボックスの個別のメンバーIDに対してテーブルをクエリーするためにサーバレスDBSQLウェアハウスを活用します。
検索ツールの機能をデモンストレーションするために、この例では我々の位置を事前に登録しておきました。しかし、設定に応じて、Streamlitはそのコンテキストで提供されるIPアドレスを活用できます。
以下のスクリーンショットの例では、メンバーID 1234から「人工股関節置換術を行う際のコストは?」と質問があります:
おわりに
エージェントは、デジタルヘルスケアオペレーションのゲームチェンジャーであり、複雑かつマルチパートの質問に答える方法を変革します。このアプローチは単に速いだけではなく、より革新的でモジュール的で、プロダクションレベルのものと言えます。
ご自身で構築したいですか?GITHUB REPOをチェックし、あなたのDatabricksワークスペースで実行してみましょう。あなたのヘルスケアチャットボット、コールセンター、クレームポータルは感謝することでしょう!