[Python] LangChain: 'dict' object has no attribute 'replace' when using Chroma retriever

Discussão em 'Python' iniciado por Stack, Fevereiro 19, 2025.

  1. Stack

    Stack Membro Participativo

    I am working on a chatbot using LangChain, ChromaDB, and Hugging Face models. However, when I try to run my script, I get the following error:

    import os
    import dotenv
    from langchain.prompts import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
    PromptTemplate
    )
    from langchain.schema.runnable import RunnablePassthrough
    from langchain_core.output_parsers import StrOutputParser
    from langchain_chroma import Chroma
    from huggingface_hub import InferenceClient
    from langchain_huggingface import HuggingFaceEmbeddings, HuggingFaceEndpoint


    dotenv.load_dotenv()
    HUGGINGFACEHUB_API_TOKEN = os.getenv("HUGGINGFACEHUB_API_TOKEN")


    review_template_str = """You are an AI assistant for Edu Overseas.
    You ONLY answer questions related to universities, admission processes, study
    programs, visa requirements, and scholarships.
    If a question is NOT related to these topics, firmly reply:
    'I can only answer questions related to university admissions and study abroad
    processes.'

    Context:
    {context}

    Question:
    {question}
    """

    review_system_prompt = SystemMessagePromptTemplate(
    prompt=PromptTemplate(
    input_variables=["context"],
    template=review_template_str,
    )
    )
    review_human_prompt = HumanMessagePromptTemplate(
    prompt=PromptTemplate(
    input_variables=["question"],
    template="{question}",
    )
    )

    messages = [review_system_prompt, review_human_prompt]
    review_prompt_template = ChatPromptTemplate(
    input_variables=["context", "question"],
    messages=messages,
    )

    # Initializing Hugging Face embeddings
    embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-
    base-v2")

    # Load Chroma database
    reviews_vector_db = Chroma(
    persist_directory="chroma_data/", # Path to your Chroma database
    embedding_function=embeddings,
    )
    reviews_retriever = reviews_vector_db.as_retriever(k=10)
    relevant documents

    # Initializing Hugging Face Inference Client
    llm = HuggingFaceEndpoint(
    repo_id="tiiuae/falcon-7b-instruct",
    token=HUGGINGFACEHUB_API_TOKEN,
    max_new_tokens = 200
    )

    # Define the chatbot pipeline
    review_chain = (
    {
    "context": reviews_retriever | (lambda docs: "\n".join([doc.page_content for
    doc in docs])),
    "question": RunnablePassthrough()
    }
    | review_prompt_template
    | llm

    | StrOutputParser()
    )


    __all__ = ["review_chain", "reviews_vector_db"]


    This is my create_retriever.py code:

    import dotenv
    import pandas as pd
    from langchain_community.vectorstores import Chroma
    from langchain_huggingface import HuggingFaceEmbeddings
    from langchain.schema import Document


    dotenv.load_dotenv()


    CSV_PATH = "D:/BotUi/AI_LLM/data/Book1.csv"
    CHROMA_PATH = "chroma_data/"

    try:
    df = pd.read_csv(CSV_PATH)

    df.columns = df.columns.str.strip()


    required_columns = [
    "University", "Course Name", "Website URL", "Campus", "Duration",
    "Intakes", "Entry Requirements", "IELTS Score", "IELTS No Band Less Than",
    "Tuition Fee", "Remarks"
    ]
    missing_columns = [col for col in required_columns if col not in df.columns]
    if missing_columns:
    raise ValueError(f" Missing columns in CSV: {', '.join(missing_columns)}")

    print("All required columns found. Proceeding with data processing...")

    df = df.dropna(subset=["Course Name", "University"])


    documents = []
    for _, row in df.iterrows():

    content = f"""
    University: {row['University']}
    Course: {row['Course Name']}
    Website: {row.get('Website URL', 'Not available')}
    Campus: {row.get('Campus', 'Not specified')}
    Duration: {row.get('Duration', 'Not specified')}
    Intakes: {row.get('Intakes', 'Not specified')}
    Entry Requirements: {row.get('Entry Requirements', 'Not specified')}
    IELTS Score: {row.get('IELTS Score', 'Not specified')}
    Minimum IELTS Band: {row.get('IELTS No Band Less Than', 'Not specified')}
    Tuition Fee: {row.get('Tuition Fee', 'Not specified')}
    Remarks: {row.get('Remarks', 'None')}
    """

    metadata = {col: row[col] for col in df.columns}

    documents.append(Document(page_content=content, metadata=metadata))


    embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-
    base-v2")


    vector_db = Chroma.from_documents(
    documents=documents, embedding=embeddings, persist_directory=CHROMA_PATH
    )

    print(f"Successfully stored {len(documents)} course records in ChromaDB.")

    except Exception as e:
    print(f" Error: {e}")


    This is my uni.py:

    from chatbot import review_chain

    def ask_question():
    print("DEBUG: ask_question() function started!") # Debug print
    while True:
    query = input("Ask a university-related question (or type 'exit' to quit): ")
    if query.lower() == "exit":
    break
    try:
    print(f"DEBUG: Sending query -> {query}")
    response = review_chain.invoke({"question": query})
    print(f"\nDEBUG: {response}\n")
    print("\nAI Response:", response, "\n")
    except Exception as e:
    print(f" Error: {e}\n")

    if __name__ == "__main__":
    print("DEBUG: Starting uni.py script") # Debug print
    ask_question()


    What could be causing this 'dict' object has no attribute 'replace' error in LangChain?

    Is there a better approach to processing the retrieved documents before passing them to the model?

    Any help or guidance would be appreciated!

    Continue reading...

Compartilhe esta Página