Spaces:
Runtime error
Runtime error
| # flake8: noqa | |
| from langchain_core.prompts import PromptTemplate | |
| SONG_DATA_SOURCE = """\ | |
| ```json | |
| {{ | |
| "content": "Lyrics of a song", | |
| "attributes": {{ | |
| "artist": {{ | |
| "type": "string", | |
| "description": "Name of the song artist" | |
| }}, | |
| "length": {{ | |
| "type": "integer", | |
| "description": "Length of the song in seconds" | |
| }}, | |
| "genre": {{ | |
| "type": "string", | |
| "description": "The song genre, one of \"pop\", \"rock\" or \"rap\"" | |
| }} | |
| }} | |
| }} | |
| ```\ | |
| """ | |
| FULL_ANSWER = """\ | |
| ```json | |
| {{ | |
| "query": "teenager love", | |
| "filter": "and(or(eq(\\"artist\\", \\"Taylor Swift\\"), eq(\\"artist\\", \\"Katy Perry\\")), lt(\\"length\\", 180), eq(\\"genre\\", \\"pop\\"))" | |
| }} | |
| ```\ | |
| """ | |
| NO_FILTER_ANSWER = """\ | |
| ```json | |
| {{ | |
| "query": "", | |
| "filter": "NO_FILTER" | |
| }} | |
| ```\ | |
| """ | |
| WITH_LIMIT_ANSWER = """\ | |
| ```json | |
| {{ | |
| "query": "love", | |
| "filter": "NO_FILTER", | |
| "limit": 2 | |
| }} | |
| ```\ | |
| """ | |
| DEFAULT_EXAMPLES = [ | |
| { | |
| "i": 1, | |
| "data_source": SONG_DATA_SOURCE, | |
| "user_query": "What are songs by Taylor Swift or Katy Perry about teenage romance under 3 minutes long in the dance pop genre", | |
| "structured_request": FULL_ANSWER, | |
| }, | |
| { | |
| "i": 2, | |
| "data_source": SONG_DATA_SOURCE, | |
| "user_query": "What are songs that were not published on Spotify", | |
| "structured_request": NO_FILTER_ANSWER, | |
| }, | |
| ] | |
| EXAMPLES_WITH_LIMIT = [ | |
| { | |
| "i": 1, | |
| "data_source": SONG_DATA_SOURCE, | |
| "user_query": "What are songs by Taylor Swift or Katy Perry about teenage romance under 3 minutes long in the dance pop genre", | |
| "structured_request": FULL_ANSWER, | |
| }, | |
| { | |
| "i": 2, | |
| "data_source": SONG_DATA_SOURCE, | |
| "user_query": "What are songs that were not published on Spotify", | |
| "structured_request": NO_FILTER_ANSWER, | |
| }, | |
| { | |
| "i": 3, | |
| "data_source": SONG_DATA_SOURCE, | |
| "user_query": "What are three songs about love", | |
| "structured_request": WITH_LIMIT_ANSWER, | |
| }, | |
| ] | |
| EXAMPLE_PROMPT_TEMPLATE = """\ | |
| << Example {i}. >> | |
| Data Source: | |
| {data_source} | |
| User Query: | |
| {user_query} | |
| Structured Request: | |
| {structured_request} | |
| """ | |
| EXAMPLE_PROMPT = PromptTemplate.from_template(EXAMPLE_PROMPT_TEMPLATE) | |
| USER_SPECIFIED_EXAMPLE_PROMPT = PromptTemplate.from_template( | |
| """\ | |
| << Example {i}. >> | |
| User Query: | |
| {user_query} | |
| Structured Request: | |
| ```json | |
| {structured_request} | |
| ``` | |
| """ | |
| ) | |
| DEFAULT_SCHEMA = """\ | |
| << Structured Request Schema >> | |
| When responding use a markdown code snippet with a JSON object formatted in the following schema: | |
| ```json | |
| {{{{ | |
| "query": string \\ text string to compare to document contents | |
| "filter": string \\ logical condition statement for filtering documents | |
| }}}} | |
| ``` | |
| The query string should contain only text that is expected to match the contents of documents. Any conditions in the filter should not be mentioned in the query as well. | |
| A logical condition statement is composed of one or more comparison and logical operation statements. | |
| A comparison statement takes the form: `comp(attr, val)`: | |
| - `comp` ({allowed_comparators}): comparator | |
| - `attr` (string): name of attribute to apply the comparison to | |
| - `val` (string): is the comparison value | |
| A logical operation statement takes the form `op(statement1, statement2, ...)`: | |
| - `op` ({allowed_operators}): logical operator | |
| - `statement1`, `statement2`, ... (comparison statements or logical operation statements): one or more statements to apply the operation to | |
| Make sure that you only use the comparators and logical operators listed above and no others. | |
| Make sure that filters only refer to attributes that exist in the data source. | |
| Make sure that filters only use the attributed names with its function names if there are functions applied on them. | |
| Make sure that filters only use format `YYYY-MM-DD` when handling date data typed values. | |
| Make sure that filters take into account the descriptions of attributes and only make comparisons that are feasible given the type of data being stored. | |
| Make sure that filters are only used as needed. If there are no filters that should be applied return "NO_FILTER" for the filter value.\ | |
| """ | |
| DEFAULT_SCHEMA_PROMPT = PromptTemplate.from_template(DEFAULT_SCHEMA) | |
| SCHEMA_WITH_LIMIT = """\ | |
| << Structured Request Schema >> | |
| When responding use a markdown code snippet with a JSON object formatted in the following schema: | |
| ```json | |
| {{{{ | |
| "query": string \\ text string to compare to document contents | |
| "filter": string \\ logical condition statement for filtering documents | |
| "limit": int \\ the number of documents to retrieve | |
| }}}} | |
| ``` | |
| The query string should contain only text that is expected to match the contents of documents. Any conditions in the filter should not be mentioned in the query as well. | |
| A logical condition statement is composed of one or more comparison and logical operation statements. | |
| A comparison statement takes the form: `comp(attr, val)`: | |
| - `comp` ({allowed_comparators}): comparator | |
| - `attr` (string): name of attribute to apply the comparison to | |
| - `val` (string): is the comparison value | |
| A logical operation statement takes the form `op(statement1, statement2, ...)`: | |
| - `op` ({allowed_operators}): logical operator | |
| - `statement1`, `statement2`, ... (comparison statements or logical operation statements): one or more statements to apply the operation to | |
| Make sure that you only use the comparators and logical operators listed above and no others. | |
| Make sure that filters only refer to attributes that exist in the data source. | |
| Make sure that filters only use the attributed names with its function names if there are functions applied on them. | |
| Make sure that filters only use format `YYYY-MM-DD` when handling date data typed values. | |
| Make sure that filters take into account the descriptions of attributes and only make comparisons that are feasible given the type of data being stored. | |
| Make sure that filters are only used as needed. If there are no filters that should be applied return "NO_FILTER" for the filter value. | |
| Make sure the `limit` is always an int value. It is an optional parameter so leave it blank if it does not make sense. | |
| """ | |
| SCHEMA_WITH_LIMIT_PROMPT = PromptTemplate.from_template(SCHEMA_WITH_LIMIT) | |
| DEFAULT_PREFIX = """\ | |
| Your goal is to structure the user's query to match the request schema provided below. | |
| {schema}\ | |
| """ | |
| PREFIX_WITH_DATA_SOURCE = ( | |
| DEFAULT_PREFIX | |
| + """ | |
| << Data Source >> | |
| ```json | |
| {{{{ | |
| "content": "{content}", | |
| "attributes": {attributes} | |
| }}}} | |
| ``` | |
| """ | |
| ) | |
| DEFAULT_SUFFIX = """\ | |
| << Example {i}. >> | |
| Data Source: | |
| ```json | |
| {{{{ | |
| "content": "{content}", | |
| "attributes": {attributes} | |
| }}}} | |
| ``` | |
| User Query: | |
| {{query}} | |
| Structured Request: | |
| """ | |
| SUFFIX_WITHOUT_DATA_SOURCE = """\ | |
| << Example {i}. >> | |
| User Query: | |
| {{query}} | |
| Structured Request: | |
| """ | |