eyurtsev / kor

LLM(😽)
https://eyurtsev.github.io/kor/
MIT License
1.61k stars 88 forks source link

Question about nested objects (Using Mistral Instruct 7B) #249

Closed arieltoledo closed 10 months ago

arieltoledo commented 10 months ago

Hi, so, I don't know if it's a model issue or Im doing something wrong here. Im trying out with nested objects but when I run only one of them its retrived. Lets says


schema = Objectt
    id="information",
    attributes=[ejecucion,abogados,liquidacion],
    many=True
)
Only liquidacion is returned.

schema = Object(
    id="information",
    attributes=[abogados],
    many=True
)
Abogados is returned ok
schema = Object(
    id="information",
    attributes=[ejecucion],
    many=True
)
ejecucion is returned ok

schema = Object(
    id="information",
    attributes=[liquidacion],
    many=True
)
liquidacion is returned ok

My schema looks like this:

from kor.nodes import Object, Text, Number
ejecucion = Object(
    id="info_ejecucion",
    description="Informacion en la Demanda de Ejecución Físcal. La Ejecución Físcal es un procedimiento expeditivo de cobro de tributos. Corresponden a una duda de patente o deuda de multas de infracción. ",
    attributes=[
        Text(
            id="nombre_demandada",
            description="Nombre y Apellido de la persona demandada en la Demanda de Ejecución Físcal. El nombre y apelldio del pto II.-OBJETO de la ejecución fiscal",
            examples=[("En el carácter invocado y siguiendo expresas instrucciones de nuestra instituyente, venimos por la presente a promover ejecución fiscal contra DIAZ MALVINA SOLEDAD", "DIAZ MALVINA SOLEDAD"),
                      ("En el carácter invocado y siguiendo expresas instrucciones vengo a promover ejecución fiscal contra INSAURRALDE IRMA BEATRIZ", "INSAURRALDE IRMA BEATRIZ")],
        ),
        Text(
            id="cuit_demanda",
            description="CUIT refiere a “Clave Única de Identificación Tributaria Son 11 dígitos que identifican a las personas físicas o jurídicas autónomas, empresas y comercios",
            examples=[("CUIT Nº: 27289930960", "27-28993096-0")]
        ),
        Number(
            id="monto_deuda",
            description="Monto reclamado en la Demanda de Ejecución Físcal. Los montos deben exprarse en numeros con espacios decimales completos, Ejemplo: 4532.1 => 4532.10",
            examples=[("por la suma de PESOS: CUATRO MIL NOVECIENTOS CON TREINTA Y DOS CENTAVOS ($4900,32)", 4900.32),
                      ("por la suma de PESOS CUATRO MIL QUINIENTOS TREINTA Y DOS CON DIEZ CENTAVOS ($4532,1)", 4532.10)],
        ),
    ],
    examples=[
        (
            """II.-OBJETO: En el carácter invocado y siguiendo expresas instrucciones vengo a promover ejecución fiscal contra INSAURRALDE IRMA BEATRIZ, CUIT 23225111804,
                con domicilio en B* POLICIAL-MZ.28 3 -RESISTENCIA-CHACO, y/o poseedores y/o quien resulte responsable, por la suma de PESOS: CUATRO MIL NOVECIENTOS CON TREINTA Y
                DOS CENTAVOS ($4900,32), con más sus gastos, intereses y las costas del presente juicio, un todo de acuerdo a la Ordenanza General Tributaria e Impositiva""",
            [
                {"nombre_demadnada": "INSAURRALDE IRMA BEATRIZ",  "cuit_demandada": "23-22511180-4", "monto_deuda": 4900.32}
            ]
        ),
        (
            """II.-OBJETO: En el carácter invocado y siguiendo expresas instrucciones de nuestra instituyente, venimos por la presente a promover ejecución fiscal contra DIAZ MALVINA SOLEDAD
                CUIT Nº: 27289930960, con domicilio en JUJUY 2013, RESISTENCIA, CHACO; por la suma de PESOS CUATRO MIL QUINIENTOS TREINTA Y DOS CON DIEZ CENTAVOS ($4532,1) en concepto de deuda de
                PATENTE AUTOMOTOR, enunciados en el título ejecutivo que se acompaña a la presente, con más sus gastos, intereses y las costas del presente juicio, un todo de acuerdo a la Ordenanza General
                Tributaria e Impositiva.-""",
            [
                {"nombre_demadnada": "DIAZ MALVINA SOLEDAD",  "cuit_demandada": "27-28993096-0", "monto_deuda": 4532.10}
            ]
        )]
)
abogados = Object(
    id="info_abogados",
    description="Información en la Demanda de Ejecución Físcal",
    attributes=[
        Text(
            id="nombre_abogados",
            description="Nombre y Apellido de los abogados o abogadas mencionados en el primer parrafo de la demanda de Ejecución Fiscal.",
            examples=[("PATRICIA ELENA GUITART, CÉSAR IVÁN ROMANO (mat7226@justiciachaco.gov.ar), Abogados", "PATRICIA ELENA GUITART, CÉSAR IVÁN ROMANO"),
                      ("PATRICIA ELENA GUITART y JUDITH ANDREA NUÑEZ (mat3607@justiciachaco.gov.ar), abogadas, ", "PATRICIA ELENA GUITART, JUDITH ANDREA NUÑEZ"),
            ]),

        Number(
            id="cantidad_abogados",
            description="Cantidad de abogados o abogadas que se presentan al inicio de la demandada en numeros",
            examples=[("PATRICIA ELENA GUITART, CÉSAR IVÁN ROMANO (mat7226@justiciachaco.gov.ar), Abogados", 2),
                      ("PATRICIA ELENA GUITART  (mat3607@justiciachaco.gov.ar), abogadas, ", 1),
                      ("PATRICIA ELENA GUITART, CÉSAR IVÁN ROMANO, JUDITH ANDREA NUÑEZ (mat7226@justiciachaco.gov.ar), Abogados", 3),
            ]),
    ],
    examples=[
        ("PATRICIA ELENA GUITART y JUDITH ANDREA NUÑEZ (mat3607@justiciachaco.gov.ar), abogadas, constituyendo domicilio a los efectos legales en Av. Italia Nº 150 de esta ciudad, ante el/la Señor/a Juez respetuosamente comparecemos y DECIMOS:",
            [
                {"nombre_abogados": "[PATRICIA ELENA GUITART,JUDITH ANDREA NUÑEZ]", "cantidad_abogados": 2}
            ]
        ),
        (
            "PATRICIA ELENA GUITART (mat7226@justiciachaco.gov.ar), Abogados actuando en doble carácter, constituyendo domicilio a los efectos legales en Av. Italia Nº de esta ciudad, ante V.S. respetuosamente comparecemos y DECIMOS:",
            [
                {"nombre_abogados": "[PATRICIA ELENA GUITART]", "cantidad_abogados": 1}
            ]
        ),
        (
            "PATRICIA ELENA GUITART, CÉSAR IVÁN ROMANO, JUDITH ANDREA NUÑEZ (mat7226@justiciachaco.gov.ar), Abogados actuando en doble carácter, constituyendo domicilio a los efectos legales en Av. Italia Nº de esta ciudad, ante V.S. respetuosamente comparecemos y DECIMOS:""",
            [
                {"nombre_abogados": "[PATRICIA ELENA GUITART, CÉSAR IVÁN ROMANO, JUDITH ANDREA NUÑEZ]", "cantidad_abogados": 3}
            ]
        )]
)
liquidacion = Object(
    id="info_liquidacion",
    description="Información de la Liquidación de Crédito Fiscal o Panilla de Liquidación Judicial. Liquidación de Crédito Fiscal es el titulo ejecutivo o prueba con el total adeudado.",
    attributes=[
        Text(
            id="nombre_demandada",
            description="Nombre y Apellido del Contribuyente o Infractor.",
            examples=[("Señor (es) :  INSAURRALDE IRMA BEATRIZ  y/o Poseedores y/o quien resulte responsable.", "INSAURRALDE IRMA BEATRIZ"),
                      ("Señor (es) :  DIAZ MALVINA SOLEDAD   y/o Poseedores y/o quien resulte responsable.", "DIAZ MALVINA SOLEDAD"),
                      ("INFRACTOR: DIMITRI SANCHEZ JORGE CHRISTIAN", "DIMITRI SANCHEZ JORGE CHRISTIAN"),
                      ("INFRACTOR: MARIA JOSE GONZALEZ", "MARIA JOSEFA GONZALEZ")
            ]),
        Text(
            id="cuit_demanda",
            description="CUIT refiere a “Clave Única de Identificación Tributaria Son 11 dígitos que identifican a las personas físicas o jurídicas autónomas, empresas y comercios",
            examples=[("Contribuyente: 27-28993096-0", "27-28993096-0"),
                      ("Contribuyente: 23-22511180-4", "23-22511180-4"),
                      ("DNI/CUIT/CUIL: 20-92072410-9", "20-92072410-9"),
                      ("DNI/CUIT/CUIL: 20-10850394-5", "20-10850394-5")
            ]),
        Number(
            id="monto_deuda",
            description="total DEUDA de la Liquidación Físcal. Los montos deben exprarse en numeros con espacios decimales completos, Ejemplo: 4532.1 => 4532.10",
            examples=[("Total DEUDA ------------------------------------>", 4900.32),
                      ("Total DEUDA ------------------------------------>", 4532.32)
            ]
        )],
)
schema = Object(
    id="information",
    attributes=[ejecucion,abogados,liquidacion]
)

Im executing code like this:



    repo_id = "mistralai/Mistral-7B-Instruct-v0.1"

    llm = load_llm(repo_id)

    docs = load_multiples(['data/265448-INSAURRALDE IRMA BEATRIZ-DEMANDA.pdf', 'data/265448-INSAURRALDE IRMA BEATRIZ - TITULO.pdf'])

    instruction_template = PromptTemplate(
    input_variables=["format_instructions", "type_description"],
    template=(
        "<s>[INST]"
        "Your goal is to extract structured information from the user's input that matches the form described below. When extracting information please make sure it matches the type information exactly. Do not add any attributes that do not appear in the schema shown below."
        "{type_description}" # Can comment out
        "Please output the extracted information in JSON format. Do not output anything except for the extracted information. Do not add any clarifying information. Do not add any fields that are not in the schema. If the text contains attributes that do not appear in the schema, please ignore them. All output must be in JSON format and follow the schema specified above. Wrap the JSON in <json> tags."
        "{format_instructions}"
    ),
)

    chain = create_extraction_chain(llm, schema, instruction_template=instruction_template, encoder_or_encoder_class="json", input_formatter=None)

    prompt = "\n Ejecución Físcal: ---" + docs[0] +  "\n--- Liquidación de Credito: ---\n" + docs[1] + "----[/INST]"

    print(chain.run(prompt)["data"])

if __name__ == "__main__":
    main()
´´´
eyurtsev commented 10 months ago

Could you try running with gpt 4 to eliminate the model as a confounding variable?

Also try looking at the underlying prompt to see what gets sent to the model

arieltoledo commented 10 months ago

Translating the prompt to spanish and adding extr info in it, made it work !. With the info from custom prompts just added a chain to translate the original prompt. Another fix was to add "," in a Custom TypeDescriptorat the end of each js object worked too.


information: Array<{ //
 info_ejecucion: { // Informacion en la Demanda de Ejecución Físcal. La Ejecución Físcal es un procedimiento expeditivo de cobro de tributos. Corresponden a una duda de patente o deuda de multas de infracción.
  nombre_demandada: string // Nombre y Apellido de la persona demandada en la Demanda de Ejecución Físcal. El nombre y apelldio del pto II.-OBJETO de la ejecución fiscal
  cuit_demanda: string // CUIT refiere a “Clave Única de Identificación Tributaria Son 11 dígitos que identifican a las personas físicas o jurídicas autónomas, empresas y comercios
  monto_deuda: number // Monto reclamado en la Demanda de Ejecución Físcal. Los montos deben exprarse en numeros con espacios decimales completos, Ejemplo: 4532.1 => 4532.10
 },
 info_abogados: { // Información en la Demanda de Ejecución Físcal
  nombre_abogados: string // Nombre y Apellido de los abogados o abogadas mencionados en el primer parrafo de la demanda de Ejecución Fiscal.
  cantidad_abogados: number // Cantidad de abogados o abogadas que se presentan al inicio de la demandada en numeros
 },
 info_liquidacion: { // Información de la Liquidación de Crédito Fiscal o Panilla de Liquidación Judicial. Liquidación de Crédito Fiscal es el titulo ejecutivo o prueba con el total adeudado.
  nombre_demandada: string // Nombre y Apellido del Contribuyente o Infractor.
  cuit_demanda: string // CUIT refiere a “Clave Única de Identificación Tributaria Son 11 dígitos que identifican a las personas físicas o jurídicas autónomas, empresas y comercios
  monto_deuda: number // total DEUDA de la Liquidación Físcal. Los montos deben exprarse en numeros con espacios decimales completos, Ejemplo: 4532.1 => 4532.10
 },
}>