Una revisión del sistema experto Docassemble

Descubre el Superpoder de Docassemble: Transforma la Información Jurídica en Acción

Posted by     "Daniel Arbelaez" on Tuesday, July 11, 2023

¿Alguna vez has sentido esa sensación de vértigo al enfrentarte a miles de páginas de jurisprudencia, normas, leyes entre otros, buscando encontrar la joya entre el desorden?

Imagínate tener un superpoder que te permite filtrar rápidamente el ruido y descubrir exactamente lo que necesitas saber, sin perder tiempo en lo irrelevante. Este poder existe, y su nombre es Docassemble, un sistema experto de ensamblaje de documentos que transforma la forma en que interactuamos con la información judicial.

Pero ¿cómo funciona realmente este misterioso superpoder? Y más importante aún, ¿cómo puedes incorporarlo en tus proyectos de software para mejorar significativamente tus prácticas de programación?

Atraviesa este viaje conmigo mientras exploramos juntos el fascinante mundo de Docassemble, descubriendo cómo sus características avanzadas pueden revolucionar la forma en que abordamos el desarrollo de software y ámbito jurídico.

Conceptos basicos

Docassemble es un sistema experto de ensamblaje de documentos basado en Python, YAML y Markdown, hace las veces de un lenguaje de programacion declarativo (no se le dice que hacer sino el como).

El orden de las preguntas no se determina, lo elige el sistema segun sus necesidades y las respuestas dadas en la entrevistas ya que se trata de un sistema basado en reglas, leyes o normas y lo que se sigue es mas similar a una lista de chequeo, asi como cuando un piloto de avion hace una lista de chequeo de su nave, las condiciones climaticas y las condiciones propias antes de iniciar su vuelo.

Hello world - Prueba01

link al recurso

  • Se hace una prueba de funcionamiento donde se hacen preguntas, se obtienen datos en variables, se usa codigo Python, se usa una plantilla de word (debe tenerse agregada al folder del proyecto como template) y se decora una pregunta con una imagen (debe agregarse al folder del proyecto como static file).
---
# En esta parte se agrega una variable planet en la pregunta inicial
question: Hello, ${ planet }! 
subquestion: |
  I surmise that you have no more than ${ inhabitant_count }
  inhabitants.  
attachment:
  name: A letter for the inhabitants of ${ planet }
  filename: hello
  docx template file: hello_planet.docx
buttons:
  - Exit: exit
mandatory: True
---
question: |
  What is your planet's name?  
fields:
  - Your Planet: planet
decoration: daniel
---
code: |
  if favorite_number == 42:
    inhabitant_count = 2
  else:
    inhabitant_count = 2000 + favorite_number * 45  
---
question: What is your favorite number?
fields:
  - Number: favorite_number
    datatype: number
---
image sets:
  freepik:
    images:
      daniel: Foto_perfil.jpeg
    attribution: |
      Icon made by [Freepik](https://www.flaticon.com/authors/freepik)      
---

Para empaquetar la entrevista o exportarla se usa la siguiente forma link

Como escribir una entrevista

Link al recurso

  • Se almacenan las respuestas en variables y se pueden agregar a preguntas o al texto de los documentos

  • Las preguntas dadas a un usuario pueden variar en funcion de las respuestas dadas

  • Solo necesitas darle el objetivo final y Docassemble hara las preguntas necesarias para llegar a ese objetivo final

  • El siguiente fragmento de YAML contiene la forma en la que se puede aplicar copigo python al interior de un documento word.

mandatory: True
question: |
  Welcome to the interview!  
continue button field: intro
---
mandatory: True
question: |
  What is your favorite fruit?  
fields:
  - Fruit: favorite_fruit
---
mandatory: favorite_fruit == 'apple'
question: |
  What is your favorite type of apple?  
fields:
  - Type of apple: favorite_apple
---
mandatory: True
question: |
  Here is your document.  
attachment:
  content: |
    Your favorite fruit is ${ favorite_fruit }.

    % if favorite_fruit == 'apple':
    Your favorite type of apple is ${ favorite_apple }.

    % endif    
  • Listas y Diccionarios
# Lista
- Sweep the porch
- Take out the garbage
# Diccionario
lawyer: A person who represents you.
judge: A person who decides who wins or loses a court case.
# Diccionario de lista
Frank:
  - Sweep the porch
  - Take out the garbage
  - Clean the toilets
Sally:
  - Rake the leaves
  - Mow the lawn
# Lista de diccionario
- title: Tale of Two Cities
  author: Charles Dickens
- title: Moby Dick
  author: Herman Melville
- title: Green Eggs and Ham
  author: Dr. Seuss

Bloques iniciales

Link al recurso

  • Se configura una parte inicial de cada entrevista que da cuenta del titulo de la entrevista y una pregunta inicial que igualmente se muestra en pantalla
---
metadata:
  title: |
    Tutela    
  short title: |
    Admision    
  description: |
    Una entrevista para solucionar un caso de uso legal    
  authors:
    - name: Daniel Arbelaez
      organization: Organization Name
  revision_date: 2023-07-12
  # Hace que el login no aparezca en pantalla
  show login: False
---
# Debe de incluirse el mandatory para guiar a docassemble por donde empezar
mandatory: True
question: Cual es tu nombre
fields:
  - Nombre: nombre
---
# Debe de incluirse el mandatory para guiar a docassemble por donde finalizar
mandatory: True
question: |
  Aqui finaliza el documento  
attachment:
  content: |
    Hola ${ nombre }, un gusto volver a verte!    
---
  • Para importar modulos de python se usa
---
modules:
  - datetime
---
  • Para usar una lista de datos en una pregunta asi:

alt

variable name: fruits
data:
  - Apple
  - Orange
  - Peach
  - Pear
---
# Si solo hay una pregunta debe ponerse el mandatory true
mandatory: True
question: |
  What is your favorite fruit?  
field: user_favorite_fruit
dropdown:
  code: fruits
  • Para agregar comentarios a palabras de entrevistas

alt

terms:
  creeper: |
    A tall green creature that explodes if
    you get too close.    
  zombie pigman: |
    A harmless creature who carries a gold
    sword.    
---
mandatory: True
question: Have you ever met a {creeper}?
subquestion: |
  If you have met a {zombie pigman}, you
  have almost certainly met a creeper.  
yesno: met_a_creeper
  • Para mostrar secciones

alt

# Se indican las secciones que tiene la entrevista
sections:
  - intro: Introduction
  - about: About you
    subsections:
      - contact: Contact info
      - demographic: Demographics
  - prefs: Preferences
  - conclusion: Conclusion
---
# Se habilita la funcion de barra de navegacion
features:
  navigation: True
---
mandatory: True
question: |
  Welcome to the interview  
subquestion: |
  If you are not on a
  smartphone-sized device,
  you should see a navigation
  bar to the left.  
# Se agrega como variable la barra de navegacion
field: sees_nav_bar
---
mandatory: True
question: |
  I am going to ask you some
  questions about yourself.  
field: intro_to_about_you
# Se indica la seccion a la que pertenece la pregunta
section: about
---
mandatory: True
question: |
  What is your name?  
fields:
  - First Name: first_name
  - Last Name: last_name
# Se indica la seccion a la que pertenece la pregunta
section: contact
---
mandatory: True
question: |
  What is your e-mail address?  
fields:
  - E-mail: email_address
    datatype: email
---
mandatory: True
question: |
  What is your gender?  
field: gender
choices:
  - Male
  - Female
  - Something else
# Se indica la seccion a la que pertenece la pregunta
section: demographic
---
mandatory: True
question: |
  What kind of belly button
  do you have?  
field: belly_button
choices:
  - Innie
  - Outie
---
mandatory: True
question: |
  What is your favorite fruit?  
fields:
  - Favorite fruit: favorite_fruit
# Se indica la seccion a la que pertenece la pregunta
section: prefs
---
mandatory: True
question: |
  What is your favorite vegetable?  
fields:
  - Favorite vegetable: favorite_vegetable
---
mandatory: True
question: Thank you.
subquestion: |
  ${ first_name },

  Your answers mean a lot to me.
  
  I am going to go eat some
  ${ favorite_vegetable }
  now.  
# Se indica la seccion a la que pertenece la pregunta
section: conclusion

Bloques de preguntas

Lo que ven los usuarios en cada pantalla de entrevista es un bloque de pregunta y es una seccion de YAML que contiene un especificador de bloque

Los bloques de preguntas pueden ser, bloques iniciales, preguntas de codigo o bloques de pregunta

question: |
  Gracias por tu dedicacion al responder **"${respuesta_usuario}"**   
# La estructura Mako permite ingresar variables en otras preguntas y tambien la estructura de Markdown permite aplicar estilos al texto
mandatory: True
---
question: |
  Este proyecto tendra futuro, estas de acuerdo?  
subquestion: |
  Se trata de identificar la persepcion del usuario con el proyecto  
# subquestion, es una seccion que se usa para explicar la pregunta
under: |
  Nota: Este es el `under`  
# under es una seccion adicional del texto ubicada debajo de los botones
pre: |
  Note: este es el `pre`.  
post: |
  This is the `post`, which comes
  after `under`.  
right: |
  ### Note
    
  this is `right` option
    
  If you did not catch this
  movie reference, you need to
  improve your cultural literacy.  
mandatory: True
fields:
  - Responder: respuesta_usuario # Al ingresa una variable se tiene que realizar indicandola en tipo lista (-)

En caso de configurar en la pregunta un texto con right se puede usar la caracteristica centered para alinear las pregunta y el right

features:
  centered: False
---
question: |
  What is the airspeed velocity of an
  unladen swallow?  
fields:
  - Velocity: swallow_velocity
right: |
  ### Note
    
  If you did not catch this
  movie reference, you need to
  improve your cultural literacy.  

Para asignar variables con preguntas se usa el siguiente proceso

question: |
  Are you at least 18 years of age?  
yesno: over_eighteen

Para solicitar la firma del usuario se realiza de la siguiente forma:

question: |
  Sign your name  
subquestion: |
  By signing your name, you agree to
  our terms and conditions.  
signature: target_variable
under: |
  ${ user }  

Para crear una pantalla de finalización con botones se usa:

mandatory: True
question: |
  Felicitaciones!  
subquestion: |
  Has finalizado la creación de la providencia.  
buttons:
  - Exit: exit
    url: https://www.ramajudicial.gov.co/portal/inicio
  - Restart: restart

Establecer variables

Link al recurso

Para indicarle a docassemble que almacene la entrada del usuario que recibe en respuesta a una pregunta , debe incluir en su nombre questionde variable para contener la información. También debe indicar qué tipo de variable es (p. ej., texto, una fecha, un número) y cómo desea solicitar la entrada (p. ej., con una etiqueta).

Preguntas con variable booleana, además se agrega una opción “No sé” que pertenece a la sigueinte instrucción:

question: |
  Is Topeka the capital of Kansas?  
yesnomaybe: topeka_is_capital_of_kansas
---
question: |
  % if topeka_is_capital_of_kansas:
  You were right that Topeka is the capital of Kansas.
  % elif topeka_is_capital_of_kansas is None:
  You should know your state capitals!
  % else:
  Actually, Topeka is the capital of Kansas.
  % endif  
mandatory: True

Botones de opcion múltiple

question: |
  How would you like to pay for your
  car?  
field: target_variable
buttons:
  - Buy it: purchaser
  - Lease it: borrower

Botones creados con código

field: target_variable
question: |
  Your use of this system does not
  mean that you have a lawyer.  Do
  you understand this?  
buttons:
  code: |
    [{'understands': "I understand"},
     {'does not understand': "I do not understand"},
     {'unsure': "I'm not sure"}]    

Checkboxes

question: |
  Please provide the following information.  
fields:
  - "What is your favorite food?": favorite_food
  - note: Check which foods you like.
  - Apples: likes_apples
    datatype: yesno
  - Turnips: dislikes_turnips
    datatype: noyes

Preguntas de codigo

Ejemplo de bloque de código

code: |
  answer = 2 + 2  
---
question: |
  The answer is ${ answer }.  
mandatory: True

El contenido de ${ … }se procesa como código Python . El código que se puede colocar dentro ${ … }está limitado a una línea de código, cuyo resultado se coloca en el texto de la pregunta. Por lo tanto, no podría incluir varias líneas de código dentro de una ${ … } expresión.

Además de mayor que ( >) y menor que ( <), los siguientes operadores condicionales están disponibles en Python :

a == b es verdadero si es aigual a b. Hay dos signos iguales para distinguir esto de a = b, lo que establece el valor de aal valor de b. Esto funciona tanto con números como con texto. a is b es esencialmente sinónimo de a == b. a >= b es verdadero si aes mayor o igual que b. a <= b es verdadero si aes menor o igual que b. a in b es verdadero si bes una lista , un diccionario o un conjunto y a está contenido dentro de b. Por ejemplo, 42 in [13, 42, 62] es cierto. Esto también funciona con texto. Si lo hace a = "Fred", entonces a in ["Mary", "Fred", "Scott"] será verdadero, mientras que a in ["Harold", "Anthony", “Norman”]será falso. En el caso de que bsea un diccionario , a in bdevolverá verdadero si a es una clave dentro b.

Otro ejemplo del uso de bloques de código

---
code: |
  if user_age > 60:
    product_recommendation = 'Oldsmobile'
  else:
    product_recommendation = 'Mustang'  
---
question: What is your age?
fields:
  - Age in Years: user_age
    datatype: number
---

Objetos

Para determinar variables de varios sujetos es recomendable usar los objetos en docassemble

Logica de entrevistas

A diferencia de otros sistemas de entrevistas guiadas, en los que el desarrollador de la entrevista traza un árbol de decisiones o diagrama de flujo para indicar qué preguntas se deben hacer y en qué orden, docassemble determina qué preguntas hacer y cuándo hacerlas según las reglas que usted especifique . Estas reglas se especifican mediante bloques YAML.

El estilo de lógica “declarativa” es muy útil en estas circunstancias. Todo lo que necesita hacer es el trabajo de un abogado: concentrarse en especificar reglas que sean legalmente correctas. Puede especificar varias reglas superpuestas, que abarquen casos especiales y casos generales.

Una entrevista simple consta de bloques de preguntas con mandatory: True y las mismas se ejecutarán de forma secuencial en el orden del YAML, ejemplo:

mandatory: True
question: |
  Welcome to the interview!  
continue button field: intro
---
mandatory: True
question: |
  What is your favorite fruit?  
fields:
  - Fruit: favorite_fruit
---
mandatory: True
question: |
  What is your favorite vegetable?  
fields:
  - Vegetable: favorite_vegetable
---
mandatory: True
question: |
  Here is your document.  
attachment:
  content: |
    Your favorite fruit is ${ favorite_fruit }.

    % if favorite_fruit == 'apple':
    You will never need to see a doctor.

    % endif
    Your favorite vegetable is ${ favorite_vegetable }.    

Es posible orientar las preguntas siguientes en función de las respuestas dadas incorporando en el mandatory una expresion en Python así:

---
mandatory: True
question: |
  What is your favorite fruit?  
fields:
  - Fruit: favorite_fruit
---
mandatory: favorite_fruit == 'apple'
question: |
  What is your favorite type of apple?  
fields:
  - Type of apple: favorite_apple
---

Cuando se presentan muchas ramas anidadas de decisión en la entrevista se puede implementar la satisfacción de la dependencia para evitar que la expresión de python no sea tan compleja así:

mandatory: True
question: |
  Your favorite fruit is ${ favorite_fruit }.  
subquestion: |
  % if favorite_fruit == 'grapes':
  Your favorite vineyard is ${ favorite_vineyard }.
  % endif  
---
question: |
  Which vineyard do you think produces the best grapes?  
fields:
  - Vineyard: favorite_vineyard
---
question: |
  What is your favorite fruit?  
fields:
  - Fruit: favorite_fruit

Para crear un bloque de código aplicando una regla del negocio:

code: |
  if user.age_in_years() >= 60 or user.is_disabled:
    user.eligible = True
  else:
    user.eligible = False  

Hemos recorrido juntos el impresionante panorama (general) de Docassemble, descubriendo cómo este sistema experto de ensamblaje de documentos puede transformar nuestra relación con la información técnica y mejorar nuestras prácticas jurídicas. Pero el viaje no termina aquí. Hay mucho más por descubrir, especialmente cuando hablamos de aplicar estas habilidades al ámbito legal.

Si sientes que hay un vacío en tu conocimiento sobre cómo ensamblar documentos legales de manera eficiente y precisa, si estás listo para expandir tus horizontes y explorar nuevas formas de integrar Docassemble en tus proyectos, te invito a seguir este blog.

Preparate para recibir regularmente contenido exclusivo sobre Docassemble, casos de estudio, consejos prácticos y tutoriales paso a paso. No te pierdas la próxima entrada.