A primeira solução também não foi resolutiva ela segue apresentando o mesmo problema:
ModuleNotFoundError Traceback (most recent call last)
/tmp/ipython-input-3749414147.py in <cell line: 0>()
----> 1 from llama_index.core.query_pipeline import QueryPipeline as QP, Link, InputComponent
ModuleNotFoundError: No module named 'llama_index.core.query_pipeline'
E a solução de utilizar uma versão deprecated é mais uma alternativa pra seguir a aula do que aprendizagem da ferramenta em si, pois se por ventura eu vier a utiliza-la será com uma versão atual, gostaria de aprender a trabalhar com pipeline na versão atual.
Agradeço pela ajuda, mas sigo com a duvida de como trabalhar com o query pipeline na versão atual.
Consegui até fazer ele me mostrar o resultado semelhante a da professora, mas o código parece péssimo:
from llama_index.core import PromptTemplate
from llama_index.experimental.query_engine.pandas import PandasInstructionParser
def descricao_colunas(df):
descricao = '\n'.join([f"`{col}`:{str(df[col].dtype)}" for col in df.columns])
return 'Aqui estão os detalhes das colunas do DataFrame:\n' + descricao
# Instruções para orientar o modelo
instruction_str = (
"1. Converta a consulta para código Python executável usando Pandas.\n"
"2. A linha final do código deve ser uma expressão Python que possa ser chamada com a função `eval()`.\n"
"3. O código deve representar uma solução para a consulta.\n"
"4. IMPRIMA APENAS A EXPRESSÃO.\n"
"5. Não coloque a expressão entre aspas.\n")
# Prompts
pandas_prompt_str = (
"Você está trabalhando com um dataframe do pandas em Python chamado `df`.\n"
"{colunas_detalhes}\n\n"
"Este é o resultado de `print(df.head())`:\n"
"{df_str}\n\n"
"Siga estas instruções:\n"
"{instruction_str}\n"
"Consulta: {query_str}\n\n"
"Expressão:"
)
response_synthesis_prompt_str = (
"Dada uma pergunta de entrada, atue como analista de dados e elabore uma resposta a partir dos resultados da consulta.\n"
"Responda de forma natural, sem introduções como 'A resposta é:' ou algo semelhante.\n"
"Consulta: {query_str}\n\n"
"Instruções do Pandas (opcional):\n{pandas_instructions}\n\n"
"Saída do Pandas: {pandas_output}\n\n"
"Resposta:"
"Ao final, exibir o código usado para gerar a resposta, no formato: O código utilizado foi {pandas_instructions}"
)
# Componentes
pandas_prompt = PromptTemplate(pandas_prompt_str).partial_format(
instruction_str=instruction_str, colunas_detalhes=descricao_colunas(df), df_str=df.head(5)
)
pandas_output_parser = PandasInstructionParser(df)
response_synthesis_prompt = PromptTemplate(response_synthesis_prompt_str)
llm = Groq(model='llama3-70b-8192', api_key=key)
# RECRIANDO O COMPORTAMENTO DO QUERYPIPELINE ANTIGO
def run_pipeline(query_str: str, verbose: bool = True):
# Input Component
if verbose:
print("Running module input with input:")
print(f"\nquery_str: {query_str}\n")
formatted_pandas_prompt = pandas_prompt.format(query_str=query_str)
print("Running module llm1 with input:")
print(f"\nmessages: {formatted_pandas_prompt}\n")
pandas_code_response = llm.complete(formatted_pandas_prompt).text
print("Running module pandas_output_parser with input:")
print(f"\ninput: {pandas_code_response}\n")
pandas_result = pandas_output_parser.parse(pandas_code_response)
pandas_result_str = str(pandas_result)
print("Running module response_synthesis_prompt with input:")
print(f"\nquery_str: {query_str}")
print(f"pandas_instructions: {pandas_code_response}")
print(f"pandas_output: {pandas_result_str}\n")
formatted_synthesis_prompt = response_synthesis_prompt.format(
query_str=query_str,
pandas_instructions=pandas_code_response,
pandas_output=pandas_result_str
)
print("Running module llm2 with input:")
print(f"\nmessages: {formatted_synthesis_prompt}\n")
final_response = llm.complete(formatted_synthesis_prompt)
return final_response.text
# EXECUTAR EXATAMENTE COMO NO ORIGINAL
response = run_pipeline('Qual é a média gasta por cada tipo de cliente?')
print("\n" + "="*50)
print("RESPOSTA FINAL:")
print(response)