Uso eficaz de los modelos lingüísticos en las notas de Obsidian

Hoy he leído un artículo en Hacker News sobre un nuevo plugin para Obsidian que se integra con ChatGPT. Hay un buen número de estas herramientas en el mercado y estoy feliz de ver las diferentes formas en que la gente las está aplicando a Obsidian. pueden ayudar a la gente a hacer conexiones y darle más profundidad a su contenido de la nota. Algunos comentaristas sienten que esto reemplazará el trabajo que de otro modo harías por tu cuenta, sin embargo creo que esto en realidad te proporciona capacidades novedosas y sorprendentes.

 

Diálogo con notas

 

Quizá lo más directo e importante que quieras hacer es dialogar con el contenido de tus notas. Hacer preguntas para obtener información. Sería muy cómodo poder dirigir este modelo directamente a tus notas y que todo fuera bien. Pero la mayoría de los modelos no pueden con todo a la vez.

Cuando se tiene una pregunta, no todas las notas son relevantes. Obsidian proporciona una función de búsqueda, pero sólo busca palabras y frases exactas, lo que necesitamos buscar son conceptos. Aquí es donde entran en juego los índices incrustados. Creación de un índice es en realidad bastante simple.

 

Construcción del indexador

 

Cuando creas un plugin de Obsidian, puedes configurarlo para realizar ciertas acciones al inicio, y luego realizar otras acciones cuando ejecutas comandos, abres notas, o haces otras actividades en Obsidian. Así que queremos que el plugin entienda sus notas desde el principio, y debe guardar su progreso para que no tenga que generar el índice de nuevo. Veamos un ejemplo de código que muestra cómo construir un índice para nuestras notas. Aquí estoy usando el código [Índice de llamas], [Cadena LangChain] también es una excelente opción.

import { VectorStoreIndex, serviceContextFromDefaults, storageContextFromDefaults, MarkdownReader } from "llamaindex" ;

const service_context = serviceContextFromDefaults({ chunkSize: 256 })
const storage_context = await storageContextFromDefaults({ persistDir: ". /almacenamiento" });

const mdpath = process.argv[2];
const mdreader = nuevo MarkdownReader();
const thedoc = await mdreader.loadData(mdpath)

En primer lugar, necesitamos inicializar un almacén de datos en memoria. Este es el almacén que viene con Llama Index, pero Chroma DB también es una opción popular. La segunda línea de código indica que queremos persistir todo en el índice. A continuación, obtenemos la ruta del archivo e inicializamos un lector que lee el archivo.Llama Index entiende Markdown, por lo que puede leer e indexar el contenido correctamente. También es compatible con PDF, archivos de texto, documentos Notion, etc. No sólo almacena palabras, sino que también entiende su significado y su relación con otras palabras del texto.

await VectorStoreIndex.fromDocuments(thedoc, { storageContext: storage_context, serviceContext: service_context });

Ahora, esta parte del código hace uso de uno de los servicios de OpenAI, pero es independiente de ChatGPT y utiliza un modelo y un producto diferentes.Langchain también ofrece alternativas para hacer esto localmente, aunque un poco más lento.Ollama también ofrece incrustación. También puedes utilizar estos servicios en una instancia autoalojada superrápida en la nube, y luego apagar la instancia cuando se haya completado la indexación.

 

Notas de búsqueda

 

Hemos indexado este archivo.Obsidian puede listar todos los archivos para que podamos ejecutar este proceso una y otra vez. Estamos persistiendo los datos, por lo que sólo tenemos que operar una vez. Ahora, ¿cómo hacemos la pregunta? Necesitamos un poco de código que va a la parte pertinente de nuestras notas, la entrega al modelo, y utiliza esa información para obtener una respuesta.

const storage_context = await storageContextFromDefaults({ persistDir: ". /almacenamiento" });
const index = await VectorStoreIndex.init({ storageContext: storage_context });
const ret = index.asRetriever();
ret.similitudTopK = 5
const prompt = proceso.argv[2];
const response = await ret.retrieve(prompt);
const systemPrompt = `Utiliza el siguiente texto para responder a la pregunta: ${response.map(r => r.node.toJSON().text).join(" - ")}`.

En este código, utilizamos el contenido procesado para inicializar el índice. La línea `Retriever.retrieve` utilizará las pistas para encontrar todos los fragmentos de notas relevantes y devolvernos el texto. Aquí configuramos para usar las primeras 5 mejores coincidencias. Así obtendremos 5 fragmentos de texto de las notas. Con estos datos en bruto, podemos generar un prompt del sistema para guiar al modelo sobre cómo debe responder cuando hacemos una pregunta.

const ollama = nueva Ollama().
ollama.setModel("ollama2");
ollama.setSystemPrompt(systemPrompt);
const genout = await ollama.generate(prompt);

A continuación, empezamos a trabajar con modelos. Utilicé un modelo que creé hace unos días en [npm] en la biblioteca. He configurado el modelo para que utilicellama2, se ha descargado en mi máquina con el comando `ollama pull llama2`. Puedes experimentar con diferentes modelos para encontrar la respuesta que mejor te funcione.

Para obtener una respuesta rápida, debe elegir un modelo pequeño. Pero, al mismo tiempo, también debes elegir un modelo con un tamaño de contexto de entrada lo suficientemente grande como para contener todos los fragmentos de texto. He configurado hasta 5 fragmentos de texto de 256 tokens. La pregunta del sistema incluye nuestros fragmentos de texto. Basta con hacer una pregunta y obtener una respuesta en cuestión de segundos.

Genial, ahora nuestro plugin Obsidian es capaz de mostrar las respuestas adecuadamente.

 

¿Qué más podemos hacer?

 

También puedes plantearte simplificar el contenido del texto o encontrar las palabras clave que mejor se adapten a él y añadirlas a los metadatos para poder enlazar mejor las notas. He intentado elaborar 10 preguntas y respuestas útiles y enviarlas a [Anki] Es posible que desee probar diferentes modelos e indicaciones para lograr estos diferentes propósitos. Es muy fácil cambiar las indicaciones e incluso el peso de los modelos en función de las necesidades de la tarea.

Espero que este post te haya dado una idea de cómo desarrollar tu próximo gran plugin para Obsidian u otras herramientas para tomar notas. Como puedes ver en [ollama.comVisto lo visto, utilizar las últimas herramientas nativas de IA es pan comido, y quiero que me muestres tu creatividad.

© declaración de copyright

Artículos relacionados

Sin comentarios

Debe iniciar sesión para participar en los comentarios.
Acceder ahora
ninguno
Sin comentarios...