Skip to content

Commit c46c713

Browse files
committed
feat: added files, readme in markdown format, images, pdfs, src/ code and langflow components and flows. author: Paul Parkinson
1 parent 106789a commit c46c713

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+8281
-0
lines changed

langflow-agentic-ai-oracle-mcp-vector-nl2sql/README.md

Lines changed: 359 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
"""
2+
Oracle Database Local Embeddings Component
3+
4+
This component provides local SentenceTransformer embeddings optimized for Oracle Database
5+
vector storage, ensuring consistent embedding dimensions and models.
6+
7+
Author: Paul Parkinson
8+
"""
9+
10+
from langchain_huggingface import HuggingFaceEmbeddings
11+
from langflow.base.models.model import LCModelComponent
12+
from langflow.io import DropdownInput, IntInput, BoolInput, Output
13+
from langflow.field_typing import Embeddings
14+
15+
16+
class OracleDatabaseEmbeddingsComponent(LCModelComponent):
17+
"""
18+
Local SentenceTransformer embeddings optimized for Oracle Database vector storage
19+
"""
20+
21+
display_name = "Oracle Database Local Embeddings"
22+
description = "Local SentenceTransformer embeddings for Oracle 23ai (384 dimensions, no cloud dependencies)"
23+
24+
inputs = [
25+
DropdownInput(
26+
name="model_name",
27+
display_name="Embedding Model",
28+
info="Choose the SentenceTransformer model for embeddings",
29+
options=[
30+
"sentence-transformers/all-MiniLM-L12-v2",
31+
"sentence-transformers/all-MiniLM-L6-v2",
32+
"sentence-transformers/all-mpnet-base-v2",
33+
"sentence-transformers/paraphrase-MiniLM-L6-v2",
34+
"sentence-transformers/distiluse-base-multilingual-cased",
35+
],
36+
value="sentence-transformers/all-MiniLM-L12-v2",
37+
),
38+
IntInput(
39+
name="max_length",
40+
display_name="Max Sequence Length",
41+
info="Maximum length of input sequences",
42+
value=512,
43+
advanced=True,
44+
),
45+
BoolInput(
46+
name="normalize_embeddings",
47+
display_name="Normalize Embeddings",
48+
info="Whether to normalize embeddings to unit length",
49+
value=True,
50+
advanced=True,
51+
),
52+
BoolInput(
53+
name="show_progress",
54+
display_name="Show Progress",
55+
info="Whether to show download progress for models",
56+
value=False,
57+
advanced=True,
58+
),
59+
]
60+
61+
outputs = [
62+
Output(display_name="Embeddings", name="embeddings", method="build_embeddings"),
63+
]
64+
65+
def build_embeddings(self) -> Embeddings:
66+
"""
67+
Build the HuggingFace embeddings model
68+
"""
69+
try:
70+
# Configure model kwargs
71+
model_kwargs = {
72+
'device': 'cpu', # Use CPU for local deployment
73+
}
74+
75+
# Configure encode kwargs - remove show_progress_bar to avoid conflicts
76+
encode_kwargs = {
77+
'normalize_embeddings': self.normalize_embeddings,
78+
}
79+
80+
embeddings = HuggingFaceEmbeddings(
81+
model_name=self.model_name,
82+
model_kwargs=model_kwargs,
83+
encode_kwargs=encode_kwargs,
84+
show_progress=self.show_progress, # Use show_progress instead
85+
)
86+
87+
self.status = f"✅ Local embeddings loaded: {self.model_name}"
88+
return embeddings
89+
90+
except Exception as e:
91+
error_msg = f"Failed to load embeddings model: {str(e)}"
92+
self.status = f"❌ {error_msg}"
93+
raise RuntimeError(error_msg)
94+
95+
def get_model_info(self) -> dict:
96+
"""
97+
Get information about the selected model
98+
"""
99+
model_info = {
100+
"sentence-transformers/all-MiniLM-L12-v2": {
101+
"dimensions": 384,
102+
"description": "Fast and efficient, great for general purpose (recommended for Oracle DB)",
103+
"size": "133MB"
104+
},
105+
"sentence-transformers/all-MiniLM-L6-v2": {
106+
"dimensions": 384,
107+
"description": "Smaller and faster version",
108+
"size": "91MB"
109+
},
110+
"sentence-transformers/all-mpnet-base-v2": {
111+
"dimensions": 768,
112+
"description": "Higher quality but larger",
113+
"size": "438MB"
114+
},
115+
"sentence-transformers/paraphrase-MiniLM-L6-v2": {
116+
"dimensions": 384,
117+
"description": "Optimized for paraphrase detection",
118+
"size": "91MB"
119+
},
120+
"sentence-transformers/distiluse-base-multilingual-cased": {
121+
"dimensions": 512,
122+
"description": "Multilingual support",
123+
"size": "540MB"
124+
}
125+
}
126+
return model_info.get(self.model_name, {"dimensions": "Unknown"})
127+
128+
def validate_for_oracle_db(self) -> bool:
129+
"""
130+
Validate that the model is suitable for Oracle Database vector storage
131+
"""
132+
model_info = self.get_model_info()
133+
134+
# Oracle 23ai works best with these dimensions
135+
recommended_dims = [384, 512, 768]
136+
model_dims = model_info.get("dimensions", 0)
137+
138+
if model_dims not in recommended_dims:
139+
self.status = f"⚠️ Warning: {model_dims} dimensions may not be optimal for Oracle DB"
140+
return False
141+
142+
self.status = f"✅ Model validated: {model_dims} dimensions, Oracle DB compatible"
143+
return True
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
# Oracle Database Vector Store (Langflow Custom Component)
3+
4+
This custom component wraps `OracleVS` (Oracle 23ai Vector Store) and exposes *configurable retrieval* knobs inside Langflow.
5+
6+
## Features
7+
- Local embeddings handle (connect any Embeddings node)
8+
- Choose distance: COSINE / EUCLIDEAN / DOT_PRODUCT
9+
- Search types:
10+
- `similarity` (top-k)
11+
- `mmr` (diversity via MMR)
12+
- `similarity_score_threshold` (filter by min score; `k` becomes a cap)
13+
- Tunables: `number_of_results (k)`, `fetch_k`, `mmr_lambda`, `score_threshold`
14+
15+
## Installation
16+
1. Save `oracledb_vectorstore.py` into your Langflow custom components folder, e.g.:
17+
- macOS/Linux: `~/.langflow/components/`
18+
- Windows: `%USERPROFILE%\\.langflow\\components\\`
19+
2. Restart Langflow. The component appears as **Oracle Database Vector Store**.
20+
21+
## Inputs
22+
- **Database User / Password / DSN / Wallet Dir / Wallet Password**
23+
- **Table Name**: e.g., `PDFCOLLECTION`
24+
- **Embedding Model**: connect a local `Embeddings` node
25+
- **Search Query**
26+
- **Number of Results (k)**
27+
- **Search Type**
28+
- **Score Threshold** (only used for threshold mode)
29+
- **Fetch K**
30+
- **MMR Lambda**
31+
- **Distance Strategy**
32+
33+
## Notes
34+
- Ensure your vector column dimensions match the embedding model dimension.
35+
- If using threshold mode, set a reasonable `score_threshold` (e.g., 0.3–0.4).
36+
- Set `fetch_k > k` for better MMR/threshold results.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"""
2+
Local SentenceTransformer Embedding Component for Langflow
3+
Uses the same embedding model as the investment advisor: all-MiniLM-L12-v2
4+
"""
5+
6+
from langflow.custom import Component
7+
from langflow.io import Output
8+
from langflow.schema import Data
9+
from langchain_community.embeddings import SentenceTransformerEmbeddings
10+
from typing import List
11+
class LocalSentenceTransformerComponent(Component):
12+
display_name = "Local SentenceTransformer Embeddings"
13+
description = "Local SentenceTransformer embeddings using all-MiniLM-L12-v2 (same as investment advisor)"
14+
documentation = "Uses the same embedding model that created your PDF vectors"
15+
icon = "🔗"
16+
name = "LocalSentenceTransformerComponent"
17+
inputs = []
18+
outputs = [
19+
Output(display_name="Embeddings", name="embeddings", method="build_embeddings"),
20+
]
21+
def build_embeddings(self) -> Data:
22+
"""Build local SentenceTransformer embeddings component"""
23+
try:
24+
# Use the same model as your investment advisor
25+
embeddings = SentenceTransformerEmbeddings(
26+
model_name="all-MiniLM-L12-v2",
27+
# Cache directory to avoid re-downloading
28+
cache_folder="./.cache/sentence_transformers"
29+
)
30+
31+
# Test the embeddings to make sure they work
32+
test_embedding = embeddings.embed_query("test")
33+
print(f"✅ Local embeddings working! Dimension: {len(test_embedding)}")
34+
35+
self.status = f"✅ Local SentenceTransformer ready (dim: {len(test_embedding)})"
36+
37+
return Data(
38+
value=embeddings,
39+
data={
40+
"model_name": "all-MiniLM-L12-v2",
41+
"embedding_dimension": len(test_embedding),
42+
"type": "local_sentence_transformer"
43+
}
44+
)
45+
46+
except Exception as e:
47+
error_msg = f"❌ Failed to load local embeddings: {str(e)}"
48+
print(error_msg)
49+
self.status = error_msg
50+
raise RuntimeError(error_msg)

0 commit comments

Comments
 (0)