Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/issue 25 llm for noc code lookup #1111

Open
wants to merge 76 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
d15227d
Implement example from https://www.youtube.com/watch?v=jENqvjpkwmw
rasmus-storjohann-PG Feb 28, 2024
2a3652b
progress
rasmus-storjohann-PG Mar 12, 2024
d137b82
progress
rasmus-storjohann-PG Mar 12, 2024
88a5ae6
Can do the query about ollama
rasmus-storjohann-PG Mar 12, 2024
925b905
Issue XXXX Can ask about the code for a given role
rasmus-storjohann-PG Mar 12, 2024
bcfd6bd
progress
rasmus-storjohann-PG Mar 12, 2024
14e1039
progress
rasmus-storjohann-PG Mar 12, 2024
901dfa8
Issue #XXX Identify code for executive assistant in film
rasmus-storjohann-PG Mar 12, 2024
e8b7884
Issue #XXX JD for hospital chef
rasmus-storjohann-PG Mar 12, 2024
4d39570
Issue #XXX Make progress on cohere and ollama rag demos
rasmus-storjohann-PG Mar 13, 2024
100fe54
progress
rasmus-storjohann-PG Mar 14, 2024
a178e97
progress
rasmus-storjohann-PG Mar 14, 2024
a168198
Issue XXXX Use json for the docs
rasmus-storjohann-PG Mar 14, 2024
030101b
progress
rasmus-storjohann-PG Mar 14, 2024
88aa631
Issue #### Remove chuncking, use one NOC code as a chunck
rasmus-storjohann-PG Mar 14, 2024
1338a0c
Issue #### Filter out duplicate noc codes
rasmus-storjohann-PG Mar 14, 2024
8286ce0
Try persisting embeddings
rasmus-storjohann-PG Mar 15, 2024
60caf3b
Issue XXXX Persisting embeddings seem to work...
rasmus-storjohann-PG Mar 15, 2024
3017706
Progress
rasmus-storjohann-PG Mar 15, 2024
a5637c9
CleanUp
rasmus-storjohann-PG Mar 15, 2024
d7e6a41
CleanUp
rasmus-storjohann-PG Mar 15, 2024
1946b62
Issue #XXXX Add basic timing info
rasmus-storjohann-PG Mar 15, 2024
902697d
CleanUp
rasmus-storjohann-PG Mar 15, 2024
c087f17
Issue #XXXX Create model file with system prompt. Command to build th…
rasmus-storjohann-PG Mar 15, 2024
1e4f1ba
Issue #XXXX Clean up of the model file
rasmus-storjohann-PG Mar 15, 2024
2970eee
Issue #XXXX Generated some job descriptions using chat gpt
rasmus-storjohann-PG Mar 15, 2024
b5bb437
progress
rasmus-storjohann-PG Mar 15, 2024
f85ad18
Issue #XXX Prompt is too slow
rasmus-storjohann-PG Mar 15, 2024
ad326ba
Issue #XXX Simpler prompt that may work better
rasmus-storjohann-PG Mar 15, 2024
4975e40
progresss
rasmus-storjohann-PG Mar 19, 2024
b492a20
Issue #XXXX prompt gives pretty consistent JSON back
rasmus-storjohann-PG Mar 19, 2024
a0f282e
Tweaks
rasmus-storjohann-PG Mar 19, 2024
73c9e3c
Issue #XXXX Polish
rasmus-storjohann-PG Mar 19, 2024
6a12d8c
Issue #XX First commit of cloud based (AWS) AI script
rasmus-storjohann-PG Mar 21, 2024
d47980f
progress
rasmus-storjohann-PG Mar 21, 2024
a101caa
step
rasmus-storjohann-PG Mar 21, 2024
8ba5e56
Issue #XXXXX Add requirements files for bedrock and ollama
rasmus-storjohann-PG Mar 21, 2024
b7358ff
Issue #XXXX Fix library statements
rasmus-storjohann-PG Mar 21, 2024
eda843e
steps
rasmus-storjohann-PG Mar 26, 2024
145ab22
step
rasmus-storjohann-PG Mar 26, 2024
3fc6866
steps
rasmus-storjohann-PG Mar 26, 2024
7058442
Issue #XXXX Three stages are in place, with user input to select winn…
rasmus-storjohann-PG Mar 26, 2024
4914191
step
rasmus-storjohann-PG Mar 26, 2024
7fb4795
step
rasmus-storjohann-PG Mar 28, 2024
6dbab15
Making progress, did not run out of memory!
rasmus-storjohann-PG Mar 28, 2024
6a2cd2c
Chroma database no longer running out of memory
rasmus-storjohann-PG Mar 28, 2024
a04d753
Can handle the persisted database existing or not
rasmus-storjohann-PG Mar 28, 2024
4b87d1d
renamed files
rasmus-storjohann-PG Mar 28, 2024
bd812f7
Clean up
rasmus-storjohann-PG Mar 28, 2024
82a40bf
Issue XXXX Read job descriptions to find matchess
rasmus-storjohann-PG Mar 28, 2024
5e9ffe7
it's working!!
rasmus-storjohann-PG Mar 29, 2024
c3c2535
Can connect to zilliz
rasmus-storjohann-PG Mar 29, 2024
9659870
Zilliz: document insert works
rasmus-storjohann-PG Mar 30, 2024
df74b03
Issue #### Can prepare json for import into a Zilliz collection
rasmus-storjohann-PG Apr 1, 2024
de07ec4
Issue #### Compute embeddings using all-MinimLM-L6-v2
rasmus-storjohann-PG Apr 1, 2024
fd8d6ae
Vector searches in Zilliz now works
rasmus-storjohann-PG Apr 1, 2024
1f50dc8
tool for computing embeddings for job descriptions
rasmus-storjohann-PG Apr 1, 2024
a5cc722
CleanUp
rasmus-storjohann-PG Apr 1, 2024
1441267
Can query server with BEARER authentication
rasmus-storjohann-PG Apr 1, 2024
aecfbc8
progress
rasmus-storjohann-PG Apr 1, 2024
4bed16b
CleanUp
rasmus-storjohann-PG Apr 1, 2024
f7d7f8f
CleanUp
rasmus-storjohann-PG Apr 1, 2024
6e83d33
improved command line argument handling
rasmus-storjohann-PG Apr 1, 2024
e83a55d
Improvements
rasmus-storjohann-PG Apr 1, 2024
9197db7
Step
rasmus-storjohann-PG Apr 1, 2024
cf0684f
Delete a file
rasmus-storjohann-PG Apr 2, 2024
6177226
Rename a file
rasmus-storjohann-PG Apr 2, 2024
4709a71
Translate file from py to js
rasmus-storjohann-PG Apr 2, 2024
4e94092
progress
rasmus-storjohann-PG Apr 2, 2024
40369dd
step
rasmus-storjohann-PG Apr 2, 2024
183b24e
step
rasmus-storjohann-PG Apr 2, 2024
03f94e7
step
rasmus-storjohann-PG Apr 2, 2024
24df338
step
rasmus-storjohann-PG Apr 2, 2024
66be9bd
step
rasmus-storjohann-PG Apr 2, 2024
be34b75
renames
rasmus-storjohann-PG Apr 2, 2024
e527fad
step
rasmus-storjohann-PG Apr 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added Schema.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
117 changes: 117 additions & 0 deletions bedrock-rag-2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
import boto3
import os.path
import json
import csv
from langchain_community.vectorstores import Chroma
from langchain_community.llms import Bedrock
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from langchain_community.embeddings import OllamaEmbeddings
from langchain.docstore.document import Document

def get_bedrock_client():
session = boto3.Session()
bedrock_client_internal = session.client(
service_name='bedrock-runtime',
region_name='us-east-1',
)
return bedrock_client_internal


def load_embeddings():
return Chroma(
collection_name="rag-chroma",
embedding_function=OllamaEmbeddings(model='nomic-embed-text'),
persist_directory="./chroma_db_bedrock"
)

# Filter out duplicate codes
def include_code(row):
return row['code'] not in ['11', '1', '0', '14', '12', '13', '10' ]

def to_page_content(code):
return json.dumps(code)

def compute_embeddings():
noc_codes = []
with open('data/noc.csv', newline='') as csvfile:
noc_codes = [
{ 'code': row['Code - NOC 2021 V1.0'], 'title': row['Class title'], 'definition': row['Class definition'] }
for row in csv.DictReader(csvfile)
]
filtered_noc_codes = [code for code in noc_codes if include_code(code)]
documents = [Document(
page_content=to_page_content(code),
metadata={'code': code['code']}
) for code in filtered_noc_codes]
print('total documents included = ', len(documents))

return Chroma.from_documents(
documents=documents,
collection_name="rag-chroma",
embedding=OllamaEmbeddings(model='nomic-embed-text'),
persist_directory="./chroma_db_bedrock"
)

def load_or_compute_embeddings():
embeddings_exist = os.path.isfile("./chroma_db/chroma.sqlite3")
return load_embeddings() if embeddings_exist else compute_embeddings()




#### not used ####
# def create_vector_db_chroma_index(chroma_db_path: str):
# #replace the document path here for pdf ingestion
# loader = PyPDFLoader(os.path.join("./", "data", "Doc2.pdf"))
# doc = loader.load()
# text_splitter = CharacterTextSplitter(chunk_size=2000, separator="\n")
# chunks = text_splitter.split_documents(doc)
# emb_model = "sentence-transformers/all-MiniLM-L6-v2"
# embeddings = HuggingFaceEmbeddings(
# model_name=emb_model,
# cache_folder="./cache/"
# )
# db = Chroma.from_documents(chunks,
# embedding=embeddings,
# persist_directory=chroma_db_path)
# db.persist()
# return db

def doit():
bedrock_boto3_client = get_bedrock_client()
chroma_db = load_or_compute_embeddings()
retriever = chroma_db.as_retriever()
llm = Bedrock(
model_id="anthropic.claude-instant-v1",
client=bedrock_boto3_client,
model_kwargs={
"max_tokens_to_sample": 512,
"temperature": 0
}
)

template = """\n\nHuman:Use the following pieces of context to answer the question at the end.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
Use three sentences maximum and keep the answer as concise as possible.
{context}
Question: {question}
\n\nAssistant:"""

memory = ConversationBufferMemory(
memory_key='chat_history',
return_messages=False
)

conv_qa_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
memory=memory,
return_source_documents=False
)

returnval = conv_qa_chain("is application development covered?")
print(returnval["answer"])

if __name__ == '__main__':
doit()
107 changes: 107 additions & 0 deletions bedrock-rag.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import boto3
import json
import os
from dotenv import load_dotenv
load_dotenv()

boto_client = boto3.client(service_name='bedrock-runtime',
aws_access_key_id=os.getenv('AWS_ACCESS_KEY_ID'),
aws_secret_access_key=os.getenv('AWS_SECRET_ACCESS_KEY'))

body = json.dumps({
"prompt": "\n\nHuman: explain white holes to 8th graders\n\nAssistant:",
"maxTokens": 300,
"temperature": 0.1,
# "topP": 0.9,
})

# https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-jurassic2.html
modelId = 'ai21.j2-ultra-v1'
accept = 'application/json'
contentType = 'application/json'

# print("boto client list models...")
# print(json.dumps(boto_client.list_models()))
# print("boto client list models done")

response = boto_client.invoke_model(
body=body,
modelId=modelId,
accept=accept,
contentType=contentType
)

response_body = json.loads(response.get('body').read())

print(response_body['completions'][0].get('data').get('text'))



# -----------------------
exit()

def load_embeddings():
return Chroma(
collection_name="rag-chroma",
embedding_function=OllamaEmbeddings(model='nomic-embed-text'),
persist_directory="./chroma_db"
)

noc_codes = []

with open('data/noc.csv', newline='') as csvfile:
noc_codes = [
{ 'code': row['Code - NOC 2021 V1.0'], 'title': row['Class title'], 'definition': row['Class definition'] }
for row in csv.DictReader(csvfile)
]

# Filter out duplicate codes
def include_code(row):
return row['code'] not in ['11', '1', '0', '14', '12', '13', '10' ]

filtered_noc_codes = [code for code in noc_codes if include_code(code)]

def to_page_content(code):
return json.dumps(code)

documents = [Document(
page_content=to_page_content(code),
metadata={'code': code['code']}
) for code in filtered_noc_codes]

def compute_embeddings():
return Chroma.from_documents(
documents=documents,
collection_name="rag-chroma",
embedding=OllamaEmbeddings(model='nomic-embed-text'),
persist_directory="./chroma_db"
)

def load_or_compute_embeddings():
embeddings_exist = os.path.isfile("./chroma_db/chroma.sqlite3")
return load_embeddings() if embeddings_exist else compute_embeddings()

embeddings = load_or_compute_embeddings()

retriever = embeddings.as_retriever()

after_rag_template = """Answer the question based only on the following context:
{context}
Question: {question}
"""

after_rag_prompt = ChatPromptTemplate.from_template(after_rag_template)

model_local = ChatOllama(model="noc_master")

# model_local is the OLLAMA model
# need to find a way to use the model from the boto client...

after_rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| after_rag_prompt
| model_local
| StrOutputParser()
)

print(after_rag_chain.invoke(prompt))
103 changes: 103 additions & 0 deletions bedrock.requirements
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
aiohttp==3.9.3
aiosignal==1.3.1
annotated-types==0.6.0
anyio==4.3.0
asgiref==3.8.0
async-timeout==4.0.3
attrs==23.2.0
backoff==2.2.1
bcrypt==4.1.2
boto3==1.34.67
botocore==1.34.67
build==1.1.1
cachetools==5.3.3
certifi==2024.2.2
charset-normalizer==3.3.2
chroma-hnswlib==0.7.3
chromadb==0.4.24
click==8.1.7
coloredlogs==15.0.1
dataclasses-json==0.6.4
Deprecated==1.2.14
exceptiongroup==1.2.0
fastapi==0.110.0
filelock==3.13.1
flatbuffers==24.3.7
frozenlist==1.4.1
fsspec==2024.3.1
google-auth==2.29.0
googleapis-common-protos==1.63.0
grpcio==1.62.1
h11==0.14.0
httptools==0.6.1
huggingface-hub==0.21.4
humanfriendly==10.0
idna==3.6
importlib-metadata==6.11.0
importlib_resources==6.4.0
jmespath==1.0.1
jsonpatch==1.33
jsonpointer==2.4
kubernetes==29.0.0
langchain-community==0.0.29
langchain-core==0.1.33
langsmith==0.1.31
marshmallow==3.21.1
mmh3==4.1.0
monotonic==1.6
mpmath==1.3.0
multidict==6.0.5
mypy-extensions==1.0.0
numpy==1.26.4
oauthlib==3.2.2
onnxruntime==1.17.1
opentelemetry-api==1.23.0
opentelemetry-exporter-otlp-proto-common==1.23.0
opentelemetry-exporter-otlp-proto-grpc==1.23.0
opentelemetry-instrumentation==0.44b0
opentelemetry-instrumentation-asgi==0.44b0
opentelemetry-instrumentation-fastapi==0.44b0
opentelemetry-proto==1.23.0
opentelemetry-sdk==1.23.0
opentelemetry-semantic-conventions==0.44b0
opentelemetry-util-http==0.44b0
orjson==3.9.15
overrides==7.7.0
packaging==23.2
posthog==3.5.0
protobuf==4.25.3
pulsar-client==3.4.0
pyasn1==0.5.1
pyasn1-modules==0.3.0
pydantic==2.6.4
pydantic_core==2.16.3
PyPika==0.48.9
pyproject_hooks==1.0.0
python-dateutil==2.9.0.post0
python-dotenv==1.0.1
PyYAML==6.0.1
requests==2.31.0
requests-oauthlib==1.4.0
rsa==4.9
s3transfer==0.10.1
six==1.16.0
sniffio==1.3.1
SQLAlchemy==2.0.28
starlette==0.36.3
sympy==1.12
tenacity==8.2.3
tokenizers==0.15.2
tomli==2.0.1
tqdm==4.66.2
typer==0.9.0
typing-inspect==0.9.0
typing_extensions==4.10.0
urllib3==1.26.18
uvicorn==0.29.0
uvloop==0.19.0
watchfiles==0.21.0
websocket-client==1.7.0
websockets==12.0
wrapt==1.16.0
yarl==1.9.4
zipp==3.18.1
Loading