Artículo
· 16 nov, 2023 Lectura de 7 min

LangChain InterSystems PDF para Preguntas y Tarjetas de Repaso (Flash Cards)

Ejemplo de demostración para el Gran Premio de Programación de InterSystems, sobre el uso de plantillas más complejas para probar funcionalidades de IA.

Preguntas para la entrevista

Hay documentación. Para un puesto de trabajo, una persona de recursos humanos quiere evaluar rápidamente a los candidatos con varias preguntas técnicas relevantes para el puesto.

¿Puede automatizar el trabajo haciendo una lista de preguntas y respuestas a partir de la documentación disponible?

Respuestas de la entrevista y Aprendizaje

Una de las formas más efectivas de fijar nuevos datos de manera accesible en la memoria a largo plazo es a través del recordatorio en fases.

En esencia, se coge un bloque de información en formato texto, y se reorganiza en una serie de Preguntas y Hechos independientes.

Ahora imaginemos dos preguntas:

  • ¿Qué día de la semana se coloca fuera el contenedor de basura para su recogida?
  • ¿Cuándo es el aniversario de boda?

Recordar de forma rápida las respuestas correctas puede significar una vida más feliz!!

Recordar la respuesta a cada pregunta ES el mecanismo para fijar un hecho en la memoria.

El recuerdo en fases vuelve a preguntar cada pregunta con intervalos de tiempo más largos y prolongados cuando se recuerda la respuesta correcta. Por ejemplo:

  • La persona responde siempre correctamente: La pregunta se vuelve a hacer mañana, en 4 días, en 1 semana, en 2 semanas, en 1 mes.
  • La persona nunca responde correctamente: La pregunta se vuelve a hacer todos los días hasta que empieza a responder correctamente.

Si ves que algunas preguntas te suponen un reto, es productivo volver a trabajar sobre preguntas difíciles, para hacer que se te queden en la memoria.

Hay un software gratuito llamado Anki que ofrece este proceso de aprendizaje en fases.

Si podéis automatizar la creación de preguntas y respuestas en un fichero de texto, Anki creará nuevas tarjetas de repaso (flash cards) para vosotros.

Hipótesis

Podemos usar LangChain para transformar la documentación en PDF de InterSystems en una serie de Preguntas y Respuestas para:

  • Hacer preguntas y respuestas para entrevistas
  • Crear tarjetas de repaso (flash cards) Anki para aprender

Crear un nuevo entorno virtual

mkdir chainpdf

cd chainpdf

python -m venv .

scripts\activate 

pip install openai
pip install langchain
pip install wget
pip install lancedb
pip install tiktoken
pip install pypdf

set OPENAI_API_KEY=[ Your OpenAI Key ]

python

Preparar los documentos

import glob
import wget;

url='https://docs.intersystems.com/irisforhealth20231/csp/docbook/pdfs.zip';
wget.download(url)
# extract docs
import zipfile
with zipfile.ZipFile('pdfs.zip','r') as zip_ref:
  zip_ref.extractall('.')

Extraer texto del PDF

from langchain.document_loaders import PyPDFLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.prompts.prompt import PromptTemplate
from langchain import OpenAI
from langchain.chains import LLMChain

# To limit for the example
# From the documentation site I could see that documentation sets
# GCOS = Using ObjectScript
# RCOS = ObjectScript Reference
pdfFiles=['./pdfs/pdfs/GCOS.pdf','./pdfs/pdfs/RCOS.pdf']

# The prompt will be really big and need to leave space for the answer to be constructed
# Therefore reduce the input string
text_splitter = CharacterTextSplitter(
    separator = "\n\n",
    chunk_size = 200,
    chunk_overlap  = 50,
    length_function = len,
)

# split document text into chuncks
documentsAll=[]
for file_name in pdfFiles:
  loader = PyPDFLoader(file_name)
  pages = loader.load_and_split()
  # Strip unwanted padding
  for page in pages:
    del page.lc_kwargs
    page.page_content=("".join((page.page_content.split('\xa0'))))
  documents = text_splitter.split_documents(pages)
  # Ignore the cover pages
  for document in documents[2:]:
    # skip table of contents
    if document.page_content.__contains__('........'):
      continue
    documentsAll.append(document)

Preparar la plantilla de búsqueda

_GetDocWords_TEMPLATE = """From the following documents create a list of distinct facts.
For each fact create a concise question that is answered by the fact.
Do NOT restate the fact in the question.

Output format:
Each question and fact should be output on a seperate line delimited by a comma character
Escape every double quote character in a question with two double quotes
Add a double quote to the beginning and end of each question
Escape every double quote character in a fact with two double quotes
Add a double quote to the beginning and end of each fact
Each line should end with {labels}

The documents to reference to create facts and questions are as follows:
{docs}
"""

PROMPT = PromptTemplate(
     input_variables=["docs","labels"], template=_GetDocWords_TEMPLATE
)

llm = OpenAI(temperature=0, verbose=True)
chain = LLMChain(llm=llm, prompt=PROMPT)

Procesar cada documento y colocar el resultado en el archivo

# open an output file
with open('QandA.txt','w') as file:
  # iterate over each text chunck
  for document in documentsAll:
    # set the label for Anki flashcard
    source=document.metadata['source']
    if source.__contains__('GCOS.pdf'):
      label='Using ObjectScript'
    else:
      label='ObjectScript Reference'
    output=chain.run(docs=document,labels=label)
    file.write(output+'\n')
    file.flush()

 

Hubo algunos reintentos y mensajes de cierre durante este ciclo. Intentar anticipar en lo posible esta situación os ayudará a limitar las llamadas a la API de OpenAI y que os mantengáis dentro de su "fair use".

Como alternativa, se podría utilizar una LLM local.

Examinar el fichero de salida

"What are the contexts in which ObjectScript can be used?", "You can use ObjectScript in any of the following contexts: Interactively from the command line of the Terminal, As the implementation language for methods of InterSystems IRIS object classes, To create ObjectScript routines, and As the implementation language for Stored Procedures and Triggers within InterSystems SQL.", Using ObjectScript,
"What is a global?", "A global is a sparse, multidimensional database array.", Using ObjectScript,
"What is the effect of the ##; comment on INT code line numbering?", "It does not change INT code line numbering.", Using ObjectScript,
"What characters can be used in an explicit namespace name after the first character?", "letters, numbers, hyphens, or underscores", Using ObjectScript
"Are string equality comparisons case-sensitive?", "Yes" Using ObjectScript,
"What happens when the number of references to an object reaches 0?", "The system automatically destroys the object.",Using ObjectScript
Question: "What operations can take an undefined or defined variable?", Fact: "The READ command, the $INCREMENT function, the $BIT function, and the two-argument form of the $GET function.", Using ObjectScript,  a

Se ha hecho un buen intento de formatear las respuestas, pero existe cierta desviación.

Revisando manualmente, se pueden escoger algunas preguntas y respuestas para continuar con el experimento.

Importar FlashCards en Anki

Archivo de texto revisado:

"What are the contexts in which ObjectScript can be used?", "You can use ObjectScript in any of the following contexts: Interactively from the command line of the Terminal, As the implementation language for methods of InterSystems IRIS object classes, To create ObjectScript routines, and As the implementation language for Stored Procedures and Triggers within InterSystems SQL.", "Using ObjectScript",
"What is a global?", "A global is a sparse, multidimensional database array.", "Using ObjectScript",
"What is the effect of the ##; comment on INT code line numbering?", "It does not change INT code line numbering.", "Using ObjectScript",
"What characters can be used in an explicit namespace name after the first character?", "letters, numbers, hyphens, or underscores", "Using ObjectScript"
"Are string equality comparisons case-sensitive?", "Yes", "Using ObjectScript",
"What happens when the number of references to an object reaches 0?", "The system automatically destroys the object.","Using ObjectScript"
"What operations can take an undefined or defined variable?", "The READ command, the $INCREMENT function, the $BIT function, and the two-argument form of the $GET function.", "Using ObjectScript"

Crear un nuevo mazo (tema) de cartas Anki

Abrir Anki e ir a File -> Import

Seleccionar el archivo de texto revisado.

Opcionalmente, crear un nuevo mazo de cartas para el tema "ObjectScript".

Un tipo de tarjeta "básica" está bien para este formato

Se menciona un "Campo 4" (Field 4) por lo que hay que revisar los registros.

Éxito en la importación a Anki

Vamos a estudiar

Elegir el plan de refuerzo

Explicación del traductor.- Si la pregunta resulta fácil, se puede indicar y la repetirá dentro de 4 días. Si resulta normal, la repetirá en menos de 10 minutos. Si resulta difícil, la repetirá en menos de 6 minutos. Y si resulta muy difícil, la repetirá en menos de 1 minuto.

Referencias

El software Anki está disponible en https://apps.ankiweb.net/

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