DOC: No example of usage implementation is provided for the langchain.chains.query_constructor.base.load_query_constructor_runnable function
moneebullah25 opened this issue · comments
Checklist
- I added a very descriptive title to this issue.
- I included a link to the documentation page I am referring to (if applicable).
Issue with current documentation:
Description:
Currently, the load_query_constructor_runnable function documentation lacks doesn't have usage examples or scenarios, making it challenging for developers to understand.
URL to the documentation: https://api.python.langchain.com/en/latest/chains/langchain.chains.query_constructor.base.load_query_constructor_runnable.html#langchain.chains.query_constructor.base.load_query_constructor_runnable
Idea or request for content:
I tried running the function and below is the complete code and output:
from langchain.chains.query_constructor.base import load_query_constructor_runnable
from langchain.chains.query_constructor.schema import AttributeInfo
from langchain_openai import ChatOpenAI
from langchain.chains.query_constructor.ir import (
Comparator,
Comparison,
Operation,
Operator,
StructuredQuery,
)
# Define your document contents and attribute information
document_contents = """
product_name: Widget, price: $20
product_name: Gadget, price: $35
product_name: Gizmo, price: $50
"""
attribute_info: AttributeInfo = [
{"name": "product_name", "type": "string"},
{"name": "price", "type": "number"},
]
model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.5)
# Create a runnable for constructing queries
runnable = load_query_constructor_runnable(
llm=model,
document_contents=document_contents,
attribute_info=attribute_info,
allowed_comparators=[Comparator.EQ, Comparator.LT, Comparator.GT],
allowed_operators=[Operator.AND, Operator.NOT, Operator.OR],
enable_limit=True,
schema_prompt="Describe the query schema using allowed comparators and operators.",
fix_invalid=True,
)
# Now you can use the runnable to construct queries based on user input
user_input = "Show me products with price less than 30"
query = runnable.middle[0].invoke(user_input).content
print(f"Constructed query: {query}")
Output:
Constructed query: 1. Wireless Bluetooth Earbuds - $29.99
2. Portable Phone Charger - $24.99
3. Travel Makeup Bag - $19.99
4. Insulated Water Bottle - $15.99
5. LED Desk Lamp - $27.99
6. Resistance Bands Set - $12.99
7. Stainless Steel Mixing Bowls - $19.99
8. Yoga Mat - $24.99
9. Essential Oil Diffuser - $28.99
10. Electric Handheld Milk Frother - $14.99
However the output is wrong and is not providing the references to the original documents provided. Needed usage implementation.
run you code, and client will send prompt as following:
Your goal is to structure the user\'s query to match the request schema provided below.
Describe the query schema using allowed comparators and operators.
<< Example 1. >>
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""
}
}
}
'''
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:
'''json
{
"query": "teenager love",
"filter": "and(or(eq(\\"artist\\", \\"Taylor Swift\\"), eq(\\"artist\\", \\"Katy Perry\\")), lt(\\"length\\", 180), eq(\\"genre\\", \\"pop\\"))"
}
'''
<< Example 2. >>
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""
}
}
}
'''
User Query:
What are songs that were not published on Spotify
Structured Request:
'''json
{
"query": "",
"filter": "NO_FILTER"
}
'''
<< Example 3. >>
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""
}
}
}
'''
User Query:
What are three songs about love
Structured Request:
'''json
{
"query": "love",
"filter": "NO_FILTER",
"limit": 2
}
'''
<< Example 4. >>
Data Source:
'''json
{
"content": "Hardware Products Price List",
"attributes": {
"product_name": {
"type": "string"
},
"price": {
"type": "number"
}
}
}
'''
User Query:
Show me products with price less than 30
Structured Request:
so I change the document_contents content, and get the correct answer.
# Define your document contents and attribute information
document_contents = "Hardware Products Price List"
attribute_info: AttributeInfo = [
{"name": "product_name", "type": "string"},
{"name": "price", "type": "number"},
]
# Create a runnable for constructing queries
runnable = load_query_constructor_runnable(
llm=llm,
document_contents=document_contents,
attribute_info=attribute_info,
allowed_comparators=[Comparator.EQ, Comparator.LT, Comparator.GT],
allowed_operators=[Operator.AND, Operator.NOT, Operator.OR],
enable_limit=True,
schema_prompt="Describe the query schema using allowed comparators and operators.",
fix_invalid=True,
)
# Now you can use the runnable to construct queries based on user input
user_input = "What are products that price less than 30"
query = runnable.invoke(user_input)
print(f"Constructed query: {query}")
you can try, query will been one StructuredQuery object.