You can use Honcho to manage user context around LLM frameworks like LangChain. First, import the appropriate packages:
from honcho import Honcho
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
from langchain_core.messages import AIMessage, HumanMessage
from dotenv import load_dotenv
load_dotenv()
Next let’s instantiate our Honcho client:
honcho = Honcho(environment="demo")
app_name = "LangChain App"
app = honcho.apps.get_or_create(name=app_name)
user_name = str(uuid4())
user = honcho.apps.users.get_or_create(app_id=app.id, name=user_name)
Then we can define our chain using the LangChain Expression Language (LCEL):
prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant."),
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}")
])
model = ChatOpenAI(model="gpt-3.5-turbo")
output_parser = StrOutputParser()
chain = prompt | model | output_parser
Honcho returns lists of Message
objects when queried using a built-in method like get_messages()
, so a quick utility function is needed to change the list format to message objects LangChain expects:
def messages_to_langchain(messages: List):
new_messages = []
for message in messages:
if message.is_user:
new_messages.append(HumanMessage(content=message.content))
else:
new_messages.append(AIMessage(content=message.content))
return new_messages
This method is importable with the following statement
from honcho.lib.ext.langchain import messages_to_langchain
Now we can structure Honcho calls around our LLM inference:
sessions = [
session for session in
honcho.apps.users.sessions.list(
app_id=app.id,
user_id=user.id,
location_id=location_id
)
]
session = sessions[0]
history = [
message for message in
honcho.apps.users.sessions.messages.list(
app_id=app.id,
user_id=user.id,
session_id=session.id
)
]
chat_history = messages_to_langchain(history)
inp = "Here's a user message!"
honcho.apps.users.sessions.messages.create(app_id=app.id, user_id=user.id, is_user=True, content=inp)
response = await chain.ainvoke({"chat_history": chat_history, "input": inp})
honcho.apps.users.sessions.messages.create(app_id=app.id, user_id=user.id, is_user=False, content=response)
Here we query messages from a user’s session using Honcho and construct a chat history object to send to the LLM alongside our immediate user input. Once the LLM has responded, we can add that to Honcho!