Nova postagem

Encontrar

Artigo
· Abr. 9 4min de leitura

Haz preguntas a tus clases de IRIS con Ollama, IRIS VectorDB y Langchain

Si queréis saber por ejemplo si ya está implementada una clase sobre un tema en concreto, ahora es posible haciendo una simple pregunta en lenguaje natural. Descargad y ejecutad la aplicación https://openexchange.intersystems.com/package/langchain-iris-tool para conocer todo sobre vuestras clases de proyecto en un chat.

Instalación:

$ git clone https://github.com/yurimarx/langchain-iris-tool.git
$ docker-compose build
$ docker-compose up -d

Uso:

1. Abrid la URL [http://localhost:8501](http://localhost:8501).  

2. Revisad el botón de Configuración, que se usa para que el Agente se conecte a InterSystems IRIS.  

3. Haced preguntas sobre vuestras clases desarrolladas (por ejemplo: ¿Existen clases que hereden de Persistent?).

UI 4

Herramientas usadas:

  1. Ollama: herramienta para ejecutar modelos (LLM) 
  2. Langchain: plataforma para construir agentes de inteligencia artificial.
  3. Streamlit: framework de frontend.
  4. InterSystems IRIS: servidor para responder preguntas sobre su contenido.

Sobre Ollama

Es una solución gratuita y local de modelos de lenguaje (LLM) que permite ejecutar Inteligencia Artificial Generativa con privacidad y seguridad, ya que los datos se procesarán únicamente en vuestras propias instalaciones. El proyecto Ollama es compatible con muchos modelos, incluyendo Mistral, OpenAI, DeepSeek y otros, ejecutándolos localmente. Este paquete utiliza Ollama a través de Docker Compose con el modelo Mistral.

ollama:
    image: ollama/ollama:latest
    deploy:
      resources:
        reservations:
          devices:
          - driver: nvidia
            capabilities: ["gpu"]
            count: all  # Adjust count for the number of GPUs you want to use
    ports:
      - 11434:11434
    volumes:
      - ./model_files:/model_files
      - .:/code
      - ./ollama:/root/.ollama
    container_name: ollama_iris
    pull_policy: always
    tty: true
    entrypoint: ["/bin/sh", "/model_files/run_ollama.sh"] # Loading the finetuned Mistral with the GGUF file
    restart: always
    environment:
      - OLLAMA_KEEP_ALIVE=24h
      - OLLAMA_HOST=0.0.0.0

Sobre Langchain:

Langchain es un framework para crear aplicaciones de Inteligencia Artificial Generativa (GenAI) de forma sencilla. Langchain introduce el concepto de herramienta (tool), que son complementos (plug-ins) utilizados en aplicaciones RAG para ampliar las capacidades de los modelos de lenguaje (LLMs). Esta aplicación implementa una herramienta de Langchain para realizar preguntas sobre gestión y desarrollo en vuestro servidor IRIS.

from langchain.llms import Ollama
from langchain.chains import RetrievalQA
from langchain.document_loaders import CSVLoader
from langchain.embeddings import OllamaEmbeddings
from langchain_iris import IRISVector

def get_insights(question, csv_file, iris_conn, collection_name):
    
    # Load and process the CSV data    
    loader = CSVLoader(csv_file)
    documents = loader.load()

    llm = Ollama(
        base_url="http://ollama:11434", 
        model="mistral", 
        temperature=0,
    )

    # Create embeddings
    embeddings = OllamaEmbeddings(model="mistral", base_url="http://ollama:11434", temperature=0)

    db = IRISVector.from_documents(
        embedding=embeddings, 
        documents=documents,
        connection_string=iris_conn,
        collection_name=collection_name,
        pre_delete_collection=True
    )

    qa = RetrievalQA.from_chain_type(
        llm=llm,
        chain_type="stuff",
        retriever=db.as_retriever())
    
    return qa({"query": question})

Sobre Streamlit:

La solución Streamlit se utiliza para desarrollar frontends con el lenguaje Python. Esta aplicación incluye una aplicación de chat en Streamlit para interactuar con Ollama, Langchain e IRIS y obtener respuestas relevantes.

import pandas as pd
import streamlit as st
from sqlalchemy import create_engine
import langchain_helper as lch

username = "_system"
password = "SYS"
hostname = "iris"
port = 51972
webport = 52773
namespace = "USER"
st.set_page_config(page_title="InterSystems IRIS Classes Demo", page_icon="📜")

st.title("Langchain IRIS Classes Chat")

with st.popover("Settings"):
    with st.spinner(text="Connecting to the IRIS classes"):
        engine = create_engine("iris://" + username + ":" + password + "@" + hostname + ":" + str(port) + "/" + namespace)
        connection  = engine.connect()
        query = 'select * from %Dictionary.ClassDefinition where substring(ID,1,1) <> \'%\' and  Copyright is null'
        df = pd.read_sql(query, con=connection)
        df.to_csv("classes.csv")
    
    username = st.text_input("Username:", username)
    password = st.text_input("Password:", password)
    hostname = st.text_input("Hostname:", hostname)
    port = int(st.text_input("Port:", port))
    webport = int(st.text_input("Web port:", webport))
    namespace = st.text_input("Namespace:", namespace)

            

# User query input
query = st.text_input(label="Enter your query")

# Submit button
if st.button(label="Ask IRIS Classes", type="primary"):
    
    with st.spinner(text="Generating response"):
        iris_conn_str = f"iris://{username}:{password}@{hostname}:{port}/{namespace}"
        response = lch.get_insights(query, "classes.csv", iris_conn=iris_conn_str, collection_name="classes")
        st.write(response['result'])
Discussão (0)1
Entre ou crie uma conta para continuar
Pergunta
· Abr. 9

Validate XML message against XSD schema

I'm trying to validate a %Stream.GlobalCharacter with an XML content against an XSD schema, to validate mandatory nodes, etc...

I'm trying to use the Ens.Util.XML.Validator class, as suggested on this post:

https://community.intersystems.com/post/validate-xml-message-against-xsd...

However, when calling the ValidateStream method, if schemaSpec is left empty, it just validates that is a "valid XML".

When specifying anything on schemaSpec, i receive the error "SAX XML Parser Error: Unable to Resolve SystemId"

Any examples  with the right specification on schemaSpec for ValidateStream? (a filepath to the XSD file, for example, or an XML schema imported on the namespace)

 

1 Comment
Discussão (1)2
Entre ou crie uma conta para continuar
Pergunta
· Abr. 9

Validacion de un XML contra un esquema XSD

Estoy intentando validar el contenido de un XML contra un esquema XSD, para validar la estructura (nodos obligatorios, etc...)

Estoy intentando utilizar la clase Ens.Util.XML.Validator, como se sugiere en este post:

https://community.intersystems.com/post/validate-xml-message-against-xsd...

Pero al invocar al metodo ValidateStream, si en el schemaSpec le dejo el parametro vacio, simplemente valida que sea una estructura XML correcta.

Al pasarle cualquier valor en schemaSpec, da un error de "SAX XML Parser Error: Unable to Resolve SystemId"

 

¿Algun ejemplo de como indicar el schemaSpec en la validacion? (la ruta del XSD en el disco, por ejemplo, o un esquema XML cargado en el namespace)

5 Comments
Discussão (5)2
Entre ou crie uma conta para continuar
Artigo
· Abr. 8 2min de leitura

Setting Up an ODBC/JDBC Linked Table Connection to MySQL from Iris

Due to MySQL's interpretation of SCHEMA differing from the common SQL understanding (as seen in IRIS/SQL Server/Oracle), our automated Linked Table Wizard may encounter errors when attempting to retrieve metadata information to build the Linked Table.

(This also applies to Linked Procedures and Views)

When attempting to create a Linked Table through the Wizard, you will encounter an error that looks something like this:

ERROR #5535: SQL Gateway catalog table error in 'SQLPrimaryKeys'. Error: ' SQLState: (HY000) NativeError: [0] Message: [MySQL][ODBC 8.3(a) Driver][mysqld-5.5.5-10.4.18-MariaDB]Support for schemas is disabled by NO_SCHEMA option
 

To create a Linked Table to a MySQL database which employs “no-schema” structure (the default behavior), please follow the instructions below:

  1. Create an SQL Gateway Connection:
  • Set up the SQL Gateway connection as usual.
  • Ensure the "Do not use delimited identifiers by default" checkbox is checked.
  • Click "Test Connection" to confirm the connection is successful.

  1. Use the Terminal based API to Create the Linked Table:
  • Utilize the following API $SYSTEM.SQL.Schema.CreateLinkedTable() The CreateLinkedTable() method  uses the following parameters:

CreateLinkedTable(dsn As %String, externalSchema As %String, externalTable As %String, primaryKeys As %String, localClass As %String = "User.LinkedClass", localTable As %String, ByRef columnMap As %String = "")

  • Example: In this example, we use the MySQL system table help_keyword with name as the primary key:

USER>do $SYSTEM.SQL.Schema.CreateLinkedTable("MyDSN", "", "help_keyword", "name", "User.LinkedClass", "LocalTable")

Please ensure all parameters are correctly specified to avoid any errors during the setup process.

Discussão (0)1
Entre ou crie uma conta para continuar
Artigo
· Abr. 8 2min de leitura

Ei Chat, o que está rolando com a minha Interoperabilidade?

E se você pudesse conversar em um chat para verificar o que acontece na Interoperabilidade, se há algum erro e até mesmo resolver alguns tipos de problemas?

Com o servidor MCP, você pode conectar qualquer um de seus Clientes MCP por exemplo, Claude, ao IRIS e pedir para verificar a Interoperabilidade.

O que você precisa é de uma configuração simples do Claude.

  • Instale o próprio Claude Desktop 
  • instale o uv, que ajuda com pacotes Python

As configurações do Claude na seção de Desenvolvedor podem ajudar a encontrar um arquivo de configuração

Com uma configuração simples, como aqui, requer apenas acesso ao IRIS, nada precisa ser instalado no IRIS.

{
  "mcpServers": {
    "iris": {
      "command": "uvx",
      "args": [
        "mcp-server-iris"
      ],
      "env": {
        "IRIS_HOSTNAME": "localhost",
        "IRIS_PORT": "1972",
        "IRIS_NAMESPACE": "USER",
        "IRIS_USERNAME": "_SYSTEM",
        "IRIS_PASSWORD": "SYS"
      }
    }
  }
}

Após reiniciar o Claude, ele deverá exibir que algumas ferramentas MCP estão agora disponíveis. Clicar ali mostrará todas as ferramentas disponíveis.

Com o Claude sabendo sobre as ferramentas disponíveis e, pela instrução (prompt) que você fornecer, ele pode selecionar qual ferramenta melhor se adapta para ajudar com a consulta.

 

Acho que funciona bem, vamos verificar se há erros.

Somos capazes de ver a resposta real da ferramenta. E o Claude analisou a saída e extraiu os erros que encontrou, sugerindo por que os erros podem acontecer e até oferecendo maneiras de resolvê-los.

Atualmente, a implementação deste Servidor MCP não oferece nenhuma capacidade de edição de código, não vamos pedir para corrigir o código. Mas podemos tentar recuperar a produção

Restart pode ajudar

Aqui estamos, tudo certo agora..

Bem, já que nossa produção está funcionando bem agora, vamos dar uma olhada nos dados que já podemos ter coletado.

Para ajudar com isso, o Claude usará uma ferramenta que pode executar consultas SQL.

Mesmo que eu tenha colocado o nome da classe em vez do nome da tabela, ele descobriu que não existe tal tabela, mas não desistiu e, em uma única sessão, conseguiu descobrir o nome real da tabela e buscar alguns dados.

Quando tenta obter mais informações sobre os dados coletados, tenta até adivinhar os nomes das colunas.

Encontrou as colunas reais, mas teve dificuldades com palavras-chave reservadas e não tentou usar "FOUND".

E com uma tentativa final...

Decidiu simplificar, mas usando o conhecimento sobre os nomes das colunas, acertou e forneceu um resumo.

 

Neste estágio, o MCP parece estar no início de sua jornada, mas ainda assim temos uma ferramenta muito boa.

Se você gostou desta ferramenta, por favor, vote na atual OpenExchange Contest

Discussão (0)1
Entre ou crie uma conta para continuar