File size: 4,796 Bytes
182219d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
from langchain_groq import ChatGroq
from langchain_experimental.agents import create_pandas_dataframe_agent
import pandas as pd
import json
import streamlit as st
from dotenv import load_dotenv
import os
load_dotenv()
groq_api_key = os.getenv("GROQ_API_KEY")
chat_model = ChatGroq(temperature=0, model_name="mixtral-8x7b-32768")
def csv_tool(filename : str):
df = pd.read_csv(filename)
return create_pandas_dataframe_agent(chat_model,df, verbose=True)
def ask_agent(agent, query):
"""
Query an agent and return the response as a string.
Args:
agent: The agent to query.
query: The query to ask the agent.
Returns:
The response from the agent as a string.
"""
# Prepare the prompt with query guidelines and formatting
prompt = (
"""
Let's decode the way to respond to the queries. The responses depend on the type of information requested in the query.
1. If the query requires a table, format your answer like this:
{"table": {"columns": ["column1", "column2", ...], "data": [[value1, value2, ...], [value1, value2, ...], ...]}}
2. For a bar chart, respond like this:
{"bar": {"columns": ["A", "B", "C", ...], "data": [25, 24, 10, ...]}}
3. If a line chart is more appropriate, your reply should look like this:
{"line": {"columns": ["A", "B", "C", ...], "data": [25, 24, 10, ...]}}
Note: We only accommodate two types of charts: "bar" and "line".
4. For a plain question that doesn't need a chart or table, your response should be:
{"answer": "Your answer goes here"}
For example:
{"answer": "The Product with the highest Orders is '15143Exfo'"}
5. If the answer is not known or available, respond with:
{"answer": "I do not know."}
Return all output as a string. Remember to encase all strings in the "columns" list and data list in double quotes.
For example: {"columns": ["Products", "Orders"], "data": [["51993Masc", 191], ["49631Foun", 152]]}
Now, let's tackle the query step by step. Here's the query for you to work on:
"""
+ query
)
# Run the prompt through the agent and capture the response.
response = agent.run(prompt)
# Return the response converted to a string.
return str(response)
def decode_response(response: str) -> dict:
"""This function converts the string response from the model to a dictionary object.
Args:
response (str): response from the model
Returns:
dict: dictionary with response data
"""
return json.loads(response)
def write_answer(response_dict: dict):
"""app
Write a response from an agent to a Streamlit .
Args:
response_dict: The response from the agent.
Returns:
None.
"""
# Check if the response is an answer.
if "answer" in response_dict:
st.write(response_dict["answer"])
# Check if the response is a bar chart.
# Check if the response is a bar chart.
if "bar" in response_dict:
data = response_dict["bar"]
try:
df_data = {
col: [x[i] if isinstance(x, list) else x for x in data['data']]
for i, col in enumerate(data['columns'])
}
df = pd.DataFrame(df_data)
df.set_index("Products", inplace=True)
st.bar_chart(df)
except ValueError:
print(f"Couldn't create DataFrame from data: {data}")
# Check if the response is a line chart.
if "line" in response_dict:
data = response_dict["line"]
try:
df_data = {col: [x[i] for x in data['data']] for i, col in enumerate(data['columns'])}
df = pd.DataFrame(df_data)
df.set_index("Products", inplace=True)
st.line_chart(df)
except ValueError:
print(f"Couldn't create DataFrame from data: {data}")
# Check if the response is a table.
if "table" in response_dict:
data = response_dict["table"]
df = pd.DataFrame(data["data"], columns=data["columns"])
st.table(df)
st.set_page_config(page_title="👨💻 Talk with your CSV")
st.title("👨💻 Talk with your CSV")
st.write("Please upload your CSV file below.")
data = st.file_uploader("Upload a CSV" , type="csv")
query = st.text_area("Send a Message")
if st.button("Submit Query", type="primary"):
# Create an agent from the CSV file.
agent = csv_tool(data)
# Query the agent.
response = ask_agent(agent=agent, query=query)
# Decode the response.
decoded_response = decode_response(response)
# Write the response to the Streamlit app.
write_answer(decoded_response) |