From 805161b70f8029b706daf4d9414213b1ee335d75 Mon Sep 17 00:00:00 2001 From: Ashank Tomar Date: Thu, 8 Feb 2024 19:07:06 -0600 Subject: [PATCH] feat(Instructor): integrate with SQLModel, provide documentation and example (#418) Co-authored-by: Jason Liu --- docs/examples/db.png | Bin 0 -> 63711 bytes docs/examples/index.md | 2 ++ docs/examples/sqlmodel.md | 65 ++++++++++++++++++++++++++++++++++++++ examples/sqlmodel/run.py | 39 +++++++++++++++++++++++ mkdocs.yml | 3 +- 5 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 docs/examples/db.png create mode 100644 docs/examples/sqlmodel.md create mode 100644 examples/sqlmodel/run.py diff --git a/docs/examples/db.png b/docs/examples/db.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bb75ea974597cb0e2ab6dda43a7ee8c58ec88e GIT binary patch literal 63711 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 YnDfDq;GxON1@NP)sHspUXZGU%0OO2%VE_OC literal 0 HcmV?d00001 diff --git a/docs/examples/index.md b/docs/examples/index.md index a2f4ad6..d324c97 100644 --- a/docs/examples/index.md +++ b/docs/examples/index.md @@ -15,5 +15,7 @@ 11. [How to enable OpenAI's moderation](moderation.md) 12. [How to extract tables using GPT-Vision?](extracting_tables.md) 13. [How to generate advertising copy from image inputs](image_to_ad_copy.md) +14. [How to use local models from Ollama](ollama.md) +15. [How to store responses in a database with SQLModel](sqlmodel.md) Explore more! diff --git a/docs/examples/sqlmodel.md b/docs/examples/sqlmodel.md new file mode 100644 index 0000000..c45c6cb --- /dev/null +++ b/docs/examples/sqlmodel.md @@ -0,0 +1,65 @@ +# Integrating Instructor with SQLModel + +[SQLModel](https://sqlmodel.tiangolo.com/) is a library designed for interacting with SQL databases from Python code using Python objects. `SQLModel` is based on `Pydantic` and `SQLAlchemy` and was created by [tiangolo](https://twitter.com/tiangolo) who also developed `FastAPI`. So you can expect seamless integration across all these libraries, reducing code duplicating and improving your developer experience. + +# Example: Adding responses from Instructor directly to your DB + +## Defining the Models + +First we'll define a model that will serve as a table for our database and the structure of our outputs from `Instructor` + +!!! tips "Model Definition" + + You'll need to subclass your models with both `SQLModel` and `instructor.OpenAISchema` for them to work with SQLModel + +```python +import instructor +from openai import OpenAI +from typing import Optional +from sqlmodel import Field, SQLModel, create_engine + + +class Hero(SQLModel, instructor.OpenAISchema, table=True): + id: Optional[int] = Field(default=None, primary_key=True) + name: str + secret_name: str + age: Optional[int] = None +``` + +## Generating a record + +The `create_hero` function will query `OpenAI` for a `Hero` record + +```python +client = instructor.patch(OpenAI()) + +def create_hero() -> Hero: + return client.chat.completions.create( + model="gpt-3.5-turbo", + response_model=Hero, + messages=[ + {"role": "user", "content": "Make a new superhero"}, + ], + ) +``` + +## Inserting the response into the DB + +```python +engine = create_engine("sqlite:///database.db") +SQLModel.metadata.create_all(engine) + +hero = create_hero() +print(hero.model_dump()) + """ + {'name': 'SuperNova', 'secret_name': 'Mia Thompson', 'age': 28, 'id': None} + """ + +with Session(engine) as session: + session.add(hero) + session.commit() +``` + +![Image of hero record in the database](db.png) + +And there you have it! You can now use the same models for your database and `Instructor` enabling them work seamlessly! Also checkout the [FastAPI](../concepts/fastapi.md) guide to see how you can use these models in an API as well. \ No newline at end of file diff --git a/examples/sqlmodel/run.py b/examples/sqlmodel/run.py new file mode 100644 index 0000000..44cac58 --- /dev/null +++ b/examples/sqlmodel/run.py @@ -0,0 +1,39 @@ +import instructor +from openai import OpenAI +from typing import Optional +from sqlmodel import Field, SQLModel, create_engine, Session + + +# Define the model that will serve as a Table for the database +class Hero(SQLModel, instructor.OpenAISchema, table=True): + id: Optional[int] = Field(default=None, primary_key=True) + name: str + secret_name: str + age: Optional[int] = None + + +# Function to query OpenAI for a Hero record +client = instructor.patch(OpenAI()) + + +def create_hero() -> Hero: + return client.chat.completions.create( + model="gpt-3.5-turbo", + response_model=Hero, + messages=[ + {"role": "user", "content": "Make a new superhero"}, + ], + ) + + +# Insert the response into the database +engine = create_engine("sqlite:///database.db") +SQLModel.metadata.create_all(engine) + +hero = create_hero() +print(hero.model_dump()) + + +with Session(engine) as session: + session.add(hero) + session.commit() diff --git a/mkdocs.yml b/mkdocs.yml index 822c2a6..ebcc4f0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -165,7 +165,8 @@ nav: - PII Data Sanitization: 'examples/pii.md' - Enabling Open Source Models: 'examples/open_source.md' - Image to Ad Copy: 'examples/image_to_ad_copy.md' - - Ollama + LiteLLM: 'examples/ollama.md' + - Ollama: 'examples/ollama.md' + - SQLModel Integration: 'examples/sqlmodel.md' - CLI Reference: - "CLI Reference": "cli/index.md" - "Finetuning GPT-3.5": "cli/finetune.md"