{ "cells": [ { "cell_type": "markdown", "id": "9f97dd1e", "metadata": {}, "source": [ "# Libraries" ] }, { "cell_type": "code", "execution_count": 17, "id": "9e974df6", "metadata": {}, "outputs": [], "source": [ "import os\n", "import sys\n", "from pathlib import Path\n", "from typing import TypedDict, List, Optional, Annotated, Literal\n", "from IPython.display import Image, display\n", "from pydantic import BaseModel, Field\n", "import pandas as pd\n", "from pathlib import Path\n", "from langchain_core.messages import HumanMessage\n", "\n", "# Ensure the project root is on the path so `src` is importable\n", "_project_root = str(Path(__file__).resolve().parents[2]) if \"__file__\" in dir() else str(Path.cwd().parents[1])\n", "if _project_root not in sys.path:\n", " sys.path.insert(0, _project_root)\n", "\n", "from langchain_core.documents import Document\n", "from langchain_core.messages import BaseMessage, SystemMessage, AIMessage\n", "from langchain_core.tools import tool\n", "from langgraph.checkpoint.memory import InMemorySaver\n", "from langgraph.graph.message import add_messages\n", "from langchain_ollama import ChatOllama, OllamaEmbeddings\n", "from langchain_elasticsearch import ElasticsearchStore\n", "from langgraph.graph import StateGraph, END\n", "from langgraph.prebuilt import ToolNode, tools_condition\n", "\n", "from src.utils.llm_factory import create_chat_model\n", "from src.utils.emb_factory import create_embedding_model\n", "from src.config import (\n", " ELASTICSEARCH_LOCAL_URL,\n", " ELASTICSEARCH_INDEX,\n", " OLLAMA_MODEL_NAME,\n", " OLLAMA_EMB_MODEL_NAME,\n", " DOCS_DIR,\n", " DATA_DIR\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "30edcecc", "metadata": {}, "outputs": [], "source": [ "llm = create_chat_model(\n", " provider=\"ollama\",\n", " model=OLLAMA_MODEL_NAME,\n", " temperature=0,\n", " validate_model_on_init=True,\n", ")\n", "embeddings = create_embedding_model(\n", " provider=\"ollama\",\n", " model=OLLAMA_EMB_MODEL_NAME,\n", ")\n", "vector_store = ElasticsearchStore(\n", " es_url=ELASTICSEARCH_LOCAL_URL,\n", " index_name=ELASTICSEARCH_INDEX,\n", " embedding=embeddings,\n", " query_field=\"text\",\n", " vector_query_field=\"vector\",\n", " # strategy=ElasticsearchStore.ApproxRetrievalStrategy(\n", " # hybrid=True,\n", " # rrf={\"rank_constant\": 60, \"window_size\": 100}\n", " # )\n", ")" ] }, { "cell_type": "markdown", "id": "873ea2f6", "metadata": {}, "source": [ "### State" ] }, { "cell_type": "code", "execution_count": 4, "id": "5f8c88cf", "metadata": {}, "outputs": [], "source": [ "class AgentState(TypedDict):\n", " messages: Annotated[list, add_messages]\n", " reformulated_query: str\n", " context: str" ] }, { "cell_type": "code", "execution_count": 5, "id": "fd8ed542", "metadata": {}, "outputs": [], "source": [ "class AgenticAgentState(TypedDict):\n", " messages: Annotated[list, add_messages]" ] }, { "cell_type": "markdown", "id": "1d60c120", "metadata": {}, "source": [ "### Tools" ] }, { "cell_type": "code", "execution_count": 6, "id": "f0a21230", "metadata": {}, "outputs": [], "source": [ "retrieve_kwargs = {\"k\": 3}" ] }, { "cell_type": "code", "execution_count": 7, "id": "f9359747", "metadata": {}, "outputs": [], "source": [ "def format_context(docs: List[Document]) -> str:\n", " chunks: List[str] = []\n", " for i, doc in enumerate(docs, 1):\n", " source = (doc.metadata or {}).get(\"source\", \"Untitled\")\n", " source_id = (doc.metadata or {}).get(\"id\", f\"chunk-{i}\")\n", " text = doc.page_content or \"\"\n", " chunks.append(f\"[{i}] id={source_id} source={source}\\n{text}\")\n", " return \"\\n\\n\".join(chunks)\n", "\n", "\n", "@tool\n", "def context_retrieve(query: str) -> str:\n", " \"\"\"Consults vector store to respond AVAP related questions\n", " Args:\n", " query (str): The input query for which to retrieve relevant documents.\n", " \"\"\"\n", " retriever = vector_store.as_retriever(\n", " search_type=\"similarity\",\n", " search_kwargs=retrieve_kwargs,\n", " )\n", " docs = retriever.invoke(query)\n", " return format_context(docs)" ] }, { "cell_type": "markdown", "id": "395966e2", "metadata": {}, "source": [ "### Agent" ] }, { "cell_type": "code", "execution_count": 8, "id": "66ae23f0", "metadata": {}, "outputs": [], "source": [ "REFORMULATE_PROMPT = SystemMessage(\n", " content=(\n", " \"You are a deterministic query rewriting function.\\n\"\n", " \"You convert natural language questions into keyword search queries.\\n\\n\"\n", " \"Strict constraints:\\n\"\n", " \"1. Keep function names and technical tokens unchanged.\\n\"\n", " \"2. Remove filler phrases.\\n\"\n", " \"3. Do not answer.\\n\"\n", " \"4. Do not explain.\\n\"\n", " \"5. Do not generate code.\\n\"\n", " \"6. Return a single-line query only.\\n\"\n", " \"7. If already optimal, return unchanged.\\n\"\n", " )\n", ")\n", "\n", "GENERATE_PROMPT = SystemMessage(\n", " content=\"\"\"You are an agent designed to assist users with AVAP (Advanced Virtual API Programming) language.\n", " It's a new language, so you should know nothing about it.\n", " Use ONLY the provided context to answer AVAP-related questions.\n", " If the context does not contain enough information, say so honestly.\n", " If the question is not related to AVAP, answer based on your general knowledge.\n", "\n", " Context:\n", " {context}\"\"\"\n", ")\n", "\n", "AGENTIC_PROMPT = SystemMessage(\n", " content=\"\"\"You are an agent designed to assist users with AVAP (Advanced Virtual API Programming) language.\n", " It's a new language, so you should know nothing about it.\n", " Use ONLY the provided 'context_retrieve' tool to answer AVAP-related questions.\n", " The 'context_retrieve' tool receives a user query (as a string) and returns relevant context from a vector store.\n", " If the context does not contain enough information, say so honestly.\n", " If the question is not related to AVAP, answer based on your general knowledge.\n", " \"\"\"\n", ")" ] }, { "cell_type": "code", "execution_count": 9, "id": "36d0f54e", "metadata": {}, "outputs": [], "source": [ "def reformulate(state: AgentState) -> AgentState:\n", " \"\"\"Use the LLM to rewrite the user query for better retrieval.\"\"\"\n", " user_msg = state[\"messages\"][-1]\n", " resp = llm.invoke([REFORMULATE_PROMPT, user_msg])\n", " reformulated = resp.content.strip()\n", " print(f\"[reformulate] '{user_msg.content}' → '{reformulated}'\")\n", " return {\"reformulated_query\": reformulated}\n", "\n", "\n", "def retrieve(state: AgentState) -> AgentState:\n", " \"\"\"Retrieve context using the reformulated query.\"\"\"\n", " query = state[\"reformulated_query\"]\n", " docs = vector_store.as_retriever(\n", " search_type=\"similarity\",\n", " search_kwargs=retrieve_kwargs,\n", " ).invoke(query)\n", " context = format_context(docs)\n", " print(f\"[retrieve] {len(docs)} docs fetched\")\n", " print(context)\n", " return {\"context\": context}\n", "\n", "\n", "def generate(state: AgentState) -> AgentState:\n", " \"\"\"Generate the final answer using retrieved context.\"\"\"\n", " prompt = SystemMessage(\n", " content=GENERATE_PROMPT.content.format(context=state[\"context\"])\n", " )\n", " resp = llm.invoke([prompt] + state[\"messages\"])\n", " return {\"messages\": [resp]}" ] }, { "cell_type": "code", "execution_count": 10, "id": "f073edc9", "metadata": {}, "outputs": [], "source": [ "def agent(state: AgentState) -> AgentState:\n", " llm_with_tools = llm.bind_tools(tools)\n", " return {\"messages\": [llm_with_tools.invoke([SystemMessage(content=AGENTIC_PROMPT.content)] + state[\"messages\"])]}" ] }, { "cell_type": "markdown", "id": "ef55bca3", "metadata": {}, "source": [ "### Graph" ] }, { "cell_type": "code", "execution_count": 11, "id": "f7a0993f", "metadata": {}, "outputs": [], "source": [ "tools = [context_retrieve]\n", "tool_node = ToolNode(tools=tools)\n", "memory = InMemorySaver()\n", "\n", "graph_builder = StateGraph(AgenticAgentState)\n", "\n", "graph_builder.add_node(\"agent\", agent)\n", "graph_builder.add_node(\"tools\", tool_node)\n", "\n", "graph_builder.set_entry_point(\"agent\")\n", "graph_builder.add_conditional_edges(\n", " \"agent\",\n", " tools_condition,\n", ")\n", "graph_builder.add_edge(\"tools\", \"agent\")\n", "\n", "agentic_graph = graph_builder.compile()" ] }, { "cell_type": "code", "execution_count": 12, "id": "2fec3fdb", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "try:\n", " display(Image(agentic_graph.get_graph().draw_mermaid_png()))\n", "except Exception:\n", " pass" ] }, { "cell_type": "markdown", "id": "1e9aff05", "metadata": {}, "source": [ "### Test" ] }, { "cell_type": "code", "execution_count": 13, "id": "8569cf39", "metadata": {}, "outputs": [], "source": [ "config = {\"configurable\": {\"thread_id\": \"5\"}, \n", " #\"callbacks\": [langfuse_handler],\n", " #\"run_name\": \"rag-local-test\"differences between getDatetime() and getTimeStamp() functions in AVAP\n", " }\n", "\n", "def stream_graph_updates(user_input: str, graph: StateGraph):\n", " for event in graph.stream(\n", " {\"messages\": [{\"role\": \"user\", \"content\": user_input}]},\n", " #config=config,\n", " stream_mode=\"values\",\n", " ):\n", " event[\"messages\"][-1].pretty_print()\n", " # last_msg = event[\"messages\"][-1]\n", " # if isinstance(last_msg, AIMessage):\n", " # last_msg.pretty_print()" ] }, { "cell_type": "code", "execution_count": 14, "id": "a1a1f3cf", "metadata": {}, "outputs": [], "source": [ "user_input = \"\"\"Suppose you want to create a table called users in a database called myDatabase, with two columns: username of type VARCHAR and age of type INTEGER. How would you do that in AVAP?\"\"\"" ] }, { "cell_type": "code", "execution_count": 16, "id": "afa0c11f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 32 .avap files\n", "\n", "Processing: asignacion_booleana.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: asignacion_matematica.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: bucle_1_10.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: bucle_longitud_de_datos.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: calculo_de_expiracion.avap...\n", " ✗ Error: failed to parse JSON: unexpected end of JSON input (status code: -1)\n", "\n", "Processing: captura_de_id.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: captura_de_listas_multiples.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: comparacion_simple.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: concatenacion_dinamica.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: construccion_dinamica_de_objeto.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: contador_de_parametros.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: conversion_timestamp_legible.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: else_estandar.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: expresion_compleja.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: fecha_para_base_de_datos.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: funcion_de_suma.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: funcion_validacion_acceso.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: generador_de_tokens_aleatorios.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: hash_SHA256_para_integridad.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: hola_mundo.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: if_desigualdad.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: limpieza_de_strings.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: manejo_error_sql_critico.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: obtencion_timestamp.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: ormAccessCreate.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: paginacion_dinamica_recursos.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: referencia_por_valor.avap...\n", " ✗ Error: failed to parse JSON: unexpected end of JSON input (status code: -1)\n", "\n", "Processing: respuesta_multiple.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: salida_bucle_correcta.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: try_catch_request.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: validacion_de_nulo.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "Processing: validacion_in_pertenece_a_lista.avap...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Failed to export span batch code: 404, reason:
\"Langfuse

Loading ...

\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ✓ Processed successfully\n", "\n", "\n", "Completed! Generated 32 results.\n", "\n", " filename \\\n", "0 asignacion_booleana.avap \n", "1 asignacion_matematica.avap \n", "2 bucle_1_10.avap \n", "3 bucle_longitud_de_datos.avap \n", "4 calculo_de_expiracion.avap \n", "5 captura_de_id.avap \n", "6 captura_de_listas_multiples.avap \n", "7 comparacion_simple.avap \n", "8 concatenacion_dinamica.avap \n", "9 construccion_dinamica_de_objeto.avap \n", "\n", " answer \\\n", "0 # Understanding AVAP Programming Language\\n\\nB... \n", "1 # AVAP Language Specification Summary\\n\\n## Ov... \n", "2 Based on the provided text, **I am an AI assis... \n", "3 Based on the provided text, **I am an AI assis... \n", "4 Error: failed to parse JSON: unexpected end of... \n", "5 Thank you for sharing the AVAP (Automated Virt... \n", "6 # AVAP™ Programming Guide: Core Concepts & Fun... \n", "7 Thank you for sharing the detailed documentati... \n", "8 Based on the provided text, **I am an AI assis... \n", "9 ```json\\n{\\n \"title\": \"Expressions in AVAP™\",... \n", "\n", " context \n", "0 [1] id=chunk-1 source=1_Introduction.txt\\nIntr... \n", "1 [1] id=chunk-1 source=1_Introduction.txt\\nIntr... \n", "2 [1] id=chunk-1 source=12_Loop_statement.txt\\nS... \n", "3 [1] id=chunk-1 source=16_Function_glossary.txt... \n", "4 \n", "5 [1] id=chunk-1 source=13_Api_inbound_interface... \n", "6 [1] id=chunk-1 source=16_Function_glossary.txt... \n", "7 [1] id=chunk-1 source=9_Expressions_in_avap.tx... \n", "8 [1] id=chunk-1 source=16_Function_glossary.txt... \n", "9 [1] id=chunk-1 source=1_Introduction.txt\\nIntr... \n" ] } ], "source": [ "avap_files = list((Path(DOCS_DIR) / 'samples').glob('*.avap'))\n", "print(f\"Found {len(avap_files)} .avap files\\n\")\n", "\n", "rows = []\n", "\n", "for avap_file in sorted(avap_files):\n", " filename = avap_file.name\n", " \n", " with open(avap_file, 'r', encoding='utf-8') as f:\n", " file_content = f.read()\n", " \n", " prompt = f\"\"\"Please analyze and explain what this AVAP file does:\n", "\n", "File: {filename}\n", "Content:\n", "```\n", "{file_content}\n", "```\n", "\n", "Provide a clear, concise explanation of the purpose and functionality of this AVAP code.\"\"\"\n", " \n", " print(f\"Processing: {filename}...\")\n", " \n", " try:\n", " full_response = []\n", " for event in agentic_graph.stream(\n", " {\"messages\": [HumanMessage(content=prompt)]},\n", " stream_mode=\"values\",\n", " ):\n", " full_response.append(event[\"messages\"][-1])\n", " \n", " final_msg = full_response[-1]\n", " answer = final_msg.content if hasattr(final_msg, 'content') else str(final_msg)\n", " \n", " context = \"\"\n", " for msg in full_response:\n", " if hasattr(msg, 'tool_calls') and msg.tool_calls:\n", " pass\n", " elif hasattr(msg, 'name') and msg.name == 'context_retrieve':\n", " context = msg.content\n", " \n", " rows.append({\n", " 'filename': filename,\n", " 'answer': answer,\n", " 'context': context\n", " })\n", " print(f\" ✓ Processed successfully\\n\")\n", " \n", " except Exception as e:\n", " print(f\" ✗ Error: {str(e)}\\n\")\n", " rows.append({\n", " 'filename': filename,\n", " 'answer': f\"Error: {str(e)}\",\n", " 'context': \"\"\n", " })\n", "\n", "\n", "df_results = pd.DataFrame(rows)\n", "print(f\"\\nCompleted! Generated {len(df_results)} results.\\n\")\n", "print(df_results.head(10))" ] }, { "cell_type": "code", "execution_count": null, "id": "79bd90fd", "metadata": {}, "outputs": [ { "ename": "", "evalue": "", "output_type": "error", "traceback": [ "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n", "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n", "\u001b[1;31mClick here for more info. \n", "\u001b[1;31mView Jupyter log for further details." ] } ], "source": [ "df_results.to_parquet(DATA_DIR / 'interim' / 'rag_agent_sample_qa.parquet')" ] } ], "metadata": { "kernelspec": { "display_name": "assistance-engine", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.11" } }, "nbformat": 4, "nbformat_minor": 5 }