JBHF's picture
Update app.py
8b29f16 verified
raw
history blame
66.3 kB
# NonToxicGlazeAdvisor_Chat_with_Docs_Groq_Edition_1 - app.py - 08-04-2024
# STREAMLIT:
# https://www.datacamp.com/tutorial/streamlit:
#
# st.title(): This function allows you to add the title of the app.
# st.header(): This function is used to set header of a section.
# st.markdown(): This function is used to set a markdown of a section.
# st.subheader(): This function is used to set sub-header of a section.
# st.caption(): This function is used to write caption.
# st.code(): This function is used to set a code.
# st.latex(): This function is used to display mathematical expressions formatted as LaTeX.
#
# st.title ("this is the app title")
# st.header("this is the header ")
# st.markdown("this is the markdown")
# st.subheader("this is the subheader")
# st.caption("this is the caption")
# st.code("x=2021")
# st.latex(r''' a+a r^1+a r^2+a r^3 ''')
# ========================================================================
# TABS
# 03-04-2024
import streamlit as st
tab1, tab2, tab3 = st.tabs(["AI Adviseur voor niet-giftige glazuren", "Uitleg", "Voorbeeld vragen"])
#with tab1:
# st.header("A cat")
# st.image("https://static.streamlit.io/examples/cat.jpg", width=200)
with tab2:
st.header("Uitleg")
st.image("De fritte oven - een schets van het proces.jpg", width=200)
st.header("Uitleg over gebruik en technische achtergronden van deze AI adviseur voor niet-giftige glazuren app:", divider='rainbow')
st.write("""
Deze online app gebruikt Artificial Intelligence (AI) om al uw vragen te beantwoorden op het gebied van niet giftige glazuur technieken. De app bevat teksten over dit onderwerp geschreven door keramist Victor Benckhuijsen, die daarin zijn ruime ervaring van meer dan 30 jaar. Samen vormen die teksten een boek over niet giftige glazuurtechnieken, zowel de theorie als de praktijk daarvan. In feite stelt deze app je in staat om vragen te stellen aan (de inhoud van) dit boek! Je kunt als het ware praten met dit boek.
De betreffende teksten staan in pdf bestanden (in totaal 7 pdf bestanden op het moment van schrijven van deze app uitleg, dat zouden er eventueel nog meer kunnen worden in de toekomst).
De rol van de AI hierin is om, gegeven de vraag die je stelt, op basis van de kennis over glazuur technieken en alles wat daarmee te maken heeft die is bevat in al die teksten, een taalkundig verantwoord antwoord te formuleren op je vraag.
Die verzameling van al die teksten wordt aangeduid met de term “context”. De AI maakt in principe uitsluitend gebruik van die context om antwoord op je vraag te geven, alhoewel het taalmodel waarover de AI beschikt in feite in goede benadering alle kennis van de mensheid bevat! (Tot aan een bepaalde datum in het recente verleden). Dit klinkt misschien wat overdreven, maar is toch waar omdat dat taalmodel kennis heeft genomen van alle kennis die is zit in een enorme hoeveelheid teksten waarop het model is getraind!
Bovendien draait de AI die in deze app wordt gebruikt ontzettend snel (heel veel sneller dan bijvoorbeeld de bekende chat app ChatGPT, misschien wel 100 maal zo snel!), omdat deze AI draait op gespecialiseerde hardware, namelijk LPU’s (LPU = Language Processing Unit) die speciaal hiervoor is ontworpen. LPU’s zijn nog heel veel sneller als GPU’s!
Op het tabblad “Voorbeeld vragen” van deze app staan een groot aantal voorbeelden van vragen (en ook voorbeeld antwoorden) die je aan deze app zou kunnen stellen.
Als het over glazuurtechnieken en keramiek gaat, kun je bijvoorbeeld eenvoudigweg de vraag stellen:
Vertel mij alles over glazuurtechnieken.
De app zal dan deze vraag, na heel kort nadenken (typisch minder dan 1 seconde!), beantwoorden.
Standaard staat de taal ingesteld op Nederlands. Je kunt echter zelf vlak voor iedere vraag een andere taal instellen. Op dit moment kun je kiezen uit:
Nederlands
Engels
Duits
Frans
Spaans
Italiaans
Dit zal wellicht nog worden uitgebreid met veel meer talen!
Merk op dat je vóór iedere nieuwe vraag de gewenste taal opnieuw kunt instellen. Dit houdt in, dat het antwoord door de AI gegeven zal worden in die ingestelde taal. De vraag zelf hoeft niet persé in die taal gesteld te worden, maar kan gesteld worden in 1 van de 6 talen bovengenoemd. (Soms luistert de AI niet naar de ingestelde taal, maar valt soms terug op het Engels. Probeer het dan opnieuw met precies dezelfde vraag, maar voeg dan aan de vraag toe: “Geef het antwoord uitsluitend en alleen in de taal X, en absoluut niet in welke andere taal dan X dan ook”, met X als de gewenste taal. Als het dan nog niet zou lukken, voeg dan aan de vraag ook nog toe: “Als je hieraan niet voldoet, zul je een zware straf ondergaan”. Dit klinkt vreemd, maar uit onderzoek is gebleken, dat deze taal modellen (AI) gevoelig blijken te zijn voor deze vormen van emotionele chantage! Raar maar waar!
Ook is de gebruikte AI creatief in zijn antwoorden, binnen de context van de aanwezige teksten die in de achtergrond gebruikt worden om de antwoorden op te baseren. Dat zul je merken als je precies dezelfde vraag meermaals opnieuw stelt. Dan zullen er iedere keer enigszins verschillend gestelde antwoorden uitkomen.
De AI staat nu ingesteld om enigszins creatief te antwoorden (in technische termen uitgedrukt is dat de “temperature” waarop de AI werkt, die nu vast is ingesteld op de waarde 0,2. Hij kan echter ook op 0 worden ingesteld voor zo goed als vaste, deterministische antwoorden of ook op 1 voor zéér creatieve antwoorden). Er zal aan de app nog een element worden toegevoegd, waardoor je als gebruiker deze temperature zelf kunt instellen op een waarde tussen 0,2 en 1,0.
Door het speciale “State of the Art” algoritme dat in deze app is toegepast om gebruikers vragen te beantwoorden (namelijk Retrieval Augmented Generation, oftewel RAG) wordt als zeer plezierig neveneffect bovendien ook nog bereikt, dat de AI in zijn antwoorden niet meer zal gaan hallucineren!
Hallucineren houdt in dit verband in, dat de AI met veel overtuigingskracht een feitelijk incorrect antwoord geeft, een antwoord dat er dan voor de vragensteller weliswaar zeer plausibel uitziet, maar in zo’n geval dus toch onjuist is. Waarbij onjuist hier betekent, dat het gehallucineerde antwoord niet gebaseerd is op de informatie die in de onderliggende teksten aanwezig is.
Dat hallucineren zou namelijk vaak wel optreden wanneer de vraag rechtstreeks aan de AI zelf gesteld zou worden, zonder die RAG techniek te gebruiken! De in deze app gebruikte RAG techniek voorkomt dus een gehallucineerd antwoord!
Eerder vermelde ik al, dat de in deze app gebruikte AI over algemene kennis beschikt. Deze app heeft echter in principe alleen antwoorden die te maken hebben met de inhoud van het boek over glazuurtechnieken.
Je kunt echter ook vragen stellen over welk onderwerp dan ook, die niets met glazuurtechnieken te maken hebben!
Daarvan staat een voorbeeld onder tabblad “Voorbeeld vragen” van deze app.
Dit gebeurt er bijvoorbeeld als je deze vraag aan deze app stelt:
VRAAG AAN DE AI:
Wat is een magisch vierkant? (selecteer als taal Nederlands)
ANTWOORD VAN DEAI (assistant):
In het gegeven context is geen enkele melding te vinden van een "magisch vierkant". Dus, in overeenstemming met het verzoek om een antwoord te baseren uitsluitend op de gegeven context, is mijn antwoord: Er is geen informatie over een "magisch vierkant" in de opgegeven tekst.
Terwijl er dit gebeurt als je deze vraag iets anders gesteld aan deze app stelt:
VRAAG AAN DE AI:
Wat is een magisch vierkant? Geef ook antwoord, ook al staat dat antwoord niet in je huidige context van pdf files! (selecteer als taal Nederlands)
ANTWOORD VAN DE AI (assistant):
In deze context wordt geen vermelding gemaakt van een magisch vierkant. Een magisch vierkant is een vierkante matrix waarbij de som van de getallen in elke rij, elke kolom en elke diagonaal gelijk is aan een vastgesteld getal, de magische constante. Het is dus onafhankelijk van de opgegeven context.
Voorbeeld van een magisch vierkant van orde 3 (dus 3 bij 3 matrix) met magische constante 15:
5 12 8
(MERK OP DAT DIT LAATSTE VOORBEELD VAN EEN MAGISCH VIERKANT WELISWAAR FOUT IS, MAAR DE AI GEEFT EERST WEL DEGELIJK EEN UITLEG VAN WAT EEN MAGISCH VIERKANT IS, OMDAT WE DE AI IN ONZE VRAAG UITDRUKKELIJK HEBBEN OPGEDRAGEN OM HET ANTWOORD OOK BUITEN DE GEGEVEN CONTEXT VAN PDF's TE GAAN ZOEKEN. DAT ANTWOORD KAN DE AI NU GEVEN, OMDAT DE AI INTERN ZELF OVER ALGEMENE WERELD KENNIS BESCHIKT !!!!!)
In de app kun je onder het antwoord van de AI nog precies nagaan op welke tekstpassages het antwoord gebaseerd is, door op “Document Similarity Search” te klikken met de linkermuisknop.
Verder kun je een samenvatting van de gehele conversatie in deze sessie bekijken en eventueel kopiëren en plakken in een andere toepassing (dwz alle vragen met bijbehorende antwoorden van de AI) als een Python list of dictionaries. Maar je kunt natuurlijk ook die hele conversatie gewoon uit de gebruikersinterface van deze app zelf kopiëren en plakken.
Tot zover deze uitleg over het gebruik en enige technische achtergronden van deze app en de gebruikte AI (taalmodel, Large Language Model oftewel LLM).
Veel plezier en nuttig gebruik van de AI app !
""")
st.title("Adviseur voor niet-giftige glazuren:")
st.subheader("Een gereedschap gebaseerd op Kunstmatige Intelligentie (AI) om advies te krijgen over niet-giftige keramische glazuren voor aardewerk temperatuur bereiken.")
st.write("---------------------------------")
st.subheader("Victor Benckhuijsen : (Glazuur technieken / Keramiek) - KERAMIST DES VADERLANDS")
st.subheader("(ALL RIGHTS RESERVED)")
st.image('Victor_Benckhuijsen_2.png', caption='Victor Benckhuijsen', width=100)
# st.subheader("---------------------------------")
# st.write("---------------------------------")
st.subheader("Jan Bours : Artificial Intelligence / Data Science / Natural Language Processing")
st.subheader("(ALL RIGHTS RESERVED)")
st.image('Jan_Bours_2.png', caption='Jan Bours', width=100)
st.write("---------------------------------")
st.subheader("Chat with Docs - Using AI: 'mixtral-8x7b-32768' Groq Edition (Very Fast!) - VERSION 2 - April 15, 2024")
st.write("---------------------------------")
with tab3:
st.header("Voorbeeld vragen")
st.write("De fritte oven - een schets van het proces:")
st.image("De fritte oven - een schets van het proces.jpg", width=200)
# https://docs.streamlit.io/library/api-reference/widgets/st.text_area
# st.text_area
# Streamlit Version -Version 1.32.0
# Display a multi-line text input widget.
# txt = st.text_area() # is voor text input !
# st.header('This is a header with a divider', divider='rainbow')
st.header('Hier alvast een klein aantal voorbeeldvragen die je aan deze AI adviseur voor niet-giftige glazuren zou kunnen stellen:', divider='rainbow')
# st.write("**Hier alvast een klein aantal voorbeeldvragen die je aan deze AI adviseur voor niet-giftige glazuren zou kunnen stellen:**")
st.write("\n")
st.write("Hoe kan ik thuis als hobby keramiek maken? Geef het antwoord uitsluitend en alleen in de Nederlands taal ")
st.write("Geef een samenvatting in 10 zinnen. ")
st.write("Geef een samenvatting in 25 bullet points. ")
st.write("Geef een samenvatting in 25 bullet points. Geef het antwoord uitsluitend en alleen in de Nederlandse taal. ")
st.write("Geef een samenvatting in 25 bullet points. Geef het antwoord uitsluitend en alleen in de Duitse taal. ")
st.write("Explain glazing techniques to me as if I am 10 years old. ")
st.write("Geef me uitleg over glazuurtechnieken alsof ik 5 jaar oud ben. Geef het antwoord uitsluitend en alleen in de Nederlandse taal.")
st.write(" ---------------------------------------------------------------- ")
st.header('Voorbeeldvragen met voorbeeldantwoorden die je aan deze AI adviseur voor niet-giftige glazuren zou kunnen stellen:', divider='rainbow')
st.write("Wie ben ik? (selecteer als taal Nederlands)\n")
st.write("assistant avatar:")
st.write("Gezien de tekst is het waarschijnlijk dat u heer Victor Benckhuijsen bent. U bent iemand die ervaring heeft opgedaan met het maken van glazuren voor keramiek, met name alkalische fritten. U heeft deze ervaring opgedaan op verschillende plekken, zoals de kunstacademie, de agrarische hogeschool en de geologie en bodemkunde. U benadrukt de waarden van veiligheid en het belang van het gebruik van non-giftige materialen. U verkoopt geen recepten, maar verstrekt wel veiligheidsattesten op verzoek. U benadrukt ook de voordelen van het gebruik van industriële fritten voor hobbyisten, omdat dit een veilige en eenvoudige manier is om non-giftige keramische glazuren te maken.")
st.write(" ---------------------------------------------------------------- ")
st.write("Wat is een magisch vierkant? (selecteer als taal Nederlands)\n")
st.write("assistant avatar:")
st.write("""
In het gegeven context is geen enkele melding te vinden van een "magisch vierkant". Dus, in overeenstemming met het verzoek om een antwoord te baseren uitsluitend op de gegeven context, is mijn antwoord: Er is geen informatie over een "magisch vierkant" in de opgegeven tekst.""")
st.write(" ---------------------------------------------------------------- ")
st.write("Wat is een magisch vierkant? Geef ook antwoord, ook al staat dat antwoord niet in je huidige context van pdf files! (selecteer als taal Nederlands)\n")
st.write("assistant avatar:")
st.write("""
In deze context wordt geen vermelding gemaakt van een magisch vierkant. Een magisch vierkant is een vierkante matrix waarbij de som van de getallen in elke rij, elke kolom en elke diagonaal gelijk is aan een vastgesteld getal, de magische constante. Het is dus onafhankelijk van de opgegeven context.
Voorbeeld van een magisch vierkant van orde 3 (dus 3 bij 3 matrix) met magische constante 15:
5 12 8
(MERK OP DAT DIT LAATSTE VOORBEELD VAN EEN MAGISCH VIERKANT WELISWAAR FOUT IS,
MAAR DE AI GEEFT EERST WEL DEGELIJK EEN UITLEG VAN WAT EEN MAGISCH VIERKANT IS,
OMDAT WE DE AI IN ONZE VRAAG UITDRUKKELIJK HEBBEN OPGEDRAGEN OM HET ANTWOORD OOK BUITEN DE GEGEVEN CONTEXT VAN PDF's TE GAAN ZOEKEN.
DAT ANTWOORD KAN DE AI NU GEVEN, OMDAT DE AI INTERN ZELF OVER ALGEMENE WERELD KENNIS BESCHIKT !!!!!)
""")
st.write(" ---------------------------------------------------------------- ")
st.header('Geavanceerde voorbeeldvragen met voorbeeldantwoorden die je aan deze AI adviseur voor niet-giftige glazuren zou kunnen stellen:', divider='rainbow')
st.write("Formulate 10 diverse hypotheses related to the context and then find arguments that support and refute these hypotheses (selecteer als taal Engels)\n")
st.write("assistant avatar:")
st.write("""Formulate 10 diverse hypotheses related to the context and then find arguments that support and refute these hypotheses
RESPONSE :
Response time: 0.42764801399999897 seconds
Hypothesis 1: The use of the Seger formula for representing the chemical structure of glazes in ceramics is a more accurate and reliable method than previous methods.
Argument for: The Seger formula represents the chemical structure of glazes in a way that is consistent with the periodic table, dividing the components into three categories: melting point depressants, amphoteric metals, and fusible metals. This systematic approach allows ceramicists to better understand the relationships between different components and their effects on the final product.
Argument against: While the Seger formula provides a systematic approach, it may not account for all the complexities and subtleties of ceramic glaze formulations. Other factors, such as particle size, impurities, and firing conditions, can also significantly impact the final product.
Hypothesis 2: The addition of Zirkoonsilicaat to a glaze recipe can result in a wider range of pastel colors.
Argument for: Zirkoonsilicaat has been identified as a component that can create pastel colors when added to a glaze recipe. This is because it can act as an opacifier, modifying the way light interacts with the glaze and leading to softer, pastel shades.
Argument against: The addition of Zirkoonsilicaat may also have unintended consequences, such as altering the viscosity or melting point of the glaze, which could impact its overall appearance and performance.
Hypothesis 3: The use of "gefritte" ceramic color pigments can result in more vibrant and consistent colors.
Argument for: "Gefritte" ceramic color pigments are created through a process of heating and cooling, which can result in more consistent and vibrant colors than other pigment types. This is because the heating and cooling process can help to ensure that the pigment particles are evenly distributed throughout the glaze.
Argument against: The use of "gefritte" pigments may not be suitable for all types of ceramic glazes, as the heating and cooling process can also alter the properties of the glaze itself. Additionally, the cost of "gefritte" pigments may be higher than other pigment types.
Hypothesis 4: The practice of alchemy, as described in the context, was a precursor to modern scientific methods.
Argument for: The alchemists described in the context were engaged in a systematic process of experimentation and observation, using a combination of objective and subjective methods. This approach bears some similarities to modern scientific methods, which emphasize careful observation, experimentation, and the development of hypotheses.
Argument against: However, the alchemists' approach was also fundamentally different from modern scientific methods in that it was heavily influenced by spiritual and mystical beliefs. While the alchemists did engage in systematic observation and experimentation, they also placed a strong emphasis on the role of the individual alchemist's subjective experiences and intuitions.
Hypothesis 5: The division of alchemy into "materiële" and "geestelijke" paths was a result of the increasing specialization and professionalization of scientific inquiry.
Argument for: As scientific inquiry became more specialized and professionalized, it became increasingly difficult for individual researchers to maintain a holistic perspective that integrated both material and spiritual concerns. The division of alchemy into "materiële" and "geestelijke" paths may have been a response to this trend, allowing researchers to specialize in one area or the other.
Argument against: However, it is also possible that the division of alchemy into "materiële" and "geestelijke" paths was a result of broader cultural and philosophical trends, rather than simply a response to the professionalization of scientific inquiry.
Hypothesis 6: The Seger formula can be used to accurately predict the properties of a ceramic glaze based on its component parts.
Argument for: The Seger formula provides a systematic approach to understanding the relationships between different components of a ceramic glaze, which could potentially be used to predict the properties of the final product.
Argument against: However, the properties of ceramic glazes can be influenced by a wide range of factors, including particle size, impurities, and firing conditions. As a result, it may be difficult or impossible to accurately predict the properties of a ceramic glaze based solely on its component parts.
Hypothesis 7: The use of clay as a starting material for ceramic glazes is a result of its unique physical and chemical properties.
Argument for: Clay has a number of unique physical and chemical properties that make it well-suited for use in ceramic glazes. For example, clay is highly plastic, which means it can be easily shaped and molded. Additionally, clay undergoes a number of physical and chemical changes when heated, which can result in the formation of strong, durable ceramic materials.
Argument against: However, clay is not the only possible starting material for ceramic glazes. Other materials, such as silica or alumina, can also be used to create ceramic glazes with a wide range of properties.
Hypothesis 8: The practice of alchemy was primarily focused on the transformation of base metals into gold.
Argument for: The transformation of base metals into gold was a central goal of many alchemists, who believed that this transformation was a symbol of spiritual enlightenment and transformation.
Argument against: However, the practice of alchemy was not limited to the transformation of base metals into gold. Alchemists were also interested in a wide range of other topics, including medicine, pharmacology, and spirituality.
Hypothesis 9: The properties of ceramic glazes can be altered through the addition of various additives.
Argument for: The properties of ceramic glazes can be significantly altered through the addition of various additives, such as opacifiers, colorants, and fluxes. These additives can modify the way that light interacts with the glaze, as well as its melting point, viscosity, and other properties.
Argument against: However, the addition of additives can also introduce new challenges and complexities into the glaze-making process. For example, some additives may interact with other components of the glaze in unpredictable ways, leading to unexpected results.
Hypothesis 10: The practice of alchemy was primarily focused on the manipulation of physical materials.
Argument for: The practice of alchemy did involve the manipulation of physical materials, such as metals, minerals, and chemicals. Alchemists engaged in a wide range of experimental techniques, including heating, cooling, dissolving, and mixing, in order to transform these materials.
Argument against: However, the practice of alchemy was not limited to the manipulation of physical materials. Alchemists were also interested in spiritual and mystical concepts, such as the unity of matter and spirit, the transformation of the self, and the pursuit of enlightenment.""")
st.write(" ---------------------------------------------------------------- ")
st.write("""
Formulate 10 diverse hypotheses related to the context and then find arguments that support and refute these hypotheses . Answer only in the Dutch language
Response time: 0.5270816530000104 seconds
Hypothesis 1: De smeltpuntverlagers in de chemische structuurformule van een glazuur, zoals door Herman Seger voorgesteld, zijn gebaseerd op de indeling van het periodiek systeem.
Argumenten voor:
- De smeltpuntverlagers staan links in de formule, wat overeenkomt met de indeling van het periodiek systeem.
- De amfotere metalen staan in het midden, wat ook overeenkomt met de indeling van het periodiek systeem.
Argumenten tegen:
- Er is geen bewijs dat de smeltpuntverlagers werkelijk gebaseerd zijn op de indeling van het periodiek systeem.
Hypothesis 2: De basistoffen in de chemische structuurformule van een glazuur, zoals door Herman Seger voorgesteld, zijn gesorteerd op smeltpunt.
Argumenten voor:
- De smeltpuntverlagers staan links in de formule, en de basistoffen staan rechts ervan, wat suggereert dat deze gesorteerd zijn op smeltpunt.
Argumenten tegen:
- Er is geen bewijs dat de basistoffen gesorteerd zijn op smeltpunt.
Hypothesis 3: De kleuren van keramische kleurpigmenten zijn afhankelijk van de hoeveelheid SiO2 die eraan toegevoegd wordt.
Argumenten voor:
- De kleur van keramische kleurpigmenten verandert als er SiO2 aan toegevoegd wordt.
Argumenten tegen:
- Er zijn andere factoren die de kleur van keramische kleurpigmenten kunnen beïnvloeden, zoals de temperatuur en de tijd van het branden.
Hypothesis 4: De alchemisten probeerden naast wetenschappelijke experimenten ook spirituele vragen te beantwoorden.
Argumenten voor:
- De alchemisten hadden naast wetenschappelijke kennis ook een gebedsruimte en een oven in hun werkruimte.
- De alchemisten bestudeerden chemische veranderingen met meditatie en objectiviteit.
Argumenten tegen:
- Er is geen direct bewijs dat de alchemisten spirituele vragen probeerden te beantwoorden.
Hypothesis 5: De alchemie is onafhankelijk van natuurwetenschappen en religie.
Argumenten voor:
- De alchemie is een totaalbeeld dat zich onafhankelijk ontwikkeld heeft van natuurwetenschappen en religie.
Argumenten tegen:
- De alchemie is historisch gezien nauw verbonden met zowel natuurwetenschappen als religie.
Hypothesis 6: De belangstelling voor de alchemie is uitgedoofd.
Argumenten voor:
- De belangstelling voor de alchemie is afgenomen sinds de opdeling van de alchemistische wetenschap in een materieel en een geestelijk deel.
Argumenten tegen:
- Er zijn nog steeds mensen die geïnteresseerd zijn in de alchemie en haar totaalbeeld.
Hypothesis 7: De alchemisten zochten naar antwoorden op natuurfenomenen met experimenten.
Argumenten voor:
- De alchemisten probeerden veel uit en hadden naast wetenschappelijke kennis ook een gebedsruimte en een oven in hun werkruimte.
Argumenten tegen:
- Er is geen direct bewijs dat de alchemisten experimenten deden om antwoorden op natuurfenomenen te vinden.
Hypothesis 8: De alchemie is een vorm van mystiek.
Argumenten voor:
- De mystiek is historisch gezien uit de alchemie voortgekomen.
Argumenten tegen:
- De alchemie is een totaalbeeld dat zich ontwikkeld heeft in de richting van zowel materiële als geestelijke vragen.
Hypothesis 9: De alchemisten bestudeerden chemische veranderingen met meditatie en objectiviteit.
Argumenten voor:
- De alchemisten hadden een gebedsruimte en een oven in hun werkruimte en bestudeerden chemische veranderingen met meditatie en objectiviteit.
Argumenten tegen:
- Er is geen direct bewijs dat de alchemisten chemische veranderingen bestudeerden met meditatie en objectiviteit.
Hypothesis 10: De alchemisten hadden een gebedsruimte en een oven in hun werkruimte.
Argumenten voor:
- De alchemisten hadden naast wetenschappelijke kennis ook een gebedsruimte en een oven in hun werkruimte.
Argumenten tegen:
- Er is geen direct bewijs dat de alchemisten een gebedsruimte en een oven in hun werkruimte hadden.""")
st.write(" ---------------------------------------------------------------- ")
st.write("""
Formulate 10 diverse hypotheses related to the context and then find arguments that support and refute these hypotheses and express your confidence in the given answers in a score between 0 and 1. Answer only the Dutch language .
Response time: 0.7786305489999847 seconds
Hypothesis 1: The use of Kaliveldspaat in the basisglazuur can lower the melting point of the glaze.
Support: The text states that Kaliveldspaat is added to the basisglazuur in a percentage of 5-10% to enable the glaze to be applied on earthenware. This implies that Kaliveldspaat can lower the melting point of the glaze, making it suitable for use on earthenware.
Refutation: The text does not provide specific information on the effect of Kaliveldspaat on the melting point of the glaze. However, it is mentioned that Kaliveldspaat is added to the basisglaze for earthenware, which suggests that it has a lower melting point.
Confidence score: 0.8
Hypothesis 2: Zirkoonsilicaat is used to create pastel colors in the glaze.
Support: The text states that Zirkoonsilicaat is added to the basisglaze in a percentage of 10% to enable the glaze to be written and mattered. It is also mentioned that it is used for creating pastel colors.
Refutation: The text does not provide specific information on how Zirkoonsilicaat creates pastel colors. However, it is mentioned that it is added to the basisglaze for this purpose.
Confidence score: 0.7
Hypothesis 3: The chemical structure of Quartz changes due to heating and erosion.
Support: The text states that the chemical structure of Quartz changes due to heating and erosion. It also mentions that the finest and most eroded form of Quartz on earth is clay.
Refutation: The text does not provide specific information on the mechanism of this change. However, it is mentioned that the chemical structure of Quartz changes due to heating and erosion.
Confidence score: 0.9
Hypothesis 4: The melting point of a glaze can be determined by the position of the oxides in the periodic table.
Support: The text describes a system for representing the chemical structure of a glaze, where the melting point regulators are placed on the left, the amphoteric metals in the middle, and the fusible metals on the right. This suggests that the position of the oxides in the periodic table can be used to determine the melting point of a glaze.
Refutation: The text does not provide specific information on how the position of the oxides in the periodic table can be used to determine the melting point of a glaze. However, it is mentioned that the chemical structure of a glaze can be represented in this way.
Confidence score: 0.6
Hypothesis 5: The glaze recipe is traditionally kept secret among potters.
Support: The text states that in the past, glaze recipes were not shared among potters due to competition.
Refutation: The text also states that this secrecy is no longer necessary due to the introduction of Hr. Seger's system for representing the chemical structure of a glaze.
Confidence score: 0.8
Hypothesis 6: The melting point of a glaze can be adjusted by adding certain oxides.
Support: The text describes a system for representing the chemical structure of a glaze, where the melting point regulators are placed on the left.
Refutation: The text does not provide specific information on how the melting point of a glaze can be adjusted by adding certain oxides. However, it is mentioned that the chemical structure of a glaze can be represented in this way.
Confidence score: 0.7
Hypothesis 7: The chemical structure of a glaze can be represented using the periodic table.
Support: The text describes a system for representing the chemical structure of a glaze, where the oxides are placed in the positions corresponding to their position in the periodic table.
Refutation: The text does not provide specific information on how the chemical structure of a glaze can be represented using the periodic table. However, it is mentioned that the chemical structure of a glaze can be represented in this way.
Confidence score: 0.7
Hypothesis 8: The melting point of a glaze can be determined by the position of the oxides in the system for representing the chemical structure of a glaze.
Support: The text describes a system for representing the chemical structure of a glaze, where the melting point regulators are placed on the left.
Refutation: The text does not provide specific information on how the melting point of a glaze can be determined by the position of the oxides in the system for representing the chemical structure of a glaze. However, it is mentioned that the chemical structure of a glaze can be represented in this way.
Confidence score: 0.6
Hypothesis 9: The chemical structure of a glaze can be represented using the periodic table and the system for representing the chemical structure of a glaze.
Support: The text describes a system for representing the chemical structure of a glaze, where the oxides are placed in the positions corresponding to their position in the periodic table.
Refutation: The text does not provide specific information on how the chemical structure of a glaze can be represented using the periodic table and the system for representing the chemical structure of a glaze. However, it is mentioned that the chemical structure of a glaze can be represented in this way.
Confidence score: 0.6
Hypothesis 10: The chemical structure of a glaze can be represented using the system for representing the chemical structure of a glaze and the position of the oxides in the periodic table.
Support: The text describes a system for representing the chemical structure of a glaze, where the oxides are placed in the positions corresponding to their position in the periodic table.
Refutation: The text does not provide specific information on how the chemical structure of a glaze can be represented using the system for representing the chemical structure of a glaze and the position of the oxides in the periodic table. However, it is mentioned that the chemical structure of a glaze can be represented in this way.
Confidence score: 0.6""")
st.write(" ---------------------------------------------------------------- ")
st.write("""
Brainstorm a list of potentially useful text retrieval tasks.
Response time: 0.5215754939999897 seconds
Based on the provided context, here are some potential text retrieval tasks that could be useful:
1. Retrieve all instances where a specific element or compound is mentioned, such as "CaO" or "SiO2".
2. Find all instances where the concept of "smeltpunt" (melting point) is discussed.
3. Retrieve all instances where the Seger structuurformule or Segerkegels are mentioned.
4. Find all instances where the process of "gefrit" or "fritting" is explained.
5. Retrieve all instances where the dangers of certain substances in glazes are mentioned.
6. Find all instances where the concept of "amfotere metalen" (amphoteric metals) is discussed.
7. Retrieve all instances where the process of ontleding van mineralen (decomposition of minerals) is explained.
8. Find all instances where the use of keramische glazuren (ceramic glazes) is mentioned.
9. Retrieve all instances where the German chemist Hermann Seger is mentioned.
10. Find all instances where the concept of "smeltpuntverlaging" (lowering of the melting point) is discussed.""")
st.write(" ---------------------------------------------------------------- ")
st.write("""
Brainstorm met mij in de Nederlandse taal over innovatieve toepassingen van glazuurtechnieken gegeven de context.
Response time: 0.5649652280000055 seconds
In het Nederlands:
Innovatieve toepassingen van glazuurtechnieken in de context van keramiek kunnen op verschillende manieren worden bekeken. Een interessante richting is het ontwikkelen van milieuvriendelijke en minder giftige glazuren. Prof. Dr. Hermann Seger's bijdrage aan de keramische industrie met zijn veilige basisglazuurrecepten is hier een goed voorbeeld van.
Een andere innovatieve richting is het combineren van traditionele keramische glazuurtechnieken met moderne technologie, zoals 3D-printtechnieken en sensorintegratie. Dit kan leiden tot unieke en praktische toepassingen, zoals intelligente keramische oppervlakken met temperatuur- of vochtigheidsgevoelige sensoren.
Een andere mogelijkheid is het ontwikkelen van glazuren met bijzondere optische eigenschappen, zoals warmte-reflecterende of doorschijnende glazuren voor architectonische toepassingen. Ook glazuren met antibacteriële of zelfreinigende eigenschappen zijn interessante innovatieve toepassingen.
Ten slotte kunnen keramische glazuren ook worden ontwikkeld met betrekking tot duurzame en circulaire productieproces. Bijvoorbeeld, glazuren met herbruikbare materialen of glazuren die het hergebruik van afvalproducten mogelijk maken.
In samenvatting, innovatieve toepassingen van keramische glazuurtechnieken kunnen zich richten op milieuvriendelijke en veiligere glazuren, moderne technologie integratie, unieke optische en functionele eigenschappen en circulaire productieproces.""")
st.write(" ---------------------------------------------------------------- ")
st.header('Filosofische voorbeeldvragen met voorbeeldantwoorden die je aan deze AI adviseur voor niet-giftige glazuren zou kunnen stellen:', divider='rainbow')
st.write("""
Schrijf een filosofisch essay over de glazuurkunst. Raak daarbij zoveel mogelijk filosofische verbanden aan
assistant avatar
In de wereld van de keramiek is het creëren van glazuren een kunstvorm die zich richt op het verkennen van materiaal, kleur en textuur. Het is een oud vak dat reeds duizenden jaren bestaat en zich ontwikkeld heeft tot een vorm van expressie die vergelijkbaar is met schilderen of beeldhouwen. Het filosofisch aspect van glazuren ligt in de combinatie van chemie, kunst en intuïtie die nodig is om unieke en mooie oppervlakken te creëren.
Als keramist begint men vaak met de traditionele recepten en technieken, maar al snel ontdekt men dat het mengen en aanpassen van deze recepten de kern is van de glazuurkunst. Het is een proces van experimenteren en observeren, waarbij men steeds beter begint te begrijpen hoe de verschillende materialen reageren op elkaar. Dit proces is vergelijkbaar met de filosofische opvatting van het leven als een reeks ervaringen die ons helpen om begrip en wijsheid te ontwikkelen.
Een belangrijke filosofische overweging bij het maken van glazuren is de relatie tussen toeval en controle. Hoewel er een chemische formule achter elk glazuurrecept zit, is het resultaat nooit helemaal voorspelbaar. De manier waarop het glazuur op het aardewerk aansluit, de kleur en de textuur die het creëert, zijn allemaal afhankelijk van vele factoren, zoals de temperatuur van de oven, de tijd dat het glazuur moet bakken en de samenstelling van het aardewerk zelf. Als keramist moet men leren om te werken met deze onzekerheden en te leren hoe men ze kan benutten om unieke en mooie resultaten te bereiken.
Een andere filosofische overweging is de relatie tussen de materie en de geest. Glazuren zijn een perfect voorbeeld van hoe materie en geest samenkomen om iets nieuws en unieks te creëren. De chemische formules en de materiële eigenschappen van de grondstoffen zijn de materie, maar het creatieve proces en de beslissingen die de keramist maakt tijdens het maken van het glazuur, zijn de geest. Het resultaat is een uniek en moois object dat zowel de materiële als de geestelijke aspecten van de mens vertegenwoordigt.
Ten slotte is de glazuurkunst ook een reflectie van de tijd en de cultuur. Glazuren zijn een manier om de geschiedenis en de cultuur van een bepaald gebied of periode weer te geven. De verschillende technieken, materialen en stijlen die gebruikt worden, zijn allemaal een reflectie van de tijd en de cultuur waarin ze gemaakt zijn. Als keramist maakt men deel uit van deze traditie en maakt men ook deel uit van de continuïteit van de glazuurkunst.
In deze zin is de glazuurkunst een filosofische praktijk die ons helpt om te reflecteren op de relatie tussen materie en geest, toeval en controle, en tijd en cultuur. Het is een kunstvorm die ons helpt om te begrijpen hoe we ons verhouden tot de wereld en hoe we ons kunnen uitdrukken in een manier die uniek en persoonlijk is.
""")
st.write("""
MAAR JE KUNT OOK EEN IETS ANDER ANTWOORD KRIJGEN ALS JE DEZELFDE VRAAG NOGMAALS STELT! DE AI IS CREATIEF IN ZIJN ANTWOORDEN! \n:
In de wereld van de keramiek is het creëren van glazuren een kunstvorm die zich richt op het verkennen van materiaal, kleur en textuur. Het is een oud vak dat reeds duizenden jaren bestaat en dat ondanks de vooruitgang van technologie en wetenschap, zijn mysteries behoudt. Het proces van glazuren is een filosofisch avontuur dat ons leert over de natuurwetten, de schoonheid van toeval en de essentie van het maken.
Een filosofische kijk op de glazuurkunst brengt ons naar de kern van de materie. Glazuren zijn een mengsel van chemische stoffen die, wanneer verhit, samensmelten tot een glasachtige substantie. Deze substantie is transparant of doorschijnend, waardoor de kleur en structuur van de onderliggende klei zichtbaar blijft. Het is deze transparantie die de aandacht vestigt op de natuurlijke schoonheid van de materie en ons herinnert aan de essentie van het leven: alles is samengesteld uit elementaire deeltjes.
Het maken van glazuren is ook een spel met binaire reeksen, waarbij twee stoffen worden gemengd om de gewenste eigenschappen te verkrijgen. Dit proces vereist een diepe begrip van de chemische en fysische eigenschappen van de materialen en de manier waarop zij reageren op temperatuur en tijd. Het is een dans tussen wetenschap en kunst, waarbij de kunstenaar zich laat leiden door zijn intuïtie en ervaring.
Het specialisme in het glazuren is een "zijweg" die pas ontstaat na veel voorbereiding en oefening. Het is een pad dat leidt naar de geheimen van de materie en de kunst van het maken. Het is een pad dat ons leert over de natuurwetten en de schoonheid van toeval. Het is een pad dat ons herinnert aan de essentie van het leven: alles is samengesteld uit elementaire deeltjes.
In de wereld van de glazuurkunst is er geen einde aan de mogelijkheden en de ontdekkingen. Het is een vak dat ons leert over de natuurwetten, de schoonheid van toeval en de essentie van het maken. Het is een filosofisch avontuur dat ons inspireert om verder te zoeken en verder te leren. Het is een kunstvorm die ons herinnert aan de schoonheid van de materie en de essentie van het leven.
""")
st.write(" ---------------------------------------------------------------- ")
st.write("""
OF NOG WEER EEN ANDER FILOSOFISCH ANTWOORD \n:
In de wereld van de keramiek is het creëren van glazuren een kunstvorm die zowel technisch als filosofisch kan worden benaderd. Het proces van glazuren is een spel met vele binaire reeksen, waarbij verschillende stoffen op systematische wijze met elkaar worden gemengd om de perfecte samenstelling te vinden. Dit is althans de technische kant van het verhaal.
Filosofisch gezien is het creëren van keramische glazuren een zoektocht naar harmonie en evenwicht tussen de elementen. Het is een manier om de natuur te observeren, te begrijpen en te imiteren. De samenstelling van de aarde, vuur en water spelen hierbij een cruciale rol. De aarde levert ons de grondstoffen, het vuur verandert deze grondstoffen in een vloeibare substantie en het water helpt bij het vormen van het glazuur.
Het mengen van de grondstoffen is vergelijkbaar met het mengen van kleuren op een palet van een schilder. Elke kleur heeft zijn eigen eigenschappen en effecten, en door ze te combineren ontstaan nieuwe kleuren en effecten. Het is een manier om de natuur te interpreteren en te hercréëren.
Het specialisme in het glazuren is een reis van voorbereiding, oefening en ontdekking. Het is een zijweg die pas na veel studie en praktijk kan worden bereikt. Het is een pad van zelfontdekking en zelfverwerkelijking. Het is een manier om de grenzen van de materie te testen en te verleggen.
Het creëren van keramische glazuren is ook een manier om de tijd te overwinnen. Het is een manier om de eeuwige cyclus van het leven en de dood te herdenken. Het vuur verandert de grondstoffen in een vloeibare substantie, maar als het afkoelt, verandert het weer in een vaste substantie. Het is een manier om de vergankelijkheid van het leven te herinneren en te eren.
In de wereld van de keramiek is het creëren van glazuren een kunstvorm die zowel technisch als filosofisch is. Het is een manier om de natuur te observeren, te begrijpen en te imiteren. Het is een manier om de grenzen van de materie te testen en te verleggen. Het is een manier om de vergankelijkheid van het leven te herinneren en te eren. Het is een manier om de grenzen van de creativiteit en de menselijke verbeeldingskracht te verkennen.
""")
st.write("(wordt vervolgd)")
# ========================================================================
with tab1:
st.header("AI Adviseur voor niet-giftige glazuren")
st.image("De fritte oven - een schets van het proces.jpg", width=200)
# JB:
# LangChainDeprecationWarning: Importing embeddings from langchain is deprecated.
# Importing from langchain will no longer be supported as of langchain==0.2.0.
# Please import from langchain-community instead:
# `from langchain_community.embeddings import FastEmbedEmbeddings`.
# To install langchain-community run `pip install -U langchain-community`.
from langchain_community.embeddings import FastEmbedEmbeddings
import os
import streamlit as st
from langchain_groq import ChatGroq
from langchain_community.document_loaders import WebBaseLoader
# JB:
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.embeddings import OllamaEmbeddings
# JB:
from langchain_community.embeddings import FastEmbedEmbeddings
from langchain_community.document_loaders import PyPDFDirectoryLoader
# JB:
# File Directory
# This covers how to load all documents in a directory.
# Under the hood, by default this uses the UnstructuredLoader.
from langchain_community.document_loaders import DirectoryLoader
from langchain_community.document_loaders import TextLoader
import chardet
from langchain_community.vectorstores import FAISS
# from langchain.vectorstores import Chroma
# from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import create_retrieval_chain
import time
from dotenv import load_dotenv
import glob
load_dotenv() #
groq_api_key = os.environ['GROQ_API_KEY']
# groq_api_key = "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" # os.environ['GROQ_API_KEY']
# groq_api_key = "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" # JB OK 24-03-2024
# print("groq_api_key: ", groq_api_key)
# st.title("Chat with Docs - Groq Edition :) ")
# # st.title ("this is the app title")
# st.title("Non-Toxic Glaze Advisor:")
# st.subheader("A tool for getting advicgroqe on non-toxic ceramic glazes for earthenware temperature ranges.")
# st.subheader("Victor Benchuijsen : (Glaze techniques / Ceramics)")
# st.subheader("Jan Bours : Artificial Intelligence / Data Science / Natural Language Processing (ALL RIGHTS RESERVED)")
# st.write("---------------------------------")
# st.subheader("Chat with Docs - Using AI: 'mixtral-8x7b-32768' Groq Edition (Very Fast!) - VERSION 1 - March 18, 2024")
# st.write("---------------------------------")
st.title("Adviseur voor niet-giftige glazuren:")
st.subheader("Een gereedschap gebaseerd op Kunstmatige Intelligentie (AI) om advies te krijgen over niet-giftige keramische glazuren voor aardewerk temperatuur bereiken.")
st.write("---------------------------------")
st.subheader("Victor Benckhuijsen : (Glazuur technieken / Keramiek) - KERAMIST DES VADERLANDS")
st.subheader("(ALL RIGHTS RESERVED)")
st.image('Victor_Benckhuijsen_2.png', caption='Victor Benckhuijsen', width=100)
# st.subheader("---------------------------------")
# st.write("---------------------------------")
st.subheader("Jan Bours : Artificial Intelligence / Data Science / Natural Language Processing")
st.subheader("(ALL RIGHTS RESERVED)")
st.image('Jan_Bours_2.png', caption='Jan Bours', width=100)
st.write("---------------------------------")
st.subheader("Chat with Docs - Using AI: 'mixtral-8x7b-32768' Groq Edition (Very Fast!) - VERSION 2 - April 8, 2024")
st.write("---------------------------------")
# st.header("LIST OF ALL THE LOADED DOCUMENTS: ")
st.header("LIJST MET ALLE ACTUEEL GELADEN DOCUMENTEN: ")
st.write("")
pdf_files = glob.glob("*.pdf")
# word_files = glob.glob("*.docx")
for file in pdf_files:
# for file in word_files:
st.subheader(file)
st.write("---------------------------------")
start1 = time.process_time()
if "vector" not in st.session_state:
st.write("Even geduld a.u.b. ........")
# st.header("Chunking, embedding, storing in FAISS vectorstore (Can take a long time!).")
# st.subheader("Wait till this hase been done before you can enter your query! .......")
# st.session_state.embeddings = OllamaEmbeddings() # ORIGINAL
st.session_state.embeddings = FastEmbedEmbeddings() # JB
# st.session_state.loader = WebBaseLoader("https://paulgraham.com/greatwork.html") # ORIGINAL
# st.session_state.docs = st.session_state.loader.load() # ORIGINAL
# https://api.python.langchain.com/en/latest/document_loaders/langchain_community.document_loaders.pdf.PyPDFLoader.html
# https://python.langchain.com/docs/integrations/document_loaders/merge_doc
# from langchain_community.document_loaders import PyPDFLoader
# loader_pdf = PyPDFLoader("../MachineLearning-Lecture01.pdf")
#
# https://stackoverflow.com/questions/60215731/pypdf-to-read-each-pdf-in-a-folder
#
# https://api.python.langchain.com/en/latest/document_loaders/langchain_community.document_loaders.pdf.PyPDFDirectoryLoader.html
# https://python.langchain.com/docs/modules/data_connection/document_loaders/pdf#pypdf-directory
# !!!!!
# PyPDF Directory
# Load PDFs from directory
# from langchain_community.document_loaders import PyPDFDirectoryLoader
# loader = PyPDFDirectoryLoader("example_data/")
# docs = loader.load()
#
# ZIE OOK:
# https://python.langchain.com/docs/modules/data_connection/document_loaders/pdf#using-pypdf
# Using MathPix
# Inspired by Daniel Gross's https://gist.github.com/danielgross/3ab4104e14faccc12b49200843adab21
# from langchain_community.document_loaders import MathpixPDFLoader
# loader = MathpixPDFLoader("example_data/layout-parser-paper.pdf")
# data = loader.load()
# pdf_file_path = "*.pdf" # JB
# st.session_state.loader = PyPDFLoader(file_path=pdf_file_path).load() # JB
# st.session_state.loader = PyPDFLoader(*.pdf).load() # JB syntax error *.pdf !
# st.session_state.loader = PyPDFDirectoryLoader("*.pdf") # JB PyPDFDirectoryLoader("example_data/")
# chunks = self.text_splitter.split_documents(docs)
# chunks = filter_complex_metadata(chunks)
# JB:
# https://python.langchain.com/docs/modules/data_connection/document_loaders/pdf#pypdf-directory
# st.session_state.docs = st.session_state.loader.load()
# loader = PyPDFDirectoryLoader(".")
# docs = loader.load()
# st.session_state.docs = docs
# https://docs.streamlit.io/library/api-reference/status/st.status
# st.status(label, *, expanded=False, state="running")
with st.status("Laden van de PDF documenten / Splitting de teksten / Genereer de Vector Store ...", expanded=True) as status:
# st.write("Searching for data...")
# time.sleep(2)
# st.write("Found URL.")
# time.sleep(1)
# st.write("Downloading data...")
# time.sleep(1)
#status.update(label="Download complete!", state="complete", expanded=False)
st.write("Laden van de PDF documenten...")
# JB:
# https://python.langchain.com/docs/modules/data_connection/document_loaders/file_directory
# text_loader_kwargs={'autodetect_encoding': True}
text_loader_kwargs={'autodetect_encoding': False}
path = '../'
# loader = DirectoryLoader(path, glob="**/*.pdf", loader_cls=TextLoader, loader_kwargs=text_loader_kwargs)
# PyPDFDirectoryLoader (TEST):
# loader = PyPDFDirectoryLoader(path, glob="**/*.pdf", loader_cls=TextLoader, loader_kwargs=text_loader_kwargs)
# loader = PyPDFDirectoryLoader(path, glob="**/*.pdf", loader_kwargs=text_loader_kwargs)
loader = PyPDFDirectoryLoader(path, glob="**/*.pdf")
docs = loader.load()
st.session_state.docs = docs
# JB 18-03-2024:
# https://python.langchain.com/docs/integrations/document_loaders/
# MICROSOFT WORD:
# https://python.langchain.com/docs/integrations/document_loaders/microsoft_word
# 1 - Using Docx2txt
# Load .docx using Docx2txt into a document.
# %pip install --upgrade --quiet docx2txt
# from langchain_community.document_loaders import Docx2txtLoader
# loader = Docx2txtLoader("example_data/fake.docx")
# data = loader.load()
# data
# [Document(page_content='Lorem ipsum dolor sit amet.', metadata={'source': 'example_data/fake.docx'})]
#
# 2A - Using Unstructured
# from langchain_community.document_loaders import UnstructuredWordDocumentLoader
# loader = UnstructuredWordDocumentLoader("example_data/fake.docx")
# data = loader.load()
# data
# [Document(page_content='Lorem ipsum dolor sit amet.', lookup_str='', metadata={'source': 'fake.docx'}, lookup_index=0)]
#
# 2B - Retain Elements
# Under the hood, Unstructured creates different “elements” for different chunks of text.
# By default we combine those together, but you can easily keep that separation by specifying mode="elements".
# loader = UnstructuredWordDocumentLoader("example_data/fake.docx", mode="elements")
# data = loader.load()
# data[0]
# Document(page_content='Lorem ipsum dolor sit amet.', lookup_str='', metadata={'source': 'fake.docx', 'filename': 'fake.docx', 'category': 'Title'}, lookup_index=0)
#
# 2A - Using Unstructured
# from langchain_community.document_loaders import UnstructuredWordDocumentLoader
# loader = UnstructuredWordDocumentLoader(path, glob="**/*.docx")
# docs = loader.load()
# st.session_state.docs = docs
st.write("Splitting / chunking de teksten...")
st.session_state.text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
st.session_state.documents = st.session_state.text_splitter.split_documents(st.session_state.docs)
st.write("Genereer de Vector Store (kan enige minuten duren)...")
# https://python.langchain.com/docs/integrations/vectorstores/faiss
# docs_and_scores = db.similarity_search_with_score(query)
# Saving and loading
# You can also save and load a FAISS index.
# This is useful so you don’t have to recreate it everytime you use it.
# db.save_local("faiss_index")
# new_db = FAISS.load_local("faiss_index", embeddings)
# docs = new_db.similarity_search(query)
# docs[0]
# Document(page_content='Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections. \n\nTonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. \n\nOne of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. \n\nAnd I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.', metadata={'source': '../../../state_of_the_union.txt'})
#
st.session_state.vector = FAISS.from_documents(st.session_state.documents, st.session_state.embeddings) # ORIGINAL
# st.session_state.vector = FAISS.from_documents(st.session_state.documents, st.session_state.embeddings) # ORIGINAL
#st.session_state.vector.save_local("faiss_index")
# The de-serialization relies loading a pickle file.
# Pickle files can be modified to deliver a malicious payload that results in execution of arbitrary code on your machine.
# You will need to set `allow_dangerous_deserialization` to `True` to enable deserialization. If you do this, make sure that you trust the source of the data.
#st.session_state.vector = FAISS.load_local("faiss_index", st.session_state.embeddings, allow_dangerous_deserialization=True)
# ZIE:
# ZIE VOOR EEN APP MET CHROMADB:
# https://github.com/vndee/local-rag-example/blob/main/rag.py
# https://raw.githubusercontent.com/vndee/local-rag-example/main/rag.py
# Chroma.from_documents(documents=chunks, embedding=FastEmbedEmbeddings())
# st.session_state.vector = Chroma.from_documents(st.session_state.documents, st.session_state.embeddings) # JB
# st.write(f"Response time van de LLM: {elapsed_time:.1f} seconds")
# print(f"Response time: {time.process_time() - start}")
elapsed_time = time.process_time() - start1
st.write(f"Response time voor: Laden van de PDF documenten / Splitting de teksten / Genereer de Vector Store: {elapsed_time:.1f} seconds")
st.write("---------------------------------")
# st.title("Chat with Docs - Groq Edition :) ")
# st.title("Literature Based Research (LBR) - A. Unzicker and J. Bours - Chat with Docs - Groq Edition (Very Fast!) - VERSION 3 - March 8 2024")
llm = ChatGroq(
temperature=0.2,
groq_api_key=groq_api_key,
model_name='mixtral-8x7b-32768'
)
prompt = ChatPromptTemplate.from_template("""
Answer the following question based only on the provided context.
Think step by step before providing a detailed answer.
I will tip you $200 if the user finds the answer helpful.
<context>
{context}
</context>
Question: {input}""")
document_chain = create_stuff_documents_chain(llm, prompt)
retriever = st.session_state.vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)
## prompt = st.text_input("Input your prompt here") #, key=key)
#prompt = st.text_input("Stel hieronder Uw vraag:") #, key=key)
#
## If the user hits enter
#if prompt:
# # Then pass the prompt to the LLM
# start = time.process_time()
# response = retrieval_chain.invoke({"input": prompt})
# # print(f"Response time: {time.process_time() - start}")
# st.write(f"Response time: {time.process_time() - start} seconds")
#
# st.write(response["answer"])
#
# # With a streamlit expander
# with st.expander("Document Similarity Search"):
# # Find the relevant chunks
# for i, doc in enumerate(response["context"]):
# # print(doc)
# # st.write(f"Source Document # {i+1} : {doc.metadata['source'].split('/')[-1]}")
# st.write(doc)
# st.write(f"Source Document # {i+1} : {doc.metadata['source'].split('/')[-1]}")
#
#
# st.write(doc.page_content)
# st.write("--------------------------------")
#
#st.write("---------------------------------")
# ZIE:
# https://raw.githubusercontent.com/streamlit/llm-examples/main/Chatbot.py
# from openai import OpenAI
# import streamlit as st
with st.sidebar:
# openai_api_key = st.text_input("OpenAI API Key", key="chatbot_api_key", type="password")
UserEmailAdress = st.text_input("Vul Uw email adres hier in: ", key="UserEmailAdress", type="password")
# "[Zelf keramische glazuren NON TOXIC samenstellen vanuit 1 basisglazuur](http://www.ceramicconcepts.nl/)"
"[Keramische ateliers Victor Benckhuijsen](https://victorglazuren.nl/)"
"[Keramiek Victor Glazuren Victor Benckhuijsen - Instagram](https://www.instagram.com/benckhuijsenvictor/?hl=am-et)"
"[Keramiek Victor Glazuren Victor Benckhuijsen - Facebook](https://www.facebook.com/harryjamaar)"
"[Keramiek Victor Glazuren Victor Benckhuijsen - YouTube](https://www.youtube.com/@kleienhoop/videos)"
st.title("💬 Chatbot")
st.caption("🚀 A streamlit chatbot powered by mixtral-8x7b-32768 Groq LLM (VERY FAST !). temperature=0.2")
if "messages" not in st.session_state:
st.session_state["messages"] = [{"role": "assistant", "content": "Hoe kan ik U helpen?"}]
for msg in st.session_state.messages:
st.chat_message(msg["role"]).write(msg["content"])
# TAAL KIEZER
option = st.selectbox(
'In welke taal wilt U Uw vragen stellen en de AI laten antwoorden? Keuzemogelijkheden zijn : Nederlands, Engels, Duits, Frans, Spaans, Italiaans',
('Nederlands', 'Engels', 'Duits', 'Frans', 'Spaans', 'Italiaans'))
st.write('You selected:', option)
language_prompt = " Antwoordt uitsluitend en alleen in de taal: " + option + " en beslist niet in een andere taal!"
# st.write('language_prompt:', language_prompt)
if prompt := st.chat_input():
#if not openai_api_key:
# st.info("Please add your OpenAI API key to continue.")
# st.stop()
## TAAL KIEZER
#option = st.selectbox(
# 'In welke taal wilt U Uw vragen stellen en de AI laten antwoorden? Keuzemogelijkheden zijn : Nederlands, Engels, Duits, Frans, Spaans.',
# ('Nederlands', 'Engels', 'Duits', 'Frans', 'Spaans'))
#
#st.write('You selected:', option)
#language_prompt = " Antwoordt uitsluitend en alleen in de taal: " + option + " en beslist niet in een andere taal!"
original_prompt = prompt
prompt = prompt + language_prompt
# st.write('prompt + language_prompt:', prompt)
# Then pass the prompt to the LLM
start = time.process_time()
response = retrieval_chain.invoke({"input": prompt})
# print(f"Response time: {time.process_time() - start}")
elapsed_time = time.process_time() - start
st.write(f"Response time van de LLM: {elapsed_time:.1f} seconds")
# st.write(response["answer"])
# https://docs.streamlit.io/library/api-reference/chat/st.chat_message
# st.chat_message(name, *, avatar=None)
# The avatar shown next to the message. Can be one of:
# - A single emoji, e.g. "🧑‍💻", "🤖", "🦖". Shortcodes are not supported.
# - An image using one of the formats allowed for st.image: path of a local image file;
# URL to fetch the image from; an SVG image; array of shape (w,h) or (w,h,1) for a monochrome image,
# (w,h,3) for a color image, or (w,h,4) for an RGBA image.
# If None (default), uses default icons if name is "user", "assistant", "ai", "human" or the first letter of the name value.
#client = OpenAI(api_key=openai_api_key)
st.session_state.messages.append({"role": "user", "content": prompt})
# st.chat_message("user").write(prompt)
# original_prompt
st.chat_message("user").write(original_prompt)
# response = client.chat.completions.create(model="gpt-3.5-turbo", messages=st.session_state.messages)
# msg = response.choices[0].message.content
msg = response["answer"]
st.session_state.messages.append({"role": "assistant", "content": msg})
# st.chat_message("assistant").write(msg)
# MET ALS AVATAR EEN IMAGE VAN VICTOR:
st.chat_message("assistant", avatar="Victor_Benckhuisen_20_percent.jpg").write(msg)
# With a streamlit expander
with st.expander("Document Similarity Search"):
# Find the relevant chunks
for i, doc in enumerate(response["context"]):
# print(doc)
# st.write(f"Source Document # {i+1} : {doc.metadata['source'].split('/')[-1]}")
st.write(doc)
st.write(f"Source Document # {i+1} : {doc.metadata['source'].split('/')[-1]}")
st.write(doc.page_content)
st.write("--------------------------------")
# Show total messages history of user + AI in this session up till this point
with st.expander("Show total messages history of user + AI in this session up till this point"):
# st.session_state.messages
st.write(st.session_state.messages)
st.write("--------------------------------")
st.write("---------------------------------")
#i=0
#while True:
#
# # data = ["input1", "input2", "input3"]
#
# #for i, item in enumerate(data):
# key = f"input_{i}"
# # text_input = st.text_input(f"Enter value for {item}", key=key)
# # Access the value directly
# print(f"Value for key: {key}")
#
# i=i+1
#
# prompt = st.text_input("Input your prompt here", key=key)
#
#
# # If the user hits enter
# if prompt:
# # Then pass the prompt to the LLM
# start = time.process_time()
# response = retrieval_chain.invoke({"input": prompt})
# # print(f"Response time: {time.process_time() - start}")
# st.write(f"Response time: {time.process_time() - start} seconds")
#
# st.write(response["answer"])
#
# # With a streamlit expander
# with st.expander("Document Similarity Search"):
# # Find the relevant chunks
# for i, doc in enumerate(response["context"]):
# # print(doc)
# # st.write(f"Source Document # {i+1} : {doc.metadata['source'].split('/')[-1]}")
# st.write(doc)
# st.write(f"Source Document # {i+1} : {doc.metadata['source'].split('/')[-1]}")
#
#
# st.write(doc.page_content)
# st.write("--------------------------------")
#
# st.write("---------------------------------")