106 lines
3.4 KiB
Python
106 lines
3.4 KiB
Python
from llmware.library import Library
|
|
from llmware.prompts import Prompt, Sources
|
|
from llmware.retrieval import Query
|
|
|
|
import streamlit as st
|
|
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.getcwd())
|
|
|
|
from Utils import get_stored_files, get_stored_libraries
|
|
|
|
|
|
ACCOUNT_NAME = 'lecture_tool'
|
|
SUMMARIZER_MODEL = 'slim-summary-tool'
|
|
|
|
|
|
#
|
|
# Summarizes specified file in specified library.
|
|
#
|
|
# Performs a text query for the topic, which can be an empty string.
|
|
#
|
|
# Uses the SUMMARIZER_MODEL defined above to generate a summary.
|
|
#
|
|
@st.cache_data(show_spinner=False)
|
|
def summarize_file(library_name, filename, topic):
|
|
# Load in appropriate library
|
|
library = Library().load_library(library_name, account_name=ACCOUNT_NAME)
|
|
print('\nupdate: library card - ', library.get_library_card())
|
|
|
|
# Create Query object
|
|
query = Query(library)
|
|
|
|
# Load in appropriate model
|
|
summarizer_prompter = Prompt().load_model(SUMMARIZER_MODEL, temperature=0.0, sample=False)
|
|
|
|
# Access all text blocks corresponding to specified file if no topic is provided
|
|
if topic == '':
|
|
# Filter out text chunks by filename
|
|
print('\nupdate: no topic provided, summarizing entire library')
|
|
query_results = query.apply_custom_filter(query.get_whole_library(), {'file_source': filename})
|
|
|
|
# Change key in query results for compatibility with RAG call
|
|
for result in query_results:
|
|
result['text'] = result['text_search']
|
|
del result['text_search']
|
|
# Access the text blocks corresponding to the specified file and topic
|
|
else:
|
|
# Perform text query for the topic, then filter out text blocks by filename
|
|
print('\nupdate: topic provided, performing text query')
|
|
query_results = query.apply_custom_filter(query.text_query(topic), {'file_source': filename})
|
|
|
|
print('\nupdate: correct library chunks - ', query_results)
|
|
|
|
# Pass in appropriate text blocks as source to the model
|
|
sources = Sources(summarizer_prompter).package_source(query_results, aggregate_source=True)
|
|
print('\nupdate: sources - ', sources)
|
|
|
|
# Prompt the model for a summary
|
|
print('\nupdate: summarizing in process')
|
|
response = summarizer_prompter.prompt_with_source('key points', first_source_only=False, verbose=True)
|
|
print('\nupdate: response - ', response)
|
|
|
|
# Create a list of only the unique points generated by the model
|
|
key_points = []
|
|
for resp in response:
|
|
for point in resp["llm_response"]:
|
|
if point not in key_points:
|
|
if point.strip():
|
|
if not point.strip().startswith("Not Found"):
|
|
key_points.append('- ' + point)
|
|
|
|
return key_points
|
|
|
|
|
|
#
|
|
# Main block for GUI logic.
|
|
#
|
|
if __name__ == '__main__':
|
|
st.title('Summarize your lectures')
|
|
|
|
st.write('### Prompt info')
|
|
|
|
library_name = st.selectbox(
|
|
'Select the library:',
|
|
tuple(get_stored_libraries())
|
|
)
|
|
|
|
if library_name:
|
|
filename = st.selectbox(
|
|
'Select the file:',
|
|
tuple(get_stored_files(library_name))
|
|
)
|
|
|
|
topic = st.text_input('Optionally enter a topic to summarize:')
|
|
|
|
if (st.button('Summarize')):
|
|
with st.spinner('Summarizing transcript... don\'t leave this page!'):
|
|
response = summarize_file(library_name, filename, topic)
|
|
|
|
st.write('### Summary')
|
|
|
|
for point in response:
|
|
st.write(point)
|