Skip to content

Commit d91eaa7

Browse files
committed
wip
1 parent 057bad4 commit d91eaa7

File tree

3 files changed

+176
-0
lines changed

3 files changed

+176
-0
lines changed

.env.template

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,17 @@ SQL_DATABASE_URI=""
6969
# SQL_DATABASE_URI="sqlite:///template_langgraph.db" # SQLite
7070
# SQL_DATABASE_URI="postgresql://user:password@localhost:5432/db" # PostgreSQL
7171

72+
# PostgreSQL Settings
73+
POSTGRESQL_USER="user"
74+
POSTGRESQL_PASSWORD="password"
75+
POSTGRESQL_HOST="localhost"
76+
POSTGRESQL_PORT="5432"
77+
POSTGRESQL_DATABASE="db"
78+
POSTGRESQL_TABLE_NAME="reports_kabuto_vectors"
79+
POSTGRESQL_ID_COLUMN="id"
80+
POSTGRESQL_CONTENT_COLUMN="user_message"
81+
POSTGRESQL_EMBEDDING_COLUMN="embedding"
82+
7283
# Azure AI Search Settings
7384
AI_SEARCH_ENDPOINT="https://xxx.search.windows.net/"
7485
AI_SEARCH_KEY="xxx"

scripts/postgresql_operator.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import logging
2+
3+
import typer
4+
from dotenv import load_dotenv
5+
6+
from template_langgraph.internals.csv_loaders import CsvLoaderWrapper
7+
from template_langgraph.internals.pdf_loaders import PdfLoaderWrapper
8+
from template_langgraph.loggers import get_logger
9+
from template_langgraph.tools.postgresql_tool import PostgreSQLClientWrapper
10+
11+
# Initialize the Typer application
12+
app = typer.Typer(
13+
add_completion=False,
14+
help="PostgreSQL operator CLI",
15+
)
16+
17+
# Set up logging
18+
logger = get_logger(__name__)
19+
20+
21+
@app.command()
22+
def add_documents(
23+
verbose: bool = typer.Option(
24+
False,
25+
"--verbose",
26+
"-v",
27+
help="Enable verbose output",
28+
),
29+
):
30+
# Set up logging
31+
if verbose:
32+
logger.setLevel(logging.DEBUG)
33+
34+
# Load documents from PDF files
35+
pdf_documents = PdfLoaderWrapper().load_pdf_docs()
36+
logger.info(f"Loaded {len(pdf_documents)} documents from PDF.")
37+
38+
# Load documents from CSV files
39+
csv_documents = CsvLoaderWrapper().load_csv_docs()
40+
logger.info(f"Loaded {len(csv_documents)} documents from CSV.")
41+
42+
# Combine all documents
43+
documents = pdf_documents + csv_documents
44+
logger.info(f"Total documents to add: {len(documents)}")
45+
46+
# Add documents to PostgreSQL
47+
postgresql_client = PostgreSQLClientWrapper()
48+
ids = postgresql_client.add_documents(
49+
documents=documents,
50+
)
51+
logger.info(f"Added {len(ids)} documents to PostgreSQL.")
52+
for id in ids:
53+
logger.debug(f"Added document ID: {id}")
54+
55+
# FIXME: deleting documents() is not working as expected
56+
# assert postgresql_client.delete_documents(ids=ids), "Failed to delete documents from PostgreSQL"
57+
58+
59+
@app.command()
60+
def similarity_search(
61+
query: str = typer.Option(
62+
"禅モード",
63+
"--query",
64+
"-q",
65+
help="Query to search in the Cosmos DB index",
66+
),
67+
k: int = typer.Option(
68+
5,
69+
"--k",
70+
"-k",
71+
help="Number of results to return from the similarity search",
72+
),
73+
verbose: bool = typer.Option(
74+
False,
75+
"--verbose",
76+
"-v",
77+
help="Enable verbose output",
78+
),
79+
):
80+
# Set up logging
81+
if verbose:
82+
logger.setLevel(logging.DEBUG)
83+
84+
logger.info(f"Searching Cosmos DB with query: {query}")
85+
86+
# Perform similarity search
87+
postgresql_client = PostgreSQLClientWrapper()
88+
documents = postgresql_client.similarity_search(
89+
query=query,
90+
k=k, # Number of results to return
91+
)
92+
logger.info(f"Found {len(documents)} results for query: {query}")
93+
94+
# Log the results
95+
for i, document in enumerate(documents, start=1):
96+
logger.debug("-" * 40)
97+
logger.debug(f"#{i}: {document.model_dump_json(indent=2)}")
98+
99+
100+
if __name__ == "__main__":
101+
load_dotenv(
102+
override=True,
103+
verbose=True,
104+
)
105+
app()
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from functools import lru_cache
2+
3+
from langchain_core.documents import Document
4+
from langchain_postgres import PGEngine, PGVectorStore
5+
from pydantic_settings import BaseSettings, SettingsConfigDict
6+
7+
from template_langgraph.llms.azure_openais import AzureOpenAiWrapper
8+
9+
10+
class Settings(BaseSettings):
11+
postgresql_user: str = "user"
12+
postgresql_password: str = "password"
13+
postgresql_host: str = "localhost"
14+
postgresql_port: str = "5432"
15+
postgresql_database: str = "db"
16+
postgresql_table_name: str = "reports_kabuto_vectors"
17+
postgresql_id_column: str = "id"
18+
postgresql_content_column: str = "user_message"
19+
postgresql_embedding_column: str = "embedding"
20+
21+
model_config = SettingsConfigDict(
22+
env_file=".env",
23+
env_ignore_empty=True,
24+
extra="ignore",
25+
)
26+
27+
28+
@lru_cache
29+
def get_postgresql_settings() -> Settings:
30+
"""Get PostgreSQL Database settings."""
31+
return Settings()
32+
33+
34+
class PostgreSQLClientWrapper:
35+
def __init__(
36+
self,
37+
settings: Settings = None,
38+
):
39+
if settings is None:
40+
settings = get_postgresql_settings()
41+
42+
self.vector_store = PGVectorStore.create_sync(
43+
engine=PGEngine.from_connection_string(
44+
url=f"postgresql+psycopg://{settings.postgresql_user}:{settings.postgresql_password}@{settings.postgresql_host}:{settings.postgresql_port}/{settings.postgresql_database}"
45+
),
46+
table_name=settings.postgresql_table_name,
47+
embedding_service=AzureOpenAiWrapper().embedding_model,
48+
id_column=settings.postgresql_id_column,
49+
content_column=settings.postgresql_content_column,
50+
embedding_column=settings.postgresql_embedding_column,
51+
)
52+
53+
def add_documents(
54+
self,
55+
documents: list[Document],
56+
) -> list[str]:
57+
"""Add documents to a Cosmos DB container."""
58+
return self.vector_store.add_documents(
59+
documents=documents,
60+
)

0 commit comments

Comments
 (0)