Files
wehub-resource-sync a0c8464e58
Build Package / build (ubuntu-latest) (push) Failing after 1s
CodeQL / Analyze (python) (push) Failing after 1s
Core Typecheck / core-typecheck (push) Failing after 1s
Linting / lint (push) Failing after 1s
llama-dev tests / test-llama-dev (push) Failing after 1s
Publish Sub-Package to PyPI if Needed / publish_subpackage_if_needed (push) Has been skipped
Sync Docs to Developer Hub / sync-docs (push) Failing after 0s
Build Package / build (windows-latest) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:26:52 +08:00

667 lines
21 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"id": "cf89fbaa",
"metadata": {},
"source": [
"<a href=\"https://colab.research.google.com/github/run-llama/llama_index/blob/main/docs/examples/output_parsing/df_program.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "530c973e-916d-4c9e-9365-e2d5306d7e3d",
"metadata": {},
"source": [
"# DataFrame Structured Data Extraction"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "18461ba1-6978-4b5b-861e-6dceec36857b",
"metadata": {},
"source": [
"This demo shows how you can extract tabular DataFrames from raw text.\n",
"\n",
"This was directly inspired by jxnl's dataframe example here: https://github.com/jxnl/openai_function_call/blob/main/auto_dataframe.py.\n",
"\n",
"We show this with different levels of complexity, all backed by the OpenAI Function API:\n",
"- (more code) How to build an extractor yourself using our OpenAIPydanticProgram\n",
"- (less code) Using our out-of-the-box `DFFullProgram` and `DFRowsProgram` objects\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "fb240ba9-2f23-4686-8097-4f1d7bdf02cb",
"metadata": {},
"source": [
"## Build a DF Extractor Yourself (Using OpenAIPydanticProgram)\n",
"\n",
"Our OpenAIPydanticProgram is a wrapper around an OpenAI LLM that supports function calling - it will return structured\n",
"outputs in the form of a Pydantic object.\n",
"\n",
"We import our `DataFrame` and `DataFrameRowsOnly` objects.\n",
"\n",
"To create an output extractor, you just need to 1) specify the relevant Pydantic object, and 2) Add the right prompt"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "bb74e24d",
"metadata": {},
"source": [
"If you're opening this Notebook on colab, you will probably need to install LlamaIndex 🦙."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bc357ded",
"metadata": {},
"outputs": [],
"source": [
"%pip install llama-index-llms-openai\n",
"%pip install llama-index-program-openai"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "101e1779",
"metadata": {},
"outputs": [],
"source": [
"!pip install llama-index"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1c3f2918-7776-4b59-88da-07299cda4f25",
"metadata": {},
"outputs": [],
"source": [
"from llama_index.program.openai import OpenAIPydanticProgram\n",
"from llama_index.core.program import (\n",
" DFFullProgram,\n",
" DataFrame,\n",
" DataFrameRowsOnly,\n",
")\n",
"from llama_index.llms.openai import OpenAI"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bcb69ed8-7b02-4fac-b6b6-b09c301fc2cc",
"metadata": {},
"outputs": [],
"source": [
"program = OpenAIPydanticProgram.from_defaults(\n",
" output_cls=DataFrame,\n",
" llm=OpenAI(temperature=0, model=\"gpt-4-0613\"),\n",
" prompt_template_str=(\n",
" \"Please extract the following query into a structured data according\"\n",
" \" to: {input_str}.Please extract both the set of column names and a\"\n",
" \" set of rows.\"\n",
" ),\n",
" verbose=True,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "420c26b2-f652-436c-a661-d594c56496c8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Function call: DataFrame with args: {\n",
" \"columns\": [\n",
" {\n",
" \"column_name\": \"Name\",\n",
" \"column_desc\": \"Name of the person\"\n",
" },\n",
" {\n",
" \"column_name\": \"Age\",\n",
" \"column_desc\": \"Age of the person\"\n",
" },\n",
" {\n",
" \"column_name\": \"City\",\n",
" \"column_desc\": \"City where the person lives\"\n",
" },\n",
" {\n",
" \"column_name\": \"Hobby\",\n",
" \"column_desc\": \"What the person likes to do\"\n",
" }\n",
" ],\n",
" \"rows\": [\n",
" {\n",
" \"row_values\": [\"John\", 25, \"New York\", \"play basketball\"]\n",
" },\n",
" {\n",
" \"row_values\": [\"Mike\", 30, \"San Francisco\", \"play baseball\"]\n",
" },\n",
" {\n",
" \"row_values\": [\"Sarah\", 20, \"Los Angeles\", \"play tennis\"]\n",
" },\n",
" {\n",
" \"row_values\": [\"Mary\", 35, \"Chicago\", \"play tennis\"]\n",
" }\n",
" ]\n",
"}\n"
]
},
{
"data": {
"text/plain": [
"DataFrame(description=None, columns=[DataFrameColumn(column_name='Name', column_desc='Name of the person'), DataFrameColumn(column_name='Age', column_desc='Age of the person'), DataFrameColumn(column_name='City', column_desc='City where the person lives'), DataFrameColumn(column_name='Hobby', column_desc='What the person likes to do')], rows=[DataFrameRow(row_values=['John', 25, 'New York', 'play basketball']), DataFrameRow(row_values=['Mike', 30, 'San Francisco', 'play baseball']), DataFrameRow(row_values=['Sarah', 20, 'Los Angeles', 'play tennis']), DataFrameRow(row_values=['Mary', 35, 'Chicago', 'play tennis'])])"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# NOTE: the test example is taken from jxnl's repo\n",
"\n",
"response_obj = program(\n",
" input_str=\"\"\"My name is John and I am 25 years old. I live in \n",
" New York and I like to play basketball. His name is \n",
" Mike and he is 30 years old. He lives in San Francisco \n",
" and he likes to play baseball. Sarah is 20 years old \n",
" and she lives in Los Angeles. She likes to play tennis.\n",
" Her name is Mary and she is 35 years old. \n",
" She lives in Chicago.\"\"\"\n",
")\n",
"response_obj"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fe28dc6d-98f9-4530-a5c4-255ae68d6d9c",
"metadata": {},
"outputs": [],
"source": [
"program = OpenAIPydanticProgram.from_defaults(\n",
" output_cls=DataFrameRowsOnly,\n",
" llm=OpenAI(temperature=0, model=\"gpt-4-0613\"),\n",
" prompt_template_str=(\n",
" \"Please extract the following text into a structured data:\"\n",
" \" {input_str}. The column names are the following: ['Name', 'Age',\"\n",
" \" 'City', 'Favorite Sport']. Do not specify additional parameters that\"\n",
" \" are not in the function schema. \"\n",
" ),\n",
" verbose=True,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4ac6260c-c06a-48e6-9f7e-1892dd988eac",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Function call: DataFrameRowsOnly with args: {\n",
" \"rows\": [\n",
" {\n",
" \"row_values\": [\"John\", 25, \"New York\", \"basketball\"]\n",
" },\n",
" {\n",
" \"row_values\": [\"Mike\", 30, \"San Francisco\", \"baseball\"]\n",
" },\n",
" {\n",
" \"row_values\": [\"Sarah\", 20, \"Los Angeles\", \"tennis\"]\n",
" },\n",
" {\n",
" \"row_values\": [\"Mary\", 35, \"Chicago\", \"\"]\n",
" }\n",
" ]\n",
"}\n"
]
},
{
"data": {
"text/plain": [
"DataFrameRowsOnly(rows=[DataFrameRow(row_values=['John', 25, 'New York', 'basketball']), DataFrameRow(row_values=['Mike', 30, 'San Francisco', 'baseball']), DataFrameRow(row_values=['Sarah', 20, 'Los Angeles', 'tennis']), DataFrameRow(row_values=['Mary', 35, 'Chicago', ''])])"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"program(\n",
" input_str=\"\"\"My name is John and I am 25 years old. I live in \n",
" New York and I like to play basketball. His name is \n",
" Mike and he is 30 years old. He lives in San Francisco \n",
" and he likes to play baseball. Sarah is 20 years old \n",
" and she lives in Los Angeles. She likes to play tennis.\n",
" Her name is Mary and she is 35 years old. \n",
" She lives in Chicago.\"\"\"\n",
")"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "acbcbca8-78f1-47cd-9507-81b2c78ba6fe",
"metadata": {},
"source": [
"## Use our DataFrame Programs\n",
"\n",
"We provide convenience wrappers for `DFFullProgram` and `DFRowsProgram`. This allows a simpler object creation interface than specifying all details through the `OpenAIPydanticProgram`."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e9b4c40f-5426-4b6f-9b97-b612c63f772d",
"metadata": {},
"outputs": [],
"source": [
"from llama_index.program.openai import OpenAIPydanticProgram\n",
"from llama_index.core.program import DFFullProgram, DFRowsProgram\n",
"import pandas as pd\n",
"\n",
"# initialize empty df\n",
"df = pd.DataFrame(\n",
" {\n",
" \"Name\": pd.Series(dtype=\"str\"),\n",
" \"Age\": pd.Series(dtype=\"int\"),\n",
" \"City\": pd.Series(dtype=\"str\"),\n",
" \"Favorite Sport\": pd.Series(dtype=\"str\"),\n",
" }\n",
")\n",
"\n",
"# initialize program, using existing df as schema\n",
"df_rows_program = DFRowsProgram.from_defaults(\n",
" pydantic_program_cls=OpenAIPydanticProgram, df=df\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d7eeba46-25bd-499b-a7c4-d7f475c4de21",
"metadata": {},
"outputs": [],
"source": [
"# parse text, using existing df as schema\n",
"result_obj = df_rows_program(\n",
" input_str=\"\"\"My name is John and I am 25 years old. I live in \n",
" New York and I like to play basketball. His name is \n",
" Mike and he is 30 years old. He lives in San Francisco \n",
" and he likes to play baseball. Sarah is 20 years old \n",
" and she lives in Los Angeles. She likes to play tennis.\n",
" Her name is Mary and she is 35 years old. \n",
" She lives in Chicago.\"\"\"\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "455a96c0-b4dd-46cc-a8f0-b70241733e2e",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/jerryliu/Programming/gpt_index/llama_index/program/predefined/df.py:65: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
" return existing_df.append(new_df, ignore_index=True)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Name</th>\n",
" <th>Age</th>\n",
" <th>City</th>\n",
" <th>Favorite Sport</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>John</td>\n",
" <td>25</td>\n",
" <td>New York</td>\n",
" <td>Basketball</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Mike</td>\n",
" <td>30</td>\n",
" <td>San Francisco</td>\n",
" <td>Baseball</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sarah</td>\n",
" <td>20</td>\n",
" <td>Los Angeles</td>\n",
" <td>Tennis</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Mary</td>\n",
" <td>35</td>\n",
" <td>Chicago</td>\n",
" <td></td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name Age City Favorite Sport\n",
"0 John 25 New York Basketball\n",
"1 Mike 30 San Francisco Baseball\n",
"2 Sarah 20 Los Angeles Tennis\n",
"3 Mary 35 Chicago "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result_obj.to_df(existing_df=df)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "22ff7819-51be-4e84-a537-6e5b32aa4e4d",
"metadata": {},
"outputs": [],
"source": [
"# initialize program that can do joint schema extraction and structured data extraction\n",
"df_full_program = DFFullProgram.from_defaults(\n",
" pydantic_program_cls=OpenAIPydanticProgram,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dda44cc0-a3f4-4ba8-9304-a6f511722e07",
"metadata": {},
"outputs": [],
"source": [
"result_obj = df_full_program(\n",
" input_str=\"\"\"My name is John and I am 25 years old. I live in \n",
" New York and I like to play basketball. His name is \n",
" Mike and he is 30 years old. He lives in San Francisco \n",
" and he likes to play baseball. Sarah is 20 years old \n",
" and she lives in Los Angeles. She likes to play tennis.\n",
" Her name is Mary and she is 35 years old. \n",
" She lives in Chicago.\"\"\"\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "40067e73-2a28-45f6-a5f5-c54004bef4ad",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Name</th>\n",
" <th>Age</th>\n",
" <th>Location</th>\n",
" <th>Hobby</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>John</td>\n",
" <td>25</td>\n",
" <td>New York</td>\n",
" <td>Basketball</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Mike</td>\n",
" <td>30</td>\n",
" <td>San Francisco</td>\n",
" <td>Baseball</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sarah</td>\n",
" <td>20</td>\n",
" <td>Los Angeles</td>\n",
" <td>Tennis</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Mary</td>\n",
" <td>35</td>\n",
" <td>Chicago</td>\n",
" <td></td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name Age Location Hobby\n",
"0 John 25 New York Basketball\n",
"1 Mike 30 San Francisco Baseball\n",
"2 Sarah 20 Los Angeles Tennis\n",
"3 Mary 35 Chicago "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result_obj.to_df()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e4420b92-0da4-4b1e-8f84-8936c3c81246",
"metadata": {},
"outputs": [],
"source": [
"# initialize empty df\n",
"df = pd.DataFrame(\n",
" {\n",
" \"City\": pd.Series(dtype=\"str\"),\n",
" \"State\": pd.Series(dtype=\"str\"),\n",
" \"Population\": pd.Series(dtype=\"int\"),\n",
" }\n",
")\n",
"\n",
"# initialize program, using existing df as schema\n",
"df_rows_program = DFRowsProgram.from_defaults(\n",
" pydantic_program_cls=OpenAIPydanticProgram, df=df\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7bd7c9ed-2a40-4efd-b09a-44c95bd302fd",
"metadata": {},
"outputs": [],
"source": [
"input_text = \"\"\"San Francisco is in California, has a population of 800,000. \n",
"New York City is the most populous city in the United States. \\\n",
"With a 2020 population of 8,804,190 distributed over 300.46 square miles (778.2 km2), \\\n",
"New York City is the most densely populated major city in the United States.\n",
"New York City is in New York State.\n",
"Boston (US: /ˈbɔːstən/),[8] officially the City of Boston, is the capital and largest city of the Commonwealth of Massachusetts \\\n",
"and the cultural and financial center of the New England region of the Northeastern United States. \\\n",
"The city boundaries encompass an area of about 48.4 sq mi (125 km2)[9] and a population of 675,647 as of 2020.[4]\n",
"\"\"\"\n",
"\n",
"# parse text, using existing df as schema\n",
"result_obj = df_rows_program(input_str=input_text)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "16fa5b01-e12c-4151-b554-c7de470b4255",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/jerryliu/Programming/gpt_index/llama_index/program/predefined/df.py:65: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
" return existing_df.append(new_df, ignore_index=True)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>City</th>\n",
" <th>State</th>\n",
" <th>Population</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>San Francisco</td>\n",
" <td>California</td>\n",
" <td>800000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>New York City</td>\n",
" <td>New York</td>\n",
" <td>8804190</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Boston</td>\n",
" <td>Massachusetts</td>\n",
" <td>675647</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" City State Population\n",
"0 San Francisco California 800000\n",
"1 New York City New York 8804190\n",
"2 Boston Massachusetts 675647"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"new_df = result_obj.to_df(existing_df=df)\n",
"new_df"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "llama_index_v2",
"language": "python",
"name": "llama_index_v2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}