Files
wehub-resource-sync 86db9aae8e
Documentation / build (push) Waiting to run
Documentation / deploy (push) Blocked by required conditions
chore: import upstream snapshot with attribution
2026-07-13 13:34:55 +08:00

214 lines
9.3 KiB
Python

""" This example demonstrates the use of HuggingFace models
1. Use llmware models available on HuggingFace for generating vector embeddings
2. Load a basic decoder generative model from Huggingface and use it
3. Customizing a generative model with weights from a custom fine-tuned model
4. Using a Transformers model for embedding
5. Using a SentenceTransformers model for embedding
"""
import os
import torch
from llmware.configs import LLMWareConfig
from llmware.library import Library
from llmware.retrieval import Query
from llmware.models import ModelCatalog, HFEmbeddingModel
from llmware.prompts import Prompt
from llmware.setup import Setup
from llmware.util import CloudBucketManager
# note: starting in llmware-0.1.10, transformers and sentence_transformers are included in the pip install
try:
from transformers import AutoModel, AutoTokenizer, AutoModelForCausalLM
except ImportError:
raise ImportError (
"This example requires classes from the 'transformers' Python package. "
"You can install it with 'pip install transformers'"
)
try:
from sentence_transformers import SentenceTransformer
except ImportError:
raise ImportError (
"This example requires classes from the 'sentence-transformers' Python package"
"You can install it with 'pip install sentence-transformers'"
)
# Load an llmware model from Hugging Face to generate vector embeddings
def use_llmware_hf_models_for_embedding():
# llmware industry models currently published on HuggingFace (more will be coming!)
# *** use any HF embedding model, e.g., BERT, Roberta, etc.
# e.g., llmware_industry_models = "llmware/industry-bert-sec-v0.1",
# "llmware/industry-bert-asset-management-v0.1",
# "llmware/industry-bert-contracts-v0.1",
# "llmware/industry-bert-insurance-v0.1"
# Choose one
hf_model_name = "llmware/industry-bert-sec-v0.1"
# Load the model using the Transformer classes and then into llmware using an HFEmbeddingModel
print (f"\n > Loading model '{hf_model_name}'from HuggingFace...")
hf_tokenizer = AutoTokenizer.from_pretrained(hf_model_name)
hf_model = AutoModel.from_pretrained(hf_model_name)
# pass instantiated HF model and tokenizer to HFEmbeddingModel class
llmware_model = HFEmbeddingModel(model=hf_model, tokenizer=hf_tokenizer,model_name=hf_model_name)
# Generate an vector embedding
sample = "This is a sample sentence"
vector_embedding = llmware_model.embedding(sample)
print (f"\n > Generating a vector embedding for: '{sample}'\n\n{vector_embedding}")
return vector_embedding
# Load a basic decoder generative model from Huggingface and use it
def load_and_use_decoder_generative_model():
# These are some good 'off-the-shelf' smaller testing generative models from HuggingFace
hf_model_testing_list = ["facebook/opt-125m", "facebook/opt-350m", "facebook/opt-1.3b",
"EleutherAI/pythia-70m-v0", "EleutherAI/pythia-160m-v0", "EleutherAI/pythia-410m-v0",
"EleutherAI/pythia-1b-v0", "EleutherAI/pythia-1.4b-v0"]
# Here we'll just select one of the above models
model_name = hf_model_testing_list[6]
# Load the model using the Transformer classes
print (f"\n > Loading model '{model_name}'from HuggingFace...")
hf_model = AutoModelForCausalLM.from_pretrained(model_name)
hf_tokenizer = AutoTokenizer.from_pretrained(model_name)
# Bring the model into llware. These models were not trained on instruction following,
# so we set instruction_following to False
model = ModelCatalog().load_hf_generative_model(hf_model, hf_tokenizer, instruction_following=False)
# Make a call to the model
prompt_text = "The future of artificial intelligence is likely to be"
print (f"\n > Prompting the model with '{prompt_text}'")
output = model.inference(prompt_text)["llm_response"]
print(f"\nResponse:\n{prompt_text}{output}")
return output
# Load a HuggingFace generative model and override the weights to use a custom user-developed fine-tuned model
def override_generative_model_weights_with_custom_fine_tuned_model():
# These are some good 'off-the-shelf' smaller testing generative models from HuggingFace
hf_model_testing_list = ["facebook/opt-125m", "facebook/opt-350m", "facebook/opt-1.3b",
"EleutherAI/pythia-70m-v0", "EleutherAI/pythia-160m-v0", "EleutherAI/pythia-410m-v0",
"EleutherAI/pythia-1b-v0", "EleutherAI/pythia-1.4b-v0"]
# Select a model
model_name = "EleutherAI/pythia-410m-v0"
# Load the model using the Transformer classes
print (f"\n > Loading model '{model_name}'from HuggingFace...")
hf_model = AutoModelForCausalLM.from_pretrained(model_name)
hf_tokenizer = AutoTokenizer.from_pretrained(model_name)
# Retrive the custom fine-tuned model
# Note: This is a custom model that has been developed only for testing and demonstration purposes
custom_model_name = "contracts-pythia-hf-410m-v0"
print (f"\n > Loading custom model '{custom_model_name}'from llmware...")
custom_model_path = os.path.join(LLMWareConfig.get_model_repo_path(),custom_model_name)
if not os.path.exists(custom_model_path):
CloudBucketManager().pull_single_model_from_llmware_public_repo(custom_model_name)
# Override the hf_model default model weights with our own custom-trained weights and load it into llmware
print (f"\n > Overriding model '{model_name}' to use custom-trained weights from '{custom_model_name}'...")
hf_model.load_state_dict(torch.load(os.path.join(custom_model_path,"pytorch_model.bin"), map_location=torch.device('cpu')), strict=False)
model = ModelCatalog().load_hf_generative_model(hf_model, hf_tokenizer, instruction_following=False)
# Interact with the model
prompt_text = "According to the terms of the executive stock option plan,"
print (f"\n > Prompting the model with '{prompt_text}'")
output = model.inference(prompt_text)["llm_response"]
print(f"\nResponse:\n{prompt_text}{output}")
return output
# Use a Transformers model for embedding
def use_transformers_model_for_embedding(library_name, model_name):
# Create a library and add some documents so we can do some vector embeddings
print (f"\n > Creating a library...")
library = Library().create_new_library(library_name)
sample_files_path = Setup().load_sample_files()
library.add_files(input_folder_path=os.path.join(sample_files_path, "SmallLibrary"))
# Load the model
print (f"\n > Loading model '{model_name}'")
hf_model = AutoModel.from_pretrained(model_name)
hf_tokenizer = AutoTokenizer.from_pretrained(model_name)
# Create vector embeddings
print (f"\n > Creating vector embeddings...")
library.install_new_embedding(model=hf_model, tokenizer=hf_tokenizer, from_hf=True, vector_db="faiss", batch_size=50)
# Perform a query
query_term = "salary"
print (f"\n > Performing query for {query_term}...")
query = Query(library=library, embedding_model_name=model_name, embedding_model=hf_model, tokenizer=hf_tokenizer, from_hf=True)
query_results = query.semantic_query(query_term,result_count=3)
print (f"Top 3 Results:")
for i, result in enumerate(query_results):
file_source = result["file_source"]
page_num = result["page_num"]
text = result["text"]
print(f"\n - From {file_source} (page {page_num}):\n{text}")
return 0
# Use a SentenceTransformers model for embedding
def use_sentence_transformers_model_for_embedding(library_name, model_name):
# Create a library and add some documents so we can do some vector embeddings
print (f"\n > Creating a library...")
library = Library().create_new_library(library_name)
sample_files_path = Setup().load_sample_files()
library.add_files(input_folder_path=os.path.join(sample_files_path, "SmallLibrary"))
# Load the model
print (f"\n > Loading model '{model_name}'")
sbert_model = SentenceTransformer(model_name)
# Create vector embeddings
print (f"\n > Creating vector embeddings...")
library.install_new_embedding(model=sbert_model, embedding_model_name=model_name,
from_sentence_transformer=True, vector_db="faiss", batch_size=100)
# Perform a query
query_term = "salary"
print (f"\n > Performing query for {query_term}...")
query= Query(library=library,
embedding_model_name=model_name,
embedding_model=sbert_model,
from_sentence_transformer=True)
query_results = query.semantic_query(query_term, result_count=3)
print (f"Top 3 Results:")
for i, result in enumerate(query_results):
file_source = result["file_source"]
page_num = result["page_num"]
text = result["text"]
print(f"\n - From {file_source} (page {page_num}):\n{text}")
return query_results
if __name__ == "__main__":
use_llmware_hf_models_for_embedding()
load_and_use_decoder_generative_model()
override_generative_model_weights_with_custom_fine_tuned_model()
use_transformers_model_for_embedding("test_transformers", "bert-base-cased")
use_sentence_transformers_model_for_embedding("test_sentence_transformers", "all-distilroberta-v1")