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?).
Herramientas usadas:
- Ollama: herramienta para ejecutar modelos (LLM)
- Langchain: plataforma para construir agentes de inteligencia artificial.
- Streamlit: framework de frontend.
- 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'])