This repo is an implementation of a locally hosted chatbot specifically focused on question answering over the LangChain documentation. Built with LangChain, FastAPI, and Next.js.
Deployed version: chat.langchain.com
The app leverages LangChain's streaming support and async API to update the page in real time for multiple users.
- Install backend dependencies:
poetry install
. - Make sure to enter your environment variables to configure the application:
export OPENAI_API_KEY=
export WEAVIATE_URL=
export WEAVIATE_API_KEY=
export RECORD_MANAGER_DB_URL=
# for tracing
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_ENDPOINT="https://api.smith.langchain.com"
export LANGCHAIN_API_KEY=
export LANGCHAIN_PROJECT=
- Run
python ingest.py
to ingest LangChain docs data into the Weaviate vectorstore (only needs to be done once).- You can use other Document Loaders to load your own data into the vectorstore.
- Start the Python backend with
poetry run make start
. - Install frontend dependencies by running
cd chat-langchain
, thenyarn
. - Run the frontend with
yarn dev
for frontend. - Open localhost:3000 in your browser.
- Follow the first three steps above to ingest LangChain docs data into the vectorstore.
- Install frontend dependencies by running
cd chat-langchain
, thenyarn
. - Populate a
chat-langchain/.env.local
file with your own versions of keys from thechat-langchain/.env.example
file, and setNEXT_PUBLIC_API_BASE_URL
to"http://localhost:3000/api"
. - Run the app with
yarn dev
. - Open localhost:3000 in your browser.
There are two components: ingestion and question-answering.
Ingestion has the following steps:
- Pull html from documentation site as well as the Github Codebase
- Load html with LangChain's RecursiveURLLoader and SitemapLoader
- Split documents with LangChain's RecursiveCharacterTextSplitter
- Create a vectorstore of embeddings, using LangChain's Weaviate vectorstore wrapper (with OpenAI's embeddings).
Question-Answering has the following steps:
- Given the chat history and new user input, determine what a standalone question would be using GPT-3.5.
- Given that standalone question, look up relevant documents from the vectorstore.
- Pass the standalone question and relevant documents to the model to generate and stream the final answer.
- Generate a trace URL for the current chat session, as well as the endpoint to collect feedback.
Deploy the frontend Next.js app as a serverless Edge function on Vercel by clicking here.
You'll need to populate the NEXT_PUBLIC_API_BASE_URL
environment variable with the base URL you've deployed the backend under (no trailing slash!).