langchain: chain.run doesn't necessarily return a `str`

https://github.com/hwchase17/langchain/blob/2667ddc6867421842fe027f1946644f452de8eb3/langchain/chains/base.py#L386-L393

when I have this:

chain = create_structured_output_chain(Categorization, llm, prompt, verbose=True)
response = chain.run(trx_description)

my response object is a dict not a str, but I got misled by the type assistance making me think it was a str.

About this issue

  • Original URL
  • State: closed
  • Created a year ago
  • Comments: 16 (8 by maintainers)

Commits related to this issue

Most upvoted comments

from langchain.document_loaders.csv_loader import CSVLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain import PromptTemplate, OpenAI, LLMChain
from langchain.chat_models import ChatOpenAI
from pydantic import BaseModel, Field
from typing import Optional
from langchain.chains.openai_functions import (
    create_openai_fn_chain, create_structured_output_chain
)
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.schema import HumanMessage, SystemMessage
from langchain.vectorstores import Chroma
import os

os.environ["OPENAI_API_KEY"] = ""

embeddings = OpenAIEmbeddings()
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.5)
loader = CSVLoader(file_path="./food-flavours.csv")
food_data = loader.load()
db = Chroma.from_documents(food_data, embeddings)
retriever = db.as_retriever(search_kwargs={"k": 1})

system_message = """
You are a helpful assistant. When the user passes in a food, reply with what kind of flavour the food has.
"""

class Food(BaseModel):
    """Food."""
    flavour: str = Field(..., description="The flavour profile of the food")


# STRUCTURED OUTPUT CHAIN
prompt_msgs = [
    SystemMessage(
        content=system_message,
    ),
    HumanMessagePromptTemplate.from_template("{input}"),
]
prompt = ChatPromptTemplate(messages=prompt_msgs)
chain = create_structured_output_chain(Food, llm, prompt)

def find_related_food_flavour_from_list(food: str):
    response_json = chain.run(food)
    response_string = response_json["flavour"]
    # get the similar documents using cosine similarity
    top_flavour = retriever.get_relevant_documents(response_string)
    return top_flavour[0]

I am a bit too fresh with python I think, I will defer, though I’d normally contribute