Nueva publicación

Encontrar

Resumen
· 26 mayo, 2024

InterSystems 开发者中文版:每周摘要(2024年5月20日-26日)

五月 20 - 26, 2024Week at a GlanceInterSystems Developer Community
Artículo
· 26 mayo, 2024 Lectura de 13 min

IRIS BI開発者向けチュートリアルを試してみる(11)

はじめに

IRIS BIチュートリアル試してみたシリーズの11回目です。ついに今回が最終回になります。
最終回のトピックは「ピボット・テーブルおよびダッシュボードのエクスポートとパッケージ化」です。これまでに作成したピボットテーブルやダッシュボードをエクスポートして他の環境などに移送するためのテクニックを学びます。
では、早速はじめていきましょう。

ピボット・テーブルおよびダッシュボードのエクスポートとパッケージ化

フォルダマネージャ画面から操作します。管理ポータル画面から Analytics → 管理 → フォルダマネージャ と選択します。
 
フォルダマネージャ画面が開き、作成済みのフォルダ、ピボットテーブル、ダッシュボードが一覧表示されます。これまでに作成してきた Tutorial フォルダと、その中のピボットテーブルやダッシュボードも存在します。


では、この一覧にある Sample Dashboard の左側にあるチェックボックスにチェックを付けます。画面左側の [詳細] の表示が変わります。
このダッシュボードで使用している2つのピボットテーブルが依存関係にあることが表示されます。

では、その2つのピボットテーブルにもチェックを付け、3つのアイテムが選択された状態にします。

この状態で、画面左側の [サーバーディレクトリ] に書き込み可能なディレクトリを指定し、すぐ下の [エクスポート] ボタンをクリックします。
 
エクスポートが正常終了すれば、以下のダイアログが表示されます。
 
保存した先のディレクトリを確認しますと、3つのxmlファイルが作成されていることが分かります。
 
今しがたエクスポートしたxmlファイルをそのままインポートすることもできますが、これらをパッケージ化したクラスを作成します。
VSCode またはスタジオから、Tutorial.DashboardsAndPivots という新しいクラスを作成します。このクラスは %DeepSee.UserLibrary.Container を拡張する必要があります。 
 
このクラスに、以下のように Contents という名前の XData ブロックを追加します。

XData Contents [ XMLNamespace = "http://www.intersystems.com/deepsee/library" ] 
{ 
<items>
</items>
}

次に、先ほどエクスポートしたファイルから、ダッシュボードおよびピボットテーブルの定義を XData ブロックにコピーしていきます。
まず、ダッシュボードのエクスポートファイル Tutorial-Sample_Dashboard.xml を開きます。
 
ここから、<dashboard> のセクションのところ(上図の4~18行目)をコピーし、作成しているクラスの <items> の中にペーストします。
 
次に、Tutorial-Patients_by_Age_Group-pivot.xml を開きます。先ほどのダッシュボードのxmlに似ていますが、<dashboard> の代わりに <pivot> というセクションがあります。

 
この <pivot> セクションのところを、先ほどと同様にコピーし、クラスファイルの
<items> の中にペーストします。
位置は <dashboard> の前でも後ろでも構いませんが、混ざらないように注意してください。
  
最後の1つ、Tutorial-Patients_by_Diagnosis-pivot.xml も同様に <pivot> セクションをコピー&ペーストします。

 
クラス定義は以下のようになります。ここまでできたら、クラス定義を保存してください。ただし、まだコンパイルは行わないでください。

Class Tutorial.DashboradsAndPivots Extends %DeepSee.UserLibrary.Container
{

XData Contents [ XMLNamespace = "http://www.intersystems.com/deepsee/library" ]
{
<items>
<dashboard xmlns="http://www.intersystems.com/deepsee/library" name="Sample Dashboard" folderName="Tutorial" title="" description="" keywords="" owner="" shared="true" public="true" locked="false" resource="" timeCreated="2024-05-07T00:41:14.04Z" createdBy="_SYSTEM" category="" bookCover="" lastAccessed="2024-05-07T02:15:32Z" scheme="" worklistCount="2" snapTo="true" snapGrid="true" gridRows="10" gridCols="10" canResize="true" canModify="true" showTitleBar="true" titleBarOpacity="" titleBarColor="" selectedTitleBarOpacity="" selectedTitleBarColor="" titleBarTextColor="" selectedTitleBarTextColor="" titleBarFont="" companyName="" companyLogo="" companyStyle="" backgroundColor="white" backgroundImage="none" backgroundRepeat="no-repeat" backgroundSize="100% 100%" backgroundOpacity="1" widgetBorders="1px solid #F0F0F0" widgetBordersSwitch="edit" widgetBordersColor="#F0F0F0" widgetBordersStyle="solid" widgetBordersWidth="1" widgetBordersToggle="true">
  <widget name="ウィジェット1" type="pivot" subtype="pivot" subtypeClass="lineChart" title="" dataSource="Tutorial/Patients by Age Group.pivot" dataLink="" drillDownDataSource="" width="200" height="200" sidebarContent="" showSidebar="false" sidebarWidth="" maximized="false" homeRowL="0" homeColL="0" colSpanL="4" rowSpanL="4" showToolbar="true" showToolbarBottomBorder="true" showToolbarOnlyWhenMaximized="false" colorToolbar="#F0F0F0" opacityToolbar="1" backgroundColor="#F0F0F0" opacity="1" theme="" dataColorList="">
    <control name="" action="applyFilter" target="*" targetProperty="[HomeD].[H1].[ZIP Code]" location="dashboard" type="auto" controlClass="" label="ZIP Code" title="" value="&amp;[32007]" text="32007" readOnly="false" valueList="" displayList="" activeWhen="">
      <valueRequired>false</valueRequired>
    </control>
    <control name="" action="applyFilter" target="*" targetProperty="[AllerD].[H1].[Allergies]" location="dashboard" type="auto" controlClass="" label="Allergies" title="" value="&amp;[soy]" text="soy" readOnly="false" valueList="" displayList="" activeWhen="">
      <valueRequired>false</valueRequired>
    </control>
    <control name="" action="applyFilter" target="*" targetProperty="[ColorD].[H1].[Favorite Color]" location="dashboard" type="auto" controlClass="" label="Favorite Color" title="" value="&amp;[Blue]" text="Blue" readOnly="false" valueList="" displayList="" activeWhen="">
      <valueRequired>false</valueRequired>
    </control>
  </widget>
  <widget name="ウィジェット2" type="pivot" subtype="pivot" subtypeClass="lineChart" title="" dataSource="Tutorial/Patients by Diagnosis.pivot" dataLink="" drillDownDataSource="" width="200" height="200" sidebarContent="" showSidebar="false" sidebarWidth="" maximized="false" homeRowL="4" homeColL="0" colSpanL="4" rowSpanL="4" showToolbar="true" showToolbarBottomBorder="true" showToolbarOnlyWhenMaximized="false" colorToolbar="#F0F0F0" opacityToolbar="1" backgroundColor="#F0F0F0" opacity="1" theme="" dataColorList="">
  </widget>
</dashboard>
<pivot xmlns="http://www.intersystems.com/deepsee/library" name="Patients by Age Group" folderName="Tutorial" title="" description="" keywords="" owner="" shared="true" public="false" locked="false" resource="" timeCreated="2024-05-07T00:24:12.814Z" createdBy="_SYSTEM" category="" bookCover="" lastAccessed="2024-05-07T00:24:36Z" mdx="" cellWidth="120" columnHeaderStyle="" rowHeaderStyle="" cellStyle="" rowLabelSpan="true" columnLabelSpan="true" cellHeight="22" showEmptyRows="false" showEmptyColumns="false" cubeName="TUTORIAL" caption="" listing="" listingRows="" showStatus="true" canDrillDown="true" pageSize="100" colorScale="" rowTotals="false" columnTotals="false" rowTotalAgg="sum" columnTotalAgg="sum" rowTotalSource="page" showZebra="false" showRowCaption="true" printTitle="" printSubtitle="" printSubtitleOn="" showUser="" printPageSize="" printOrientation="1" printMarginTop="" printMarginLeft="" printMarginRight="" printMarginBottom="" printLabelWidth="" printCellWidth="" autoExecute="true" previewMode="false" manualMode="false" userMDX="" chartMarginTop="" chartMarginLeft="" chartMarginRight="" chartMarginBottom="" maxRows="" borderLeftCell="" borderRightCell="" borderTopCell="" borderBottomCell="" borderLeftCol="" borderRightCol="" borderTopCol="" borderBottomCol="" borderLeftRow="" borderRightRow="" borderTopRow="" borderBottomRow="" fontFamilyCell="" fontSizeCell="" fontFamilyCol="" fontSizeCol="" fontFamilyRow="" fontSizeRow="" showFilters="" showListingFilters="" showDate="" listingFontSize="" showZebraStripes="" filterTableStyle="" filterTableCaptionStyle="" filterTableItemStyle="" nowDisplayFormat="" measureLocation="columns" hideMeasures="1" backgroundImage="" backgroundOpacity=".12">
  <rowAxisOptions spec="" key="" value="" text="" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
  </rowAxisOptions>
  <columnAxisOptions spec="" key="" value="" text="" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
  </columnAxisOptions>
  <rowLevel spec="[AgeD].[H1].[Age Group].Members" key="" value="" text="Age Group" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
    <childLevels spec="[AgeD].[H1].[Age Bucket].Members" key="" value="" text="Age Bucket" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
    </childLevels>
  </rowLevel>
  <rowLevel spec="[AgeD].[All Patients]" key="" value="" text="All Patients" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
  </rowLevel>
  <columnLevel spec="[Measures].[%COUNT]" key="" value="" text="Count" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
  </columnLevel>
  <sqlRestriction></sqlRestriction>
</pivot>
<pivot xmlns="http://www.intersystems.com/deepsee/library" name="Patients by Diagnosis" folderName="Tutorial" title="" description="" keywords="" owner="" shared="true" public="false" locked="false" resource="" timeCreated="2024-05-07T00:29:52.151Z" createdBy="_SYSTEM" category="" bookCover="" lastAccessed="2024-05-07T00:29:54Z" mdx="" cellWidth="120" columnHeaderStyle="" rowHeaderStyle="" cellStyle="" rowLabelSpan="true" columnLabelSpan="true" cellHeight="22" showEmptyRows="false" showEmptyColumns="false" cubeName="TUTORIAL" caption="" listing="" listingRows="" showStatus="true" canDrillDown="true" pageSize="100" colorScale="" rowTotals="false" columnTotals="false" rowTotalAgg="sum" columnTotalAgg="sum" rowTotalSource="page" showZebra="false" showRowCaption="true" printTitle="" printSubtitle="" printSubtitleOn="" showUser="" printPageSize="" printOrientation="1" printMarginTop="" printMarginLeft="" printMarginRight="" printMarginBottom="" printLabelWidth="" printCellWidth="" autoExecute="true" previewMode="false" manualMode="false" userMDX="" chartMarginTop="" chartMarginLeft="" chartMarginRight="" chartMarginBottom="" maxRows="" borderLeftCell="" borderRightCell="" borderTopCell="" borderBottomCell="" borderLeftCol="" borderRightCol="" borderTopCol="" borderBottomCol="" borderLeftRow="" borderRightRow="" borderTopRow="" borderBottomRow="" fontFamilyCell="" fontSizeCell="" fontFamilyCol="" fontSizeCol="" fontFamilyRow="" fontSizeRow="" showFilters="" showListingFilters="" showDate="" listingFontSize="" showZebraStripes="" filterTableStyle="" filterTableCaptionStyle="" filterTableItemStyle="" nowDisplayFormat="" measureLocation="columns" hideMeasures="1" backgroundImage="" backgroundOpacity=".12">
  <rowAxisOptions spec="" key="" value="" text="" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
  </rowAxisOptions>
  <columnAxisOptions spec="" key="" value="" text="" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
  </columnAxisOptions>
  <rowLevel spec="[DiagD].[H1].[Diagnoses].Members" key="" value="" text="Diagnoses" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
  </rowLevel>
  <columnLevel spec="[Measures].[%COUNT]" key="" value="" text="Count" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
  </columnLevel>
  <columnLevel spec="[Measures].[Avg Age]" key="" value="" text="Avg Age" headEnabled="false" headCount="" filterEnabled="false" filterExpression="" orderEnabled="false" orderExpression="" orderDirection="BDESC" aggEnabled="false" aggFunction="" aggFunctionParm="" levelCaption="" levelFormat="" levelSummary="" levelType="" drillLevel="0" advanced="false" levelStyle="" levelHeaderStyle="" suppress8020="false" drilldownSpec="" enabled="true">
  </columnLevel>
  <sqlRestriction></sqlRestriction>
</pivot>
</items>
}

}

では、フォルダマネージャ画面に戻り、ページをリロードして更新します。先ほど付けたチェックマークがリセットされます。
リストから、先ほどの3つのアイテムを再びチェックし、画面左側の [削除] ボタンを押してこれらを削除します。

確認のダイアログが表示されますので、[OK] で進めます。なにかを削除するのは、いつも不安になりますが。。
 
「3アイテムを削除しました」とのメッセージが返ってきました。

 
画面がリフレッシュされ、リストには Tutorial フォルダだけが残り、3つのアイテムは削除されました。
 では、先ほどのクラス定義に戻り、保存していたクラス定義をコンパイルします。
うまくいけば、以下のようにコンパイルの成功と、3つのアイテムのインポートのログが出てくるかと思います。

 
では、フォルダマネージャ画面に戻り、画面をリフレッシュします。
そうしますと Tutorial フォルダには、削除した3つのアイテムが戻っています。よかった!

おわりに

今回はピボットテーブルやダッシュボードのインポート・エクスポートと、それらをパッケージ化するクラスの作成方法について学びました。
これでIRIS BIの開発者向けチュートリアルのすべての内容を実施しました。全部で11回と、思った以上に長丁場になってしまいましたが。。
チュートリアルの内容は、IRIS BIを利用するに際しての基本的な知識や作業が網羅されておりますので、このシリーズを通すことでIRIS BIに対する理解が深まったり、開発作業などにおける疑問の解消につながればよいなと思っております。
最後までお付き合いいただきまして、ありがとうございました!

Comentarios (0)1
Inicie sesión o regístrese para continuar
Anuncio
· 25 mayo, 2024

[Video] Passo a passo do IRIS AI Studio: Liberte o poder das Incorporações de Vetor no IRIS DB

Olá Comunidade,

Aqui vai um simples passo a passo sobre as capacidades da plataforma  Studio IRIS AI. Ele cobre um fluxo completo de carregar dados no IRIS DB como incorporações de vetor e recuperação de informações usando 4 canais diferentes (pesquisa, conversa, recomendação e similaridade). No último lançamento, adicionei suporte para docker para instalações locais e uma versão ao vivo para explorar.

Comentarios (0)1
Inicie sesión o regístrese para continuar
Artículo
· 24 mayo, 2024 Lectura de 7 min

IRIS AI Studio: Conectores para transformar seus arquivos em vetores incorporados para capacidades do GenAI

 

No artigo anterior, vimos diferentes módulos do Studio IRIS AI e como ele poderia ajudar a explorar as capacidades da GenAI além do IRIS DB perfeitamente, mesmo para alguém não técnico. Nesse artigo, vamos mergulhar a fundo pelo módulo "Connectors", o que permite que os usuários carreguem dados desde uma fonte local ou cloud (AWS S3, Airtable, Azure Blob) no IRSI DB como vetores incorporados, ao configurar também definições de incorporação como modelo e dimensões.

 

Novas Atualizações ⛴️ 

  • Demo Online da aplicação está disponível agora emt https://iris-ai-studio.vercel.app
  • Módulo de Connectors module agora podem carregar dados de (incorporações OpenAI/Cohere)
    • Armazenamento Local
    • AWS S3
    • Armazenamento Azure Blob
    • Airtable
  • Módulo Playground é totalmente funcional com 
    • Procura Semântica
    • Chat with Docs (Conversa com Docs)
    • Máquina de recomendação
      • Cohere Re-rank
      • OpenAI Re-rank
    • Máquina de Similaridades

 

Connectors

Se você já usou o ChatGPT 4 ou outros serviços LLM (Large Language Model - Grandes modelos de linguagem) onde se usa a inteligência a partir de um contexto, isso idealmente adiciona valor de negócio sobre uma LLM genérica. Esse módulo oferece uma interface fora da caixa e no-code (sem código) para carregar dados de diferentes fontes, realiza incorporações neles e os carrega na IRIS DB. Esse módulo de conectores passam por 3 passos num geral.

  1. Buscar dados de fontes diferentes
  2. Pegar os dados incorporados usando modelos de incorporação OpenAI/Cohere 
  3. Carregar as incorporações e texto dentro da IRIS DB

 

Passo 1: Buscando dados de diferentes fontes

1. Armazenamento Local - Subir arquivos. Eu usei os Indexes Llama do SimpleDirectoryReader para carregar dados dos arquivos.

(uma limitação de um máximo de 10 arquivos é usada para sustentar o carregamento no pequeno servidor usado para fins de demonstração. Isso pode ser negad na sua implementação.)

# Checa por arquivos carregados
if "files" not in request.files:
  return jsonify({"error": "No files uploaded"}), 400
uploaded_files = request.files.getlist("files")
if len(uploaded_files) > 10:
  return jsonify({"error": "Exceeded maximum file limit (10)"}), 400
temp_paths = []
for uploaded_file in uploaded_files:
  fd, temp_path = tempfile.mkstemp()
  with os.fdopen(fd, "wb") as temp:
  uploaded_file.save(temp)
  temp_paths.append(temp_path)

# Carrega dados dos arquivos
documents = SimpleDirectoryReader(input_files=temp_paths).load_data()

 

 2. AWS S3

Parâmetros de Entrada: Client ID, Client Secret e Bucket Name. Você pode buscar o ID do cliente e o segredo da console AWS - IAM ou criando permissões de leitura para seu bucket do lado de lá.

Eu usei a livraria "s3fs" para buscar o conteúdo do AWS S3 e os Index Llama SimpleDirectoryReader para carregar os dados dos arquivos obtidos.

access_key = request.form.get('aws_access_key')
secret = request.form.get('aws_secret')
bucket_name = request.form.get('aws_bucket_name')

if not all([access_key, secret, bucket_name]):
    return jsonify({"error": "Missing required AWS S3 parameters"}), 400
s3_fs = S3FileSystem(key=access_key, secret=secret)
reader = SimpleDirectoryReader(input_dir=bucket_name, fs=s3_fs, recursive=True)
documents = reader.load_data()

 

3. Airtable

Parâmetros de Input: Token (API Key), Base ID e Table ID. A Chave API pode ser recuperada do Airtable's Developer Hub. O Base ID e o Table ID podem ser achados da URL da tabela. A que começa com "app..." é o Base ID e a que começa com "tbl..." é o Table ID.

Eu usei o Airtable Reader do LlamaHub para buscar os conteúdos do Airtable e o Index do Llama SimpleDirectoryReader para carregar dados dos arquivos buscados.

airtable_token = request.form.get('airtable_token')
table_id = request.form.get('table_id')
base_id = request.form.get('base_id')

if not all([airtable_token, table_id, base_id]):
        return jsonify({"error": "Missing required Airtable parameters"}), 400
reader = AirtableReader(airtable_token)
documents = reader.load_data(table_id=table_id, base_id=base_id)

 

4. Armazenamento Azure Blob: 

Parâmetros de entrada: Nome do Container e String de Conexão. Essas informações podem ser recuperadas da página Azure's AD. 

 

I have used AzStorageBlob Reader from LlamaHub to fetch the contents from Azure Storage and Llama Index's SimpleDirectoryReader to load data from the fetched files.

container_name = request.form.get('container_name')
connection_string = request.form.get('connection_string')

if not all([container_name, connection_string]):
    return jsonify({"error": "Missing required Azure Blob Storage parameters"}), 400
loader = AzStorageBlobReader(
    container_name=container_name,
    connection_string=connection_string,
)
documents = loader.load_data()

LlamaHub contem mais de 500 conectores desde tipos diferentes tipos de arquivos até serviços. Adicionar um novo conector baseado nas suas necessidades deve ser bastante simples.

 

Passo 2: Buscando os dados incorporados usando modelos de incorporação OpenAI/Cohere

Incorporações são representações numéricas que capturam a semântica do texto, permitindo aplicações como pesquisa e correspondência por similaridade. Idealmente o objetivo é, quando um usuário faz uma pergunta, sua incorporação é comparada com as incorporações de documentos usando métodos como similaridade de cosseno - maior similaridade indica maior conteúdo relevante.

Aqui, estou usando a livraria llama-iris para armazenar incorporações na IRIS DB. Na IRISVectorStore, parâmetors 

  • Connection String é necess´rio para interação com a DB (database - base de dados)
    • Para testar na versão de demonstração online, você não poderá usar uma instância local (localhost).
    • Você precisaria de uma instância IRIS que rode em AWS/Azure/GCP com versão 2024.1+ , já que essas suportam armazenamento e recuperação de vetores.
    • A instância de comunidade IRIS, fornecida pelo learning hub parece estar rodando com a versão 2022.1, então não pode ser usada para explorações aqui.purpose.
  • Table Name é o que será usado para criar ou atualizar os registros.
    • A livraria "llama-iris" acrescenta "data_" ao começo do nome da tabela. Então, quando estiver tentando checar os dados por meio de um cliente DB, acrescente "data_" ao começo do nome da tabela. Por exemplo, se você nomeou uma tabela como "usuarios",  você terá que recuperar como "data_usuarios".
  • Embed Dim / Embedding Dimension é a dimensão do modelo de incorporação que o usuário utilizou
    • Digamos que você tenha carregado a tabela "usuarios" usando incorporações OpenAI - "text-embedding-3-small", com dimensão 1536 . Você seria capaz de carregar mais dados na tabela, mas apenass com dimensão 1536. O mesmo ocorre com recuperações de incorporações também. Então, tenha certeza de escolher o modedlo correto nas fases iniciais.
CONNECTION_STRING = f"iris://{username}:{password}@{hostname}:{port}/{namespace}"
vector_store = IRISVectorStore.from_params(
    connection_string=CONNECTION_STRING,
    table_name=table_name,
    embed_dim=embedding_dimension
)

Settings.embed_model = set_embedding_model(indexing_type, model_name, api_key)

storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
    documents,
    storage_context=storage_context
)

 

Passo 3: Carregando a incorporação e texto na IRIS DB

O código escrito acima cobre a indexação e carregamento de dados dentro da IRIS DB. Essa deve ser a aparência dos dados:

Text - Informação em texto puro que foi extraída dos arquivos que carregamos

Node ID - Isso seria utilizado como referência quando fazemos recuperações

Embeddings (incorporações) - A representação numérica dos dados de texto

 

Esses três passos são a maneira que o módulo de conectores funciona. Quando se trata de dados requeridos, como credenciais de DB, e chaves de API, eu busco do usuário e salvo no armazenamento local do navegador (Detalhes da Instância) e no armazenamento da sessão (chaves de API). Isso dá maior modularidade à aplicação para qualquer um explorar.

 

Ao unir o carregamento de dados incorporados por vetores de arquivos e a recuperação de conteúdo por vários canais, o Studio IRIS AI permite uma maneira intuitiva de explorar as possibilidades de Generative AI que o InterSystems IRIS oferece - não apenas para clientes atuais, mas também para novas perspectivas.

🚀 Vote por essa aplicação na competição de Vector Search, GenAI and ML, se acreditar que ela tem futuro!

Se você pensar em alguma aplicação em potencial usando essa implementação, por favor sinta-se à vontade para compartilhar no fio de discussão.

Comentarios (0)1
Inicie sesión o regístrese para continuar
Artículo
· 24 mayo, 2024 Lectura de 5 min

Usando o Prometheus para coletar métricas no Intersystems IRIS

Olá,

Neste artigo vamos ver o uso do Prometheus (prometheus.io) para coletar métricas no Iris, de forma a monitorarmos o ambiente.

O link https://cloud.google.com/discover/what-is-prometheus?hl=pt-br apresenta uma descrição bem completa do Prometheus.

O Iris conta com uma api que disponibiliza uma série de informações do ambiente. A documentação completa da api pode ser encontrada no endereço https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GCM_rest

Uma simples chamada a api já nos mostra as informações disponíveis:

Fig. 1 – Apresentação dos dados da API de Metricas do IRIS

A api segue o padrão definido pela OpenMetrics (openmetrics.io). Podemos usar o Prometheus para fazer a coleta dos dados desta api e então depois visualizar as informações. Na própria documentação da api existe o link para a configuração básica do Prometheus (https://prometheus.io/docs/introduction/first_steps/ ).

Para iniciarmos, baixe o Prometheus para seu ambiente em um diretório. Você pode encontrar o download para seu ambiente no link https://prometheus.io/download/

Descompacte o arquivo e terá o necessário para a execução. Abaixo a tela com o conteúdo do diretório descompactado para o ambiente Windows:

Fig. 2 – Diretório do Prometheus descompactado

Localize o arquivo prometheus.yaml. Ele é o arquivo de configuração para o Prometheus. Abra este arquivo com um editor de texto:

Fig. 3 Arquivo prometheus.yaml

 

No fim do arquivo você verá a configuração de acesso ao Iris que eu já coloquei no meu arquivo.

No caso estamos com o Iris e o Prometheus no mesmo servidor. Em um ambiente produtivo o ideal é que o servidor do Prometheus seja apartado do Iris. Assim caso exista alguma questão no servidor do Iris os dados do Prometheus estarão disponíveis para consultas.

As seguintes linhas foram incluídas no arquivo, na seção scrape_config:

  - job_name: "iris"

    # metrics_path defaults to '/metrics'

    # scheme defaults to 'http'.

    metrics_path: '/api/monitor/metrics'

    static_configs:

      - targets: ["127.0.0.1"]

job_name é o nome dado a configuração no Prometheus

metrics_path é o caminho para a api no servidor Iris

targets é o endereço IP onde o Iris está atendendo as requisições

No caso não estamos usando a api com autenticação de usuários por ser um simples teste, mas caso vá para um ambiente produtivo a autenticação é necessária por conta de segurança. Veja como autenticar uma api no link https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GREST_securing

Para o caso de uso da api com autenticação temos que fornecer, por exemplo para a basic auth o usuário e a senha. Coloque as informações no arquivo de configuração do Prometheus:

  - job_name: "iris"

    # metrics_path defaults to '/metrics'

    # scheme defaults to 'http'.

    metrics_path: '/api/monitor/metrics'

    basic_auth:

       username: 'XXX' # Usuario autorizado a acessar a API

       password: 'XXX' # Senha do usuario

    static_configs:

      - targets: ["127.0.0.1"]

O exemplo acima mostra como configurar o acesso a api usando basic auth.

Após incluir as linhas, salve o arquivo e execute o programa prometheus.exe ou o executável disponibilizado para seu ambiente. No caso do exemplo estamos usando Windows.

Fig. 4 – Tela do Prometheus em execução no Windows

A partir deste momento o Prometheus fica disponível para acesso a partir da porta 9090 do servidor. Podemos acessar e ver a configuração iris do Prometheus acessando o link http://127.0.0.1:9090/targets:

Fig. 5 – Tela do Prometheus ativo apresentando as configurações de acesso

Agora podemos ver os dados já coletados pelo Prometheus no Iris. Por padrão o Prometheus coleta dados a cada minuto, conforme a propriedade scrape_interval da seção global do arquivo de configuração. No caso, para vermos dados de teste, mudei o valor para 10 segundos:

global:

  scrape_interval: 10s # Set the scrape interval to every 10 seconds.

Assim que o Prometheus tenha uma base de informações coletadas podemos visualizar informações com a opção de gráfico. Para isso acesse o link http://127.0.0.1:9090/graph:

Fig. 6 – Tela de apresentação de gráficos do Prometheus

Agora em Expression informe “iris” e veja todas as informações coletadas:

Fig. 7 – Tela do Gráfico com as opções de visualização

Selecione, por exemplo, iris_cpu_usage na lista de opções e depois selecione a aba Graph. Você já verá o gráfico de uso de CPU desde o momento de ativação do Prometheus:

Fig. 8 - Tela do Prometheus apresentando um gráfico

Você pode explorar selecionando outras opções para visualização. Veja por exemplo iris_glo_ref_per_sec que na documentação da api nos informa trazer as informações de Número de referências a globais localizadas em bancos de dados locais por segundo:

Fig .9 – Apresentação do gráfico de referencia a globais por segundo

O interessante deste monitoramento não é somente podermos acompanhar a saúde do ambiente, mas também verificar o que ocorreu em determinados momentos. Podemos solicitar a visualização dos dados de momentos anteriores a partir da tela de apresentação:

Fig. 10 - Tela de Prometheus selecionando uma data

Caso necessário, marque a caixa Use local time para ajustar o horário para sua zona de tempo.

Explore as informações do Prometheus e veja toda a gama de métricas que são disponibilizadas pelo Iris.

No próximo artigo veremos como ligar o Grafana ao Prometheus para montar um dashboard de visualização das informações coletadas.

Agradeço a @Mikhail Khomenko e seu artigo sobre esse assunto publicado em https://community.intersystems.com/post/making-prometheus-monitoring-intersystems-iris-and-cach%C3%A9 de onde retirei informações importantes para a montagem deste documento. Não deixem de ver este excelente artigo.

Comentarios (0)1
Inicie sesión o regístrese para continuar