新しい投稿

検索

記事
· 2024年5月29日 3m read

Wall-M : Performe consultas semânticas na caixa de entrada do seu email e tenha respostas acuradas com citações de fontes

 

Introdução

Com o crescimento da Gen AI, acreditamos que agora os usuários devem ser aptos a acessar dados não estruturados de uma maneira muito mais simples. A maioria das pessoas tem muitos emails que não conseguem dar conta. Por exemplo, em investimentos/trading, os profissionais dependem de decisões rápidas que levem em consideração o máximo de informação possível. Da mesma maneira, empregados seniores em uma startup lidando com muitos times e disciplinas podem ter dificuldade em organizar todos os emails que recebem. Esses problemas comuns podem ser resolvidos usando GenAI e ajudar a fazer suas vidas mais fáceis e organizadas. A possibilidade de alucinação em modelos GenAI pode ser assustadora, e é aí que a pesquisa RAG + Hybrid aparece para salvar o dia. É isso que nos inspirou a construir o produto WALL-M (Work Assistant LL-M: Assistente de trabalho LLM - Large Language Model: Grandes modelos de linguagem).  No HackUPC 2024, desenvolvemos o WALL-M como parte do desafio de pesquisa por vetores InterSystems É uma plataforma de geração de recuperação aumentada (RAG - Retrieval Augmented Generation), desenhada para responder perguntas de forma acurada em emails com o mínimo de alucinações possíveis. Essa solução endereça o desafio de lidar com longos e numerosos emails, especialmente em áreas movidas pela velocidade, como investimento e trading, startups com muitos times e disciplinas, ou indivíduos que procuram administrar suas caixas de entrada cheias.

 

O que ele faz

Você pode carregar os emails da sua caixa de entrada e escolher filtrar por data e remetentes para definir o contexto para o LLM. Então, dentro do contexto, você pode escolher consultas específicas relacionadas aos emails escolhidos. Exemplo 1: ideias de trading baseadas em selecionar relatórios bancários ou relatórios de pesquisa de investimento. Exemplo 2: Um funcionário em uma companhia/startup pode pedir uma lista de itens de ação baseados nos emails relacionados a trabalho recebidos na última semana.


Depois disso, se você tiver quaisquer outras questões, também adicionamos um segmento para conversar com o Wall-M, baseado no contexto selecionado usando a consulta inicial. Isso assegura que todas as questões subsequentes também receberão respostas que não alucinam e incluem os emails fonte usados para gerar a resposta.
 

Como construimos ele

Frontend: Taipy

Backend: InterSystems Database, SQL

RAG + Vector Search: InterSystems Software, ChatGPT

Tools: LangChain, LlamaIndex

 

Desafios que encontramos

Aprender a usar com a framework (estrutura) de Python full-stack "TaiPy". Otimização de prompt para evitar alucinações. Usar LangChain para obter um padrão específico que inclui citações apontando para a fonte da resposta/alegação. Incompatibilidades entre diferentes ferramentas que queríamos usar.

Próximos passos para o Wall-M

Usar a prova de conceito para os casos de uso específicos e avaliar sua performance usando benchmarks  para validar a credibilidade do produto. Melhorar a integração com aplicações comuns de emails como Outlook e Gmail com usos personalizados para melhorar a utilidade do Wall-M.

Teste você mesmo

Nosso repositório GitHub : https://github.com/lars-quaedvlieg/WALL-M

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
お知らせ
· 2024年5月29日

InterSystems Ideas News #13

Hi Developers!

Welcome to Issue #13 of the InterSystems Ideas news! We dedicate this news bulletin to recently posted ideas:

​​​​✓ Most popular new ideas

✓ Recently posted ideas marked for implementation by Community members

✓ New ideas related to topics like Vector Search, GenAI and ML

 

More than 50 new ideas have been posted since the last news bulletin. We have selected and focused on the 3 most interesting groups to avoid overloading you with information. You can find all new ideas on the Ideas Portal if you're curious.

 The first group consists of the most popular new ideas based on the number of votes.

 The second group of ideas includes recently posted ideas that have "Community Opportunity" status, which means that they can be implemented by Developer Community members. You can implement them to join the Ideas portal Hall of Fame.

Finally, here are the ideas that were submitted as a part of the Vector Search, GenAI and ML programming contest.

 

👏 Many thanks to the authors of all ideas👏


✨Create your ideas, support ideas you like by comments and votes! Don't forget to advertise your ideas to Developer Community members. 🙏

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
お知らせ
· 2024年5月29日

[Video] Building a FHIR Facade

Hey Community,

Play the new video on InterSystems Developers YouTube:

⏯ Building a FHIR Facade @ Global Summit 2023

Learn how to use our FHIR architecture with existing backend systems to provide data through a production instead of or in addition to a resource repository. The following points are covered:

  • An overview of the architecture classes (repoManager, Interaction, InteractionStrategy);
  • Creating a foundation namespace+FHIR endpoint;
  • Implementing five Interaction methods (Read/Search/Add/ Delete/Update);
  • Mapping from and to FHIR in a production;
  • Validating the basic FHIR schema.

🗣 Presenter: @Keren Skubach, Senior Sales Engineer, InterSystems

Enjoy watching and look out for more videos! 👍

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
記事
· 2024年5月29日 3m read

Descripción general de las opciones de uso de InterSystems IRIS® SQL - Parte 1

  

Hola comunidad,

En esta serie de artículos, exploraremos las siguientes opciones de uso de InterSystems SQL:

  1. SQL embebido

  2. SQL dinámico

  3. Class Queries


Descripción general SQL

InterSystems SQL proporciona un conjunto completo de funciones relacionales estándar, incluida la capacidad de definir esquemas de tablas, ejecutar consultas y definir y ejecutar procedimientos almacenados. Podéis ejecutar InterSystems SQL de forma interactiva desde el portal de gestión o mediante programación utilizando una interfaz de shell SQL. El SQL embebido permite incrustar sentencias SQL en el código ObjectScript, mientras que el SQL dinámico permite ejecutar sentencias SQL dinámicas desde ObjectScript en tiempo de ejecución.

 
1. SQL embebido

Dentro de ObjectScript, InterSystems SQL admite SQL embebido: la capacidad de colocar una declaración SQL dentro del cuerpo de un método (u otro código). Con Embedded SQL, podéis consultar un único registro o definir un cursor y utilizarlo para consultar varios registros. El SQL embebido se compila. Por defecto, se compila la primera vez que se ejecuta (tiempo de ejecución), no cuando se compila la rutina que lo contiene. El SQL embebido es bastante potente cuando se utiliza junto con la capacidad de acceso a objetos de InterSystems IRIS.


2. SQL Dinámico

SQL Dinámico se refiere a las sentencias SQL que se preparan y ejecutan en tiempo de ejecución. En SQL Dinámico, la preparación y la ejecución de un comando SQL son operaciones separadas. El SQL dinámico permite programar dentro de InterSystems IRIS de forma similar a una aplicación ODBC o JDBC (salvo que se ejecuta la sentencia SQL dentro del mismo contexto de proceso que el motor de base de datos). SQL dinámico se invoca desde un programa ObjectScript. Las consultas SQL dinámicas se preparan en tiempo de ejecución del programa, no en tiempo de compilación. 


3. Class Queries

Una class query o consulta de clase es una herramienta, contenida en una clase y diseñada para usarse con SQL dinámico, para buscar registros que cumplan criterios específicos. Con las consultas de clase, podéis crear búsquedas predefinidas para una aplicación. Por ejemplo, podéis buscar registros por nombre o proporcionar una lista de registros que cumplan un conjunto particular de condiciones, como todos los vuelos de París a Madrid.

Antes de pasar a la primera opción, creemos una clase persistente Demo.Person, que también extiende la clase %Populate para poder generar algunos datos de prueba.

Class Demo.Person Extends (%Persistent, %Populate)
{
/// Person's name.
Property Name As %String(POPSPEC = "Name()") [ Required ];
/// Person's Social Security number. This is validated using pattern match.
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
/// Person's Date of Birth.
Property DOB As %Date(POPSPEC = "Date()");
/// Person's City
Property CITY As %String;
}

Ejecutad la siguiente sentencia SQL para comprobar los datos de la tabla después de compilar la clase anterior:

SELECT
ID, CITY, DOB, Name, SSN
FROM Demo.Person


Ahora ejecutad el siguiente comando para rellenar 20 registros:

do ##class(Demo.Person).Populate(20)

Volved a ejecutar la consulta SQL (SELECT):


Hemos creado la tabla y la hemos rellenado con algunos datos. En el próximo artículo, revisaremos SQL embebido.

Gracias

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
記事
· 2024年5月29日 4m read

Découvrir des indices en interrogeant les tables de messages d'interopérabilité

Lorsque nous utilisons InterSystems IRIS comme moteur d'interopérabilité, nous savons et aimons tous à quel point il est facile d'utiliser le Message Viewer pour examiner les traces des messages et voir exactement ce qui se passe dans votre production. Lorsqu’un système traite des millions de messages par jour, vous ne savez peut-être pas exactement par où commencer votre enquête.

Au cours de mes années de soutien aux productions IRIS, je me retrouve souvent à enquêter sur des choses comme...

  • Quel type de throughput ce flux de travail a-t-il ?
  • Où est le bottleneck ?
  • Quelles sont mes erreurs les plus courantes ?

L’un de mes endroits préférés pour rechercher des indices est la table d’en-tête de message, qui stocke les métadonnées de chaque message transitant par le système. Ce sont les mêmes messages qui apparaissent dans la visionneuse de messages et dans les traces visuelles. 

J'ai constitué une collection de requêtes SQL pratiques et j'aimerais les partager avec vous. Mes exemples proviennent principalement de cas d'utilisation de HealthShare ou d'IRIS for Health, mais ils peuvent être facilement adaptés à votre flux de travail...

-- Requête SQL pour trouver le nombre de messages via un composant par jour
select {fn SUBSTRING(timeprocessed,1,10)} AS day, count(*) MessagesThisDay 
FROM Ens.MessageHeader
where TargetConfigName = 'HS.Hub.Push.Evaluator' 
GROUP BY {fn SUBSTRING(timeprocessed,1,10)}
ORDER BY day ASC
-- Requête SQL pour rechercher des messages de longue durée via des composants particuliers
SELECT PReq.SessionID as SessionId, 
  PReq.TimeCreated as pReqTimeCreated, 
  PRes.TimeCreated as pResTimeCreated, 
  {fn TIMESTAMPDIFF(SQL_TSI_SECOND, PReq.TimeCreated,PRes.TimeCreated)} as TimeDelay
FROM (
  SELECT ID, SessionId, TimeCreated
  FROM Ens.MessageHeader
  WHERE MessageBodyClassName = 'HS.Message.PatientSearchRequest'
  AND SourceConfigName = 'HS.Hub.MPI.Manager'
  AND TargetConfigName = 'HUB'
) as PReq
INNER JOIN (
  SELECT ID, SessionId, TimeCreated
  FROM Ens.MessageHeader
  WHERE MessageBodyClassName = 'HS.Message.PatientSearchResponse'
  AND SourceConfigName = 'HS.Hub.MPI.Manager'
  AND TargetConfigName = 'HS.IHE.PIX.Manager.Process'
) as PRes on pReq.SessionId = PRes.SessionId
WHERE {fn TIMESTAMPDIFF(SQL_TSI_SECOND, PReq.TimeCreated,PRes.TimeCreated)} > 1
ORDER BY SessionId desc ----------------------------------------------------------
/*-- Requête pour trouver le message de bottleneck via un composant particulier
  -- définissez votre seuil pour "combien de temps est trop long (par exemple 20 secondes)
  -- recherchez des groupes de messages plus longs que cela (par exemple, le premier cluster a commencé à 3:22:00, puis il y a eu un deuxième cluster à 5:15:30)
  -- dans chaque cluster, regardez le premier message de ce cluster (chronologiquement). Il s’agit probablement du message du bottleneck, et tous les messages qui le suivent sont victimes de son bottleneck.
*/
SELECT %NOLOCK req.TargetConfigName, req.MessageBodyClassName, req.SessionId, req.TimeCreated, req.TimeProcessed, {fn TIMESTAMPDIFF(SQL_TSI_SECOND, req.TimeCreated, req.TimeProcessed)} as TimeToProcess
FROM Ens.MessageHeader AS req
WHERE req.TargetConfigName = 'HS.Hub.Management.Operations'
  AND req.TimeCreated BETWEEN '2021-04-21 00:00:00' AND '2021-04-21 11:00:00'
  AND {fn TIMESTAMPDIFF(SQL_TSI_SECOND, req.TimeCreated, req.TimeProcessed)} > 20
/* Si vous recherchez une erreur particulière, essayez celle-ci. Elle analyse le journal des erreurs de l'Ensemble à la recherche des entrées « Object to Load not found », puis renvoie certains champs clés du message PatientSearchRequest correspondant. */
SELECT l.SessionId, mh.MessageBodyID, mh.TimeCreated, psr.SearchMode, psr.RequestingUser, psr.FirstName, psr.MiddleName, psr.LastName, psr.SSN, psr.Sex, psr.DOB
FROM Ens_Util.Log as l
INNER JOIN Ens.MessageHeader as mh on l.SessionId = mh.SessionId
INNER JOIN HS_Message.PatientSearchRequest as psr on mh.MessageBodyID = psr.ID
WHERE l.Type = 'Error'
AND l.ConfigName = 'HSPI.Server.APIOperation'
AND l.Text like 'ERROR #5809: Object to Load not found%'
AND mh.MessageBodyClassName = 'HS.Message.PatientSearchRequest'
AND mh.SourceConfigName = 'HSPI.Server.APIWebService'
AND mh.TargetConfigName = 'HSPI.Server.APIOperation'
-- Analysez le journal des erreurs Ensemble pour une période particulière. Comptez les différents types d’erreurs
SELECT substring(text,1,80) as AbbreviatedError, count(*) as NumTheseErrors
FROM Ens_Util.Log
WHERE Type = 'Error'
AND TimeLogged > '2022-03-03 00:00:00' -- when the last batch started
AND TimeLogged < '2022-03-03 16:00:00' -- when we estimate this batch might end
GROUP BY substring(text,1,80)
ORDER BY NumTheseErrors desc
-- Recherchez le temps de traitement de la passerelle pour chaque paire StreameltRequest / ECRFetchResponse
SELECT sr.Gateway,request.sessionid, response.sessionid, request.timecreated AS starttime, response.timecreated AS stoptime, 
  datediff(ms,request.timecreated,response.timecreated) AS ProcessingTime, 
  Avg(datediff(ms,request.timecreated,response.timecreated)) AS AverageProcessingTimeAllGateways
FROM Ens.MessageHeader request
INNER JOIN Ens.MessageHeader AS response ON response.correspondingmessageid = request.id
INNER JOIN HS_Message.StreamletRequest AS sr ON sr.ID = request.MessageBodyId
WHERE request.messagebodyclassname = 'HS.Message.StreamletRequest'
AND response.messagebodyclassname = 'HS.Message.ECRFetchResponse'
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください