afb6d5185d
Feature/lesser table caching refactor hybrid * chore: Remove unused duplicate main.py from shared pipeline * fix: Correct crosswalk paths in aarete_derived.py * chore: Remove unused documentation files from fieldExtraction * docs: Add documentation files to documentation folder * docs: Update README with uv setup, expanded project structure, and branching conventions * docs: Add uv installation steps with Ubuntu/WSL emphasis * Enable prompt caching for all remaining LLM calls - Add _INSTRUCTION() functions for: EXHIBIT_HEADER, EXHIBIT_LINKAGE, EXHIBIT_TITLE_MATCH, DATE_FIX, DERIVED_TERM_DATE, CHECK_PROVIDER_NAME_MATCH, SPECIAL_CASE_ASSIGNMENT - Update all invoke_claude() calls in saas and clover pipelines to use cache=True with corresponding _INSTRUCTION() functions - Add new instructions to get_cacheable_instructions() for cache warming - Update tests for new instruction functions Functions now using caching: - prompt_exhibit_level - prompt_exhibit_lesser (EXHIBIT_LEVEL_LESSER_OF) - prompt_fee_schedule_breakout - prompt_grouper_breakout - prompt_special_case_assignment - prompt_exhibit_linkage - prompt_exhibit_header - prompt_smart_chunked (ONE_TO_ONE templates) - prompt_date_fix - prompt_derived_term_date - prompt_exhibit_title_match - provider_name_match_check 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Reorder * feat: Add bcbs_promise client pipeline with OFFSET_TERM extraction - Add new bcbs_promise client with HSC-based OFFSET_TERM field extraction - Extract full paragraph text of offset/recoupment provisions from contracts - Derive OFFSET_INDICATOR (Y/N) from OFFSET_TERM presence - Fix reorder_columns to preserve extra columns not in COLUMN_ORDER - Update QC/QA output path to outputs/qc_qa/ * fix: Update dev deps and test assertions for QC/QA output path - Add pytest/pytest-mock to dev dependencies for mypy type checking - Update test assertions to expect outputs/qc_qa instead of qa_qc_output * style: Apply black formatting to prompt_templates.py * Merge main, move scripts * Archive some scripts * update py version * remove .py version file * Remove ASCII characters * Restore testbed code * restore tracking * Update testbed metrics * Enable prompt caching for CODE_LAST_CHECK, FILL_BILL_TYPE, DUAL_LOB_CHECK, and GROUPER_BREAKOUT - Add CODE_LAST_CHECK_INSTRUCTION() for service specificity classification - Add FILL_BILL_TYPE_INSTRUCTION() for bill type code determination - Add DUAL_LOB_CHECK_INSTRUCTION() for Medicare/Medicaid classification - Update code_funcs.py to use caching for CODE_LAST_CHECK, FILL_BILL_TYPE, GROUPER_BREAKOUT - Update postprocessing_funcs.py to use caching for DUAL_LOB_CHECK - Add new instructions to get_cacheable_instructions() for cache warming - Add unit tests for new instruction functions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Fix postprocessing_funcs to remove invalid columns * Merge branch 'main' into feature/lesser-table-caching-refactor-hybrid * Revert prompt caching changes from aed1b73c * update formatting * Update imports Approved-by: Sha Brown Approved-by: Praneel Panchigar
276 lines
9.7 KiB
Python
276 lines
9.7 KiB
Python
import os
|
|
|
|
# from dotenv import load_dotenv
|
|
from chromadb.config import Settings
|
|
|
|
# https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/excel.html?highlight=xlsx#microsoft-excel
|
|
from langchain_community.document_loaders import (
|
|
CSVLoader,
|
|
PDFMinerLoader,
|
|
TextLoader,
|
|
UnstructuredExcelLoader,
|
|
Docx2txtLoader,
|
|
)
|
|
from langchain_community.document_loaders import (
|
|
UnstructuredFileLoader,
|
|
UnstructuredMarkdownLoader,
|
|
)
|
|
|
|
|
|
# load_dotenv()
|
|
# ROOT_DIRECTORY = os.path.dirname(os.path.realpath(__file__))
|
|
ROOT_DIRECTORY = "\\\\amznfsxuofkyi1z.aarete.local\\SharedFiles\\AArete Client Work\\Modahealth\\Restricted\\Moda Growth\\Artificial Intelligence\\DEFAXXER_20231207"
|
|
|
|
# Define the folder for source and output
|
|
SOURCE_DIRECTORY = "SOURCE_DOCUMENTS"
|
|
OUTPUT_DIRECTORY = f"{ROOT_DIRECTORY}\\Output"
|
|
|
|
PERSIST_DIRECTORY = "DB"
|
|
|
|
MODELS_PATH = "C:\\Users\\Public\\models"
|
|
|
|
# Can be changed to a specific number
|
|
INGEST_THREADS = os.cpu_count() or 8
|
|
|
|
# Define the Chroma settings
|
|
CHROMA_SETTINGS = Settings(
|
|
anonymized_telemetry=False,
|
|
is_persistent=True,
|
|
allow_reset=True,
|
|
)
|
|
|
|
# Context Window and Max New Tokens
|
|
CONTEXT_WINDOW_SIZE = 4096
|
|
MAX_NEW_TOKENS = CONTEXT_WINDOW_SIZE # int(CONTEXT_WINDOW_SIZE/4)
|
|
|
|
#### If you get a "not enough space in the buffer" error, you should reduce the values below, start with half of the original values and keep halving the value until the error stops appearing
|
|
|
|
N_GPU_LAYERS = 100 # Llama-2-70B has 83 layers
|
|
N_BATCH = 512
|
|
|
|
### From experimenting with the Llama-2-7B-Chat-GGML model on 8GB VRAM, these values work:
|
|
# N_GPU_LAYERS = 20
|
|
# N_BATCH = 512
|
|
|
|
|
|
# https://python.langchain.com/en/latest/_modules/langchain/document_loaders/excel.html#UnstructuredExcelLoader
|
|
DOCUMENT_MAP = {
|
|
".txt": TextLoader,
|
|
".md": UnstructuredMarkdownLoader,
|
|
".py": TextLoader,
|
|
# ".pdf": PDFMinerLoader,
|
|
".pdf": UnstructuredFileLoader,
|
|
".csv": CSVLoader,
|
|
".xls": UnstructuredExcelLoader,
|
|
".xlsx": UnstructuredExcelLoader,
|
|
".docx": Docx2txtLoader,
|
|
".doc": Docx2txtLoader,
|
|
}
|
|
|
|
# Default Instructor Model
|
|
EMBEDDING_MODEL_NAME = "hkunlp/instructor-large" # Uses 1.5 GB of VRAM (High Accuracy with lower VRAM usage)
|
|
|
|
####
|
|
#### OTHER EMBEDDING MODEL OPTIONS
|
|
####
|
|
|
|
# EMBEDDING_MODEL_NAME = "hkunlp/instructor-xl" # Uses 5 GB of VRAM (Most Accurate of all models)
|
|
# EMBEDDING_MODEL_NAME = "intfloat/e5-large-v2" # Uses 1.5 GB of VRAM (A little less accurate than instructor-large)
|
|
# EMBEDDING_MODEL_NAME = "intfloat/e5-base-v2" # Uses 0.5 GB of VRAM (A good model for lower VRAM GPUs)
|
|
# EMBEDDING_MODEL_NAME = "all-MiniLM-L6-v2" # Uses 0.2 GB of VRAM (Less accurate but fastest - only requires 150mb of vram)
|
|
|
|
####
|
|
#### MULTILINGUAL EMBEDDING MODELS
|
|
####
|
|
|
|
# EMBEDDING_MODEL_NAME = "intfloat/multilingual-e5-large" # Uses 2.5 GB of VRAM
|
|
# EMBEDDING_MODEL_NAME = "intfloat/multilingual-e5-base" # Uses 1.2 GB of VRAM
|
|
|
|
|
|
#### SELECT AN OPEN SOURCE LLM (LARGE LANGUAGE MODEL)
|
|
# Select the Model ID and model_basename
|
|
# load the LLM for generating Natural Language responses
|
|
|
|
#### GPU VRAM Memory required for LLM Models (ONLY) by Billion Parameter value (B Model)
|
|
#### Does not include VRAM used by Embedding Models - which use an additional 2GB-7GB of VRAM depending on the model.
|
|
####
|
|
#### (B Model) (float32) (float16) (GPTQ 8bit) (GPTQ 4bit)
|
|
#### 7b 28 GB 14 GB 7 GB - 9 GB 3.5 GB - 5 GB
|
|
#### 13b 52 GB 26 GB 13 GB - 15 GB 6.5 GB - 8 GB
|
|
#### 32b 130 GB 65 GB 32.5 GB - 35 GB 16.25 GB - 19 GB
|
|
#### 65b 260.8 GB 130.4 GB 65.2 GB - 67 GB 32.6 GB - - 35 GB
|
|
|
|
# MODEL_ID = "TheBloke/Llama-2-7B-Chat-GGML"
|
|
# MODEL_BASENAME = "llama-2-7b-chat.ggmlv3.q4_0.bin"
|
|
|
|
####
|
|
#### (FOR GGUF MODELS)
|
|
####
|
|
|
|
# MODEL_ID = "TheBloke/Llama-2-13b-Chat-GGUF"
|
|
# MODEL_BASENAME = "llama-2-13b-chat.Q4_K_M.gguf"
|
|
|
|
MODEL_ID = "TheBloke/Llama-2-7b-Chat-GGUF"
|
|
MODEL_BASENAME = "llama-2-7b-chat.Q4_K_M.gguf"
|
|
|
|
# MODEL_ID = "TheBloke/Mistral-7B-Instruct-v0.1-GGUF"
|
|
# MODEL_BASENAME = "mistral-7b-instruct-v0.1.Q8_0.gguf"
|
|
|
|
# MODEL_ID = "TheBloke/Llama-2-70b-Chat-GGUF"
|
|
# MODEL_BASENAME = "llama-2-70b-chat.Q4_K_M.gguf"
|
|
|
|
####
|
|
#### (FOR HF MODELS)
|
|
####
|
|
|
|
# MODEL_ID = "NousResearch/Llama-2-7b-chat-hf"
|
|
# MODEL_BASENAME = None
|
|
# MODEL_ID = "TheBloke/vicuna-7B-1.1-HF"
|
|
# MODEL_BASENAME = None
|
|
# MODEL_ID = "TheBloke/Wizard-Vicuna-7B-Uncensored-HF"
|
|
# MODEL_ID = "TheBloke/guanaco-7B-HF"
|
|
# MODEL_ID = 'NousResearch/Nous-Hermes-13b' # Requires ~ 23GB VRAM. Using STransformers
|
|
# alongside will 100% create OOM on 24GB cards.
|
|
# llm = load_model(device_type, model_id=model_id)
|
|
|
|
####
|
|
#### (FOR GPTQ QUANTIZED) Select a llm model based on your GPU and VRAM GB. Does not include Embedding Models VRAM usage.
|
|
####
|
|
|
|
##### 48GB VRAM Graphics Cards (RTX 6000, RTX A6000 and other 48GB VRAM GPUs) #####
|
|
|
|
### 65b GPTQ LLM Models for 48GB GPUs (*** With best embedding model: hkunlp/instructor-xl ***)
|
|
# MODEL_ID = "TheBloke/guanaco-65B-GPTQ"
|
|
# MODEL_BASENAME = "model.safetensors"
|
|
# MODEL_ID = "TheBloke/Airoboros-65B-GPT4-2.0-GPTQ"
|
|
# MODEL_BASENAME = "model.safetensors"
|
|
# MODEL_ID = "TheBloke/gpt4-alpaca-lora_mlp-65B-GPTQ"
|
|
# MODEL_BASENAME = "model.safetensors"
|
|
# MODEL_ID = "TheBloke/Upstage-Llama1-65B-Instruct-GPTQ"
|
|
# MODEL_BASENAME = "model.safetensors"
|
|
|
|
##### 24GB VRAM Graphics Cards (RTX 3090 - RTX 4090 (35% Faster) - RTX A5000 - RTX A5500) #####
|
|
|
|
### 13b GPTQ Models for 24GB GPUs (*** With best embedding model: hkunlp/instructor-xl ***)
|
|
# MODEL_ID = "TheBloke/Wizard-Vicuna-13B-Uncensored-GPTQ"
|
|
# MODEL_BASENAME = "Wizard-Vicuna-13B-Uncensored-GPTQ-4bit-128g.compat.no-act-order.safetensors"
|
|
# MODEL_ID = "TheBloke/vicuna-13B-v1.5-GPTQ"
|
|
# MODEL_BASENAME = "model.safetensors"
|
|
# MODEL_ID = "TheBloke/Nous-Hermes-13B-GPTQ"
|
|
# MODEL_BASENAME = "nous-hermes-13b-GPTQ-4bit-128g.no-act.order"
|
|
# MODEL_ID = "TheBloke/WizardLM-13B-V1.2-GPTQ"
|
|
# MODEL_BASENAME = "gptq_model-4bit-128g.safetensors
|
|
|
|
### 30b GPTQ Models for 24GB GPUs (*** Requires using intfloat/e5-base-v2 instead of hkunlp/instructor-large as embedding model ***)
|
|
# MODEL_ID = "TheBloke/Wizard-Vicuna-30B-Uncensored-GPTQ"
|
|
# MODEL_BASENAME = "Wizard-Vicuna-30B-Uncensored-GPTQ-4bit--1g.act.order.safetensors"
|
|
# MODEL_ID = "TheBloke/WizardLM-30B-Uncensored-GPTQ"
|
|
# MODEL_BASENAME = "WizardLM-30B-Uncensored-GPTQ-4bit.act-order.safetensors"
|
|
|
|
##### 8-10GB VRAM Graphics Cards (RTX 3080 - RTX 3080 Ti - RTX 3070 Ti - 3060 Ti - RTX 2000 Series, Quadro RTX 4000, 5000, 6000) #####
|
|
### (*** Requires using intfloat/e5-small-v2 instead of hkunlp/instructor-large as embedding model ***)
|
|
|
|
### 7b GPTQ Models for 8GB GPUs
|
|
# MODEL_ID = "TheBloke/Wizard-Vicuna-7B-Uncensored-GPTQ"
|
|
# MODEL_BASENAME = "Wizard-Vicuna-7B-Uncensored-GPTQ-4bit-128g.no-act.order.safetensors"
|
|
# MODEL_ID = "TheBloke/WizardLM-7B-uncensored-GPTQ"
|
|
# MODEL_BASENAME = "WizardLM-7B-uncensored-GPTQ-4bit-128g.compat.no-act-order.safetensors"
|
|
# MODEL_ID = "TheBloke/wizardLM-7B-GPTQ"
|
|
# MODEL_BASENAME = "wizardLM-7B-GPTQ-4bit.compat.no-act-order.safetensors"
|
|
|
|
####
|
|
#### (FOR GGML) (Quantized cpu+gpu+mps) models - check if they support llama.cpp
|
|
####
|
|
|
|
# MODEL_ID = "TheBloke/wizard-vicuna-13B-GGML"
|
|
# MODEL_BASENAME = "wizard-vicuna-13B.ggmlv3.q4_0.bin"
|
|
# MODEL_BASENAME = "wizard-vicuna-13B.ggmlv3.q6_K.bin"
|
|
# MODEL_BASENAME = "wizard-vicuna-13B.ggmlv3.q2_K.bin"
|
|
# MODEL_ID = "TheBloke/orca_mini_3B-GGML"
|
|
# MODEL_BASENAME = "orca-mini-3b.ggmlv3.q4_0.bin"
|
|
|
|
####
|
|
#### (FOR AWQ QUANTIZED) Select a llm model based on your GPU and VRAM GB. Does not include Embedding Models VRAM usage.
|
|
### (*** MODEL_BASENAME is not actually used but have to contain .awq so the correct model loading is used ***)
|
|
### (*** Compute capability 7.5 (sm75) and CUDA Toolkit 11.8+ are required ***)
|
|
####
|
|
# MODEL_ID = "TheBloke/Llama-2-7B-Chat-AWQ"
|
|
# MODEL_BASENAME = "model.safetensors.awq"
|
|
|
|
|
|
##########################################################################################################################################
|
|
|
|
## CONSTANTS FOR INFRATRUCTURE
|
|
|
|
# SSO User list
|
|
USER_LIST = [
|
|
"maamseek@aarete.com",
|
|
"smahdavian@aarete.com",
|
|
"ahinge@aarete.com",
|
|
"akadam@aarete.com",
|
|
"pkatariya@aarete.com",
|
|
"piragavarapu@aarete.com",
|
|
"umistry@aarete.com",
|
|
"ahutchison@aarete.com",
|
|
"bgrunst@aarete.com",
|
|
"ddimeglio@aarete.com",
|
|
"vnair@aarete.com",
|
|
"kminhas@aarete.com",
|
|
"fmohiuddin@aarete.com",
|
|
"slitewka@aarete.com",
|
|
"qdoest@aarete.com",
|
|
"bkoryga@aarete.com",
|
|
"bcielecki@aarete.com",
|
|
"mszymanski@aarete.com",
|
|
"hupreti@aarete.com",
|
|
"sshingare@aarete.com",
|
|
"vsrinivasan@aarete.com",
|
|
]
|
|
|
|
|
|
# DOCZY DEV
|
|
DOCZY_PIPELINE_URL_DEV = (
|
|
"https://4lzhid1s0h.execute-api.us-east-2.amazonaws.com/dev/trigger-pipeline"
|
|
)
|
|
DOCZY_REDIRECT_URL_DEV = "https://doczydev.aarete.com:850"
|
|
DOCZY_CREATE_BATCH_URL_DEV = (
|
|
"https://4lzhid1s0h.execute-api.us-east-2.amazonaws.com/dev/create-batch"
|
|
)
|
|
|
|
# DOCZY UAT
|
|
DOCZY_PIPELINE_URL_UAT = (
|
|
"https://29gm8cek03.execute-api.us-east-2.amazonaws.com/dev/trigger-pipeline"
|
|
)
|
|
DOCZY_REDIRECT_URL_UAT = "https://doczyuat.aarete.com:850"
|
|
DOCZY_CREATE_BATCH_URL_UAT = (
|
|
"https://29gm8cek03.execute-api.us-east-2.amazonaws.com/dev/create-batch"
|
|
)
|
|
|
|
# DOCZY PROD
|
|
DOCZY_PIPELINE_URL_PROD = (
|
|
"https://d612isd3ja.execute-api.us-east-2.amazonaws.com/dev/trigger-pipeline"
|
|
)
|
|
DOCZY_REDIRECT_URL_PROD = "https://doczy.aarete.com:850"
|
|
DOCZY_CREATE_BATCH_URL_PROD = (
|
|
"https://d612isd3ja.execute-api.us-east-2.amazonaws.com/dev/create-batch"
|
|
)
|
|
|
|
# SNOWFLAKE DEV DATABASE
|
|
SNOWFLAKE_ACCOUNT_LOCATOR = ("aarete-doczyai",)
|
|
DEV_DB_ROLE = ("DEVADMIN",)
|
|
DEV_WH = ("DEV_XS",)
|
|
DEV_DB = ("DOCZY_DEV",)
|
|
DEV_STAGING_SCHEMA = "STG"
|
|
|
|
# SNOWFLAKE UAT DATABASE
|
|
UAT_DB_ROLE = ("UATADMIN",)
|
|
UAT_WH = ("DEV_XS",)
|
|
UAT_DB = ("DOCZY_UAT",)
|
|
UAT_STAGING_SCHEMA = "STG"
|
|
|
|
# SNOWFLAKE PROD DATABASE
|
|
PROD_DB_ROLE = ("PRODADMIN",)
|
|
PROD_WH = ("DEV_XS",)
|
|
PROD_DB = ("DOCZY_PROD",)
|
|
PROD_STAGING_SCHEMA = "STG"
|