Use MongoDB Altas without required Documents (#1538)
* Working on mongodb * Working on retriever tool * Add vectorstore retriever * Fix format --------- Co-authored-by: Remco Goyvaerts <remco.goyvaerts@acagroup.be>
This commit is contained in:
parent
50c90f0879
commit
f0b93a9bd7
4 changed files with 65 additions and 15 deletions
|
|
@ -0,0 +1,17 @@
|
||||||
|
from langchain_core.vectorstores import VectorStoreRetriever
|
||||||
|
|
||||||
|
from langflow import CustomComponent
|
||||||
|
from langflow.field_typing import VectorStore
|
||||||
|
|
||||||
|
|
||||||
|
class VectoStoreRetrieverComponent(CustomComponent):
|
||||||
|
display_name = "VectorStore Retriever"
|
||||||
|
description = "A vector store retriever"
|
||||||
|
|
||||||
|
def build_config(self):
|
||||||
|
return {
|
||||||
|
"vectorstore": {"display_name": "Vector Store", "type": VectorStore},
|
||||||
|
}
|
||||||
|
|
||||||
|
def build(self, vectorstore: VectorStore) -> VectorStoreRetriever:
|
||||||
|
return vectorstore.as_retriever()
|
||||||
32
src/backend/langflow/components/tools/RetrieverTool.py
Normal file
32
src/backend/langflow/components/tools/RetrieverTool.py
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
from langchain.tools.retriever import create_retriever_tool
|
||||||
|
|
||||||
|
from langflow import CustomComponent
|
||||||
|
from langflow.field_typing import BaseRetriever, Tool
|
||||||
|
|
||||||
|
|
||||||
|
class RetrieverToolComponent(CustomComponent):
|
||||||
|
display_name = "RetrieverTool"
|
||||||
|
description = "Tool for interacting with retriever"
|
||||||
|
|
||||||
|
def build_config(self):
|
||||||
|
return {
|
||||||
|
"retriever": {
|
||||||
|
"display_name": "Retriever",
|
||||||
|
"info": "Retriever to interact with",
|
||||||
|
"type": BaseRetriever,
|
||||||
|
},
|
||||||
|
"name": {"display_name": "Name", "info": "Name of the tool"},
|
||||||
|
"description": {"display_name": "Description", "info": "Description of the tool"},
|
||||||
|
}
|
||||||
|
|
||||||
|
def build(
|
||||||
|
self,
|
||||||
|
retriever: BaseRetriever,
|
||||||
|
name: str,
|
||||||
|
description: str,
|
||||||
|
) -> Tool:
|
||||||
|
return create_retriever_tool(
|
||||||
|
retriever=retriever,
|
||||||
|
name=name,
|
||||||
|
description=description,
|
||||||
|
)
|
||||||
0
src/backend/langflow/components/tools/__init__.py
Normal file
0
src/backend/langflow/components/tools/__init__.py
Normal file
|
|
@ -1,22 +1,18 @@
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
|
||||||
from langchain_community.vectorstores import MongoDBAtlasVectorSearch
|
from langchain_community.vectorstores.mongodb_atlas import MongoDBAtlasVectorSearch
|
||||||
|
|
||||||
from langflow import CustomComponent
|
from langflow import CustomComponent
|
||||||
from langflow.field_typing import (
|
from langflow.field_typing import Document, Embeddings, NestedDict
|
||||||
Document,
|
|
||||||
Embeddings,
|
|
||||||
NestedDict,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class MongoDBAtlasComponent(CustomComponent):
|
class MongoDBAtlasComponent(CustomComponent):
|
||||||
display_name = "MongoDB Atlas"
|
display_name = "MongoDB Atlas"
|
||||||
description = "Construct a `MongoDB Atlas Vector Search` vector store from raw documents."
|
description = "a `MongoDB Atlas Vector Search` vector store from raw documents."
|
||||||
|
|
||||||
def build_config(self):
|
def build_config(self):
|
||||||
return {
|
return {
|
||||||
"documents": {"display_name": "Documents"},
|
"documents": {"display_name": "Documents", "is_list": True},
|
||||||
"embedding": {"display_name": "Embedding"},
|
"embedding": {"display_name": "Embedding"},
|
||||||
"collection_name": {"display_name": "Collection Name"},
|
"collection_name": {"display_name": "Collection Name"},
|
||||||
"db_name": {"display_name": "Database Name"},
|
"db_name": {"display_name": "Database Name"},
|
||||||
|
|
@ -27,8 +23,8 @@ class MongoDBAtlasComponent(CustomComponent):
|
||||||
|
|
||||||
def build(
|
def build(
|
||||||
self,
|
self,
|
||||||
documents: List[Document],
|
|
||||||
embedding: Embeddings,
|
embedding: Embeddings,
|
||||||
|
documents: Optional[List[Document]] = None,
|
||||||
collection_name: str = "",
|
collection_name: str = "",
|
||||||
db_name: str = "",
|
db_name: str = "",
|
||||||
index_name: str = "",
|
index_name: str = "",
|
||||||
|
|
@ -36,12 +32,17 @@ class MongoDBAtlasComponent(CustomComponent):
|
||||||
search_kwargs: Optional[NestedDict] = None,
|
search_kwargs: Optional[NestedDict] = None,
|
||||||
) -> MongoDBAtlasVectorSearch:
|
) -> MongoDBAtlasVectorSearch:
|
||||||
search_kwargs = search_kwargs or {}
|
search_kwargs = search_kwargs or {}
|
||||||
return MongoDBAtlasVectorSearch(
|
vector_store = MongoDBAtlasVectorSearch.from_connection_string(
|
||||||
documents=documents,
|
connection_string=mongodb_atlas_cluster_uri,
|
||||||
|
namespace=f"{db_name}.{collection_name}",
|
||||||
embedding=embedding,
|
embedding=embedding,
|
||||||
collection_name=collection_name,
|
|
||||||
db_name=db_name,
|
|
||||||
index_name=index_name,
|
index_name=index_name,
|
||||||
mongodb_atlas_cluster_uri=mongodb_atlas_cluster_uri,
|
|
||||||
search_kwargs=search_kwargs,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if documents is not None:
|
||||||
|
if len(documents) == 0:
|
||||||
|
raise ValueError("If documents are provided, there must be at least one document.")
|
||||||
|
|
||||||
|
vector_store.add_documents(documents)
|
||||||
|
|
||||||
|
return vector_store
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue