diff --git a/templates/hybrid-search-weaviate/LICENSE b/templates/hybrid-search-weaviate/LICENSE new file mode 100644 index 00000000000..d0af411b99a --- /dev/null +++ b/templates/hybrid-search-weaviate/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 LangChain, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/templates/hybrid-search-weaviate/README.md b/templates/hybrid-search-weaviate/README.md new file mode 100644 index 00000000000..5bf7888db08 --- /dev/null +++ b/templates/hybrid-search-weaviate/README.md @@ -0,0 +1,16 @@ +# Hybrid Search Weaviate + +This template performs hybrid search using Weaviate. + +## Weaviate + +This connects to a hosted Weaviate vectorstore. + +Be sure that you have set a few env variables in `chain.py`: + +* `WEAVIATE_ENVIRONMENT` +* `WEAVIATE_API_KEY` + +## LLM + +Be sure that `OPENAI_API_KEY` is set in order to use the OpenAI models. \ No newline at end of file diff --git a/templates/hybrid-search-weaviate/hybrid_search_weaviate.ipynb b/templates/hybrid-search-weaviate/hybrid_search_weaviate.ipynb new file mode 100644 index 00000000000..11416f01b10 --- /dev/null +++ b/templates/hybrid-search-weaviate/hybrid_search_weaviate.ipynb @@ -0,0 +1,57 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "8692a430", + "metadata": {}, + "source": [ + "# Run Template\n", + "\n", + "In `server.py`, set -\n", + "```\n", + "add_routes(app, chain_ext, path=\"/rag-weaviate\")\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41db5e30", + "metadata": {}, + "outputs": [], + "source": [ + "from langserve.client import RemoteRunnable\n", + "\n", + "rag_app_weaviate = RemoteRunnable(\"http://localhost:8000/rag-weaviate\")\n", + "rag_app_weaviate.invoke(\"How does agent memory work?\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.11.6 64-bit", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + }, + "vscode": { + "interpreter": { + "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/templates/hybrid-search-weaviate/hybrid_search_weaviate/__init__.py b/templates/hybrid-search-weaviate/hybrid_search_weaviate/__init__.py new file mode 100644 index 00000000000..a1483502d64 --- /dev/null +++ b/templates/hybrid-search-weaviate/hybrid_search_weaviate/__init__.py @@ -0,0 +1,3 @@ +from rag_weaviate.chain import chain + +__all__ = ["chain"] diff --git a/templates/hybrid-search-weaviate/hybrid_search_weaviate/chain.py b/templates/hybrid-search-weaviate/hybrid_search_weaviate/chain.py new file mode 100644 index 00000000000..bd54a866039 --- /dev/null +++ b/templates/hybrid-search-weaviate/hybrid_search_weaviate/chain.py @@ -0,0 +1,68 @@ +import os + +import weaviate +from langchain.chat_models import ChatOpenAI +from langchain.prompts import ChatPromptTemplate +from langchain.retrievers.weaviate_hybrid_search import WeaviateHybridSearchRetriever +from langchain.schema.output_parser import StrOutputParser +from langchain.schema.runnable import RunnableParallel, RunnablePassthrough + +# Check env vars +if os.environ.get("WEAVIATE_API_KEY", None) is None: + raise Exception("Missing `WEAVIATE_API_KEY` environment variable.") + +if os.environ.get("WEAVIATE_ENVIRONMENT", None) is None: + raise Exception("Missing `WEAVIATE_ENVIRONMENT` environment variable.") + +if os.environ.get("WEAVIATE_URL", None) is None: + raise Exception("Missing `WEAVIATE_URL` environment variable.") + +if os.environ.get("OPENAI_API_KEY", None) is None: + raise Exception("Missing `OPENAI_API_KEY` environment variable.") + +# Initialize the retriever +WEAVIATE_INDEX_NAME = os.environ.get("WEAVIATE_INDEX", "langchain-test") +WEAVIATE_URL = os.getenv("WEAVIATE_URL") +auth_client_secret = (weaviate.AuthApiKey(api_key=os.getenv("WEAVIATE_API_KEY")),) +client = weaviate.Client( + url=WEAVIATE_URL, + additional_headers={ + "X-Openai-Api-Key": os.getenv("OPENAI_API_KEY"), + }, +) +retriever = WeaviateHybridSearchRetriever( + client=client, + index_name=WEAVIATE_INDEX_NAME, + text_key="text", + attributes=[], + create_schema_if_missing=True, +) + +# # Ingest code - you may need to run this the first time +# # Load +# loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/") +# data = loader.load() +# +# # Split +# text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0) +# all_splits = text_splitter.split_documents(data) +# +# # Add to vectorDB +# retriever.add_documents(all_splits) + + +# RAG prompt +template = """Answer the question based only on the following context: +{context} +Question: {question} +""" +prompt = ChatPromptTemplate.from_template(template) + +# RAG +model = ChatOpenAI() +chain = ( + RunnableParallel({"context": retriever, "question": RunnablePassthrough()}) + | prompt + | model + | StrOutputParser() +) diff --git a/templates/hybrid-search-weaviate/pyproject.toml b/templates/hybrid-search-weaviate/pyproject.toml new file mode 100644 index 00000000000..c3f685e600d --- /dev/null +++ b/templates/hybrid-search-weaviate/pyproject.toml @@ -0,0 +1,24 @@ +[tool.poetry] +name = "rag_weaviate" +version = "0.1.0" +description = "" +authors = ["Erika Cardenas