Groot taalmodelle is ongelooflik kragtig en dit is indrukwekkend dat hulle opgelei is op 'n groot datakorpora. Hoeveel van ons het egter die begroting om hierdie modelle in die huis op te lei, terwyl ons op ons stigter-reis begin? Waarskynlik, baie min.
Maar wag, is hierdie vooraf opgeleide LLM's nuttig vir ons? Natuurlik, as hulle oopbron is. Gelukkig is daar nou heelwat beskikbaar.
So, hoe presies is hulle nuttig? Die meeste van ons in die KI-veld is bewus van JOOL's of het ten minste van hulle gehoor. Kom ek gee 'n eenvoudige eenlyn-definisie. Herwinning-vergrote generasie is presies hoe dit klink - dit haal data uit die eksterne bronne wat ons verskaf en vul dit aan tot die LLM-uitset.
Dit is uiters nuttig omdat dit die generatiewe krag van LLM'e benut, terwyl dit die kennis wat ons ekstern verskaf inkorporeer om uitsette van die verlangde korpus te genereer. As jy 'n beperkte eksterne korpus het, kan ons die model laat terugval op die algemene kennis van die LLM.
Ek stel veral belang in hoe ons eet en glo diep in die konsep van "vuil in, vullis uit" wanneer dit by kos en liggame kom. As ons onsself voed met natuurlike gesonde kosse, weerspieël ons die natuur – sterk, lewendig en onstuitbaar. Maar as ons kunsmatige, lewelose kosse inneem, begin ons dieselfde lyk en voel – gedreineer en onnatuurlik. Een van die ergste gevolge van oormatige kunsmatige en verfynde voedselverbruik vandag is diabetes.
En wie verstaan werklik die werklike pynpunte van die lewe met diabetes? Dis eenvoudig – die mense wat dit eerstehands ervaar. Gegewe my belangstelling in die verkryging van ervaringsdata oor diabetes met behulp van LLM's, het ek hierdie eksperiment met Ollama uitgevoer - een van vele oopbron LLM's wat vir sulke take gebruik kan word.
Ek deel my notaboek stap vir stap met 'n verduideliking by elke stadium. Verder, om begrip te help, sluit ek 'n hoëvlak argitektuurdiagram in.
Stap 1: Haal en verwerk inhoud vanaf verskeie URL's. Ons skraap teks uit die verskafde lys van Reddit URL's en stoor dit in all_texts.
# Import necessary libraries import requests from bs4 import BeautifulSoup from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import OllamaEmbeddings from langchain.vectorstores import FAISS from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from langchain.llms import Ollama # List of URLs to scrape urls = [ 'https://www.reddit.com/r/diabetes/comments/1broigp/what_are_your_biggest_frustrations_with_diabetes/', 'https://www.reddit.com/r/diabetes_t2/comments/156znkx/whats_the_most_challenging_part_about_dealing/', 'https://www.reddit.com/r/diabetes/comments/qcsgji/what_is_the_hardest_part_about_managing_diabetes/', 'https://www.reddit.com/r/diabetes_t1/comments/1hdlipr/diabetes_and_pain/', 'https://www.reddit.com/r/diabetes/comments/ww6mrj/what_does_diabetic_nerve_pain_feel_like/', 'https://www.reddit.com/r/AskReddit/comments/avl1x0/diabetics_of_reddit_what_is_your_experience_of/', 'https://www.reddit.com/r/diabetes_t2/comments/1jggxi9/my_fathers_sugar_levels_are_not_dropping/', 'https://www.reddit.com/r/diabetes_t2/comments/1jglmie/shaky_feeling/', 'https://www.reddit.com/r/diabetes_t2/comments/1jgccvo/rant_from_a_depressedeating_disordered_diabetic/' ] # Initialize text storage all_texts = [] # Step 1: Fetch and process content from multiple URLs for url in urls: response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # Extract text from <p> tags text = ' '.join([para.get_text() for para in soup.find_all('p')]) if text: # Store only if text is found all_texts.append(text)
Stap 2: Ons verdeel die geskrapte teks in meer hanteerbare stukke vir doeltreffende teksverwerking. Ons kan ook geheuegebruik verminder en soekprestasie verbeter.
# Step 2: Split all content into chunks text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) all_chunks = [] for text in all_texts: all_chunks.extend(text_splitter.split_text(text))
Stap 3: Ons inisialiseer Ollama-inbeddings. Inbeddings is numeriese (vektor) voorstellings van rou teks wat die semantiese betekenis van die teks vasvang. Inbeddings stel verskeie ML-modelle in staat om teks effektief te verwerk en te verstaan. OllamaEmbeddings-klas maak gebruik van llama2-model om hierdie inbeddings te genereer.
# Step 3: Initialize Ollama embeddings embeddings = OllamaEmbeddings(model="llama2") # Adjust model name if needed
Stap 4: Facebook AI Similarity Search (FAISS) is 'n biblioteek vir doeltreffende ooreenkomssoektog en groepering van hoë-dimensionele vektore. Die from_texts-funksie omskep stukke tekste in vektore (vanaf stap 3) en stoor dit in die FAISS vektorstoor. FAISS help jou om stukke soortgelyk aan jou navraag te vind deur vektorafstande (kosinus, euklidies) op 'n hoogs geoptimaliseerde manier te vergelyk.
# Step 4: Create a FAISS vector store using all chunks vector_store = FAISS.from_texts(all_chunks, embeddings)
Stap 5: Ons inisialiseer Ollama LLM, wat antwoorde sal genereer of navrae sal verwerk gebaseer op die kennis wat in inbeddings in die FAISS-vektorstoor vanaf stap 4 gestoor is.
# Step 5: Initialize the Ollama LLM llm = Ollama(model="llama2", temperature=0.3)
Saam aktiveer stappe 3-5 JOOL, waar die LLM kennis uit gestoorde stukke in die vektorstoor kan trek en die herwinte konteks kan gebruik om 'n gebruiker se navraag op die mees relevante manier te beantwoord.
Stap 6: Hier definieer ons die ask_question_with_fallback funksie om die gestoorde kennis navraag te doen om 'n gebruiker se navraag te beantwoord. Maar as dit nie soortgelyke dokumente kan vind nie of die ooreenkomstelling laag is, sal dit terugval na die algemene kennis van die onderliggende LLM (Ollama hier).
# Step 6: Create the question-answering function def ask_question_with_fallback(query): # Retrieve relevant documents docs = vector_store.similarity_search(query, k=3) docs = vector_store.similarity_search(query, k=3) for doc in docs: print(f"Retrieved doc: {doc.page_content[:200]}") # If no relevant documents or low similarity, use general knowledge #if not docs or all(doc.metadata.get('score', 1.0) < 0.3 for doc in docs): # return use_general_knowledge(query) if not docs: return use_general_knowledge(query) # Format retrieved documents as context context = "\n\n".join([doc.page_content for doc in docs]) # Construct RAG prompt rag_prompt = f""" Use the following pieces of context to answer the question at the end. If you don't know the answer based on this context, respond with "NO_ANSWER_FOUND". Context: {context} Question: {query} Provide a direct and concise answer to the question based only on the context above: """ rag_answer = llm(rag_prompt) # Check for fallback trigger if "NO_ANSWER_FOUND" in rag_answer or "don't know" in rag_answer.lower() or "cannot find" in rag_answer.lower(): return use_general_knowledge(query) return { "answer": rag_answer, "source": "URL content", "source_documents": docs }
Stap 7: Dit is die terugvalfunksie. Indien geen relevante dokumente in stap 6 opgespoor kon word nie, gebruik die LLM sy algemene kennis om die gebruiker se navraag te beantwoord.
# Step 7: Define fallback general knowledge function def use_general_knowledge(query): general_prompt = f""" Answer this question using your general knowledge: {query} Provide a direct and helpful response. If you don't know, simply say so. """ general_answer = llm(general_prompt) return { "answer": general_answer, "source": "General knowledge", "source_documents": [] }
Stap 8: Hierdie stap wys 'n voorbeeld van hoe om hierdie JOOL-meganisme te gebruik. Jy verskaf 'n navraag aan die model, en LLM gebruik eksterne of interne kennis om jou navraag te beantwoord.
#Step 8 # Example usage query = "What is the hardest part about managing diabetes?" # Replace with your actual question result = ask_question_with_fallback(query) # Display results print("Answer:") print(result["answer"]) print(f"\nSource: {result['source']}") if result["source_documents"]: print("\nSource Documents:") for i, doc in enumerate(result["source_documents"]): print(f"Source {i+1}:") print(doc.page_content[:200] + "...") # Print first 200 chars of each source print()
My uitset van Stap 8 is hieronder. Die model gebruik JOOL, wat 'n soortgelyke dokument van die FAISS-winkel identifiseer en my navraag beantwoord.
Ten slotte, die gebruik van JOOL met URL's is 'n kragtige benadering vir verbeterde kennisherwinning in diabetesverwante navrae. Deur werklike insigte van gemeenskapsplatforms soos Reddit bo-op oopbron-LLM'e te kombineer, kan ons persoonlike en akkurate inligting bied - immers, wie verstaan dit beter as diegene wat elke dag daarmee saamleef?
Hierdie metode is nie net koste-effektief nie, maar bevorder ook samewerking, wat uiteindelik ondersteuning vir individue wat diabetes bestuur, verbeter. Namate KI voortgaan om te ontwikkel, bly die potensiaal daarvan om gesondheidsorg en welstand te verbeter groot.
Kenmerkfoto deur Suzy Hazelwood: https://www.pexels.com/photo/close-up-photo-of-sugar-cubes-in-glass-jar-2523650/