Salut tout le monde!
La génération augmentée de récupération (RAG) est l'une des applications les plus courantes développées à l'aide de différents LLM. Nous avons déjà exploré comment développer un RAG en utilisant langchain . Dans cet article, nous allons créer un RAG à l'aide du noyau sémantique de Microsoft .
Pour suivre, vous aurez besoin de l’API Open AI.
La première étape consiste à initialiser le noyau sémantique et à lui indiquer que nous souhaitons utiliser la complétion de discussion d'Open AI et le modèle d'intégration d'Open AI que nous utiliserons plus tard pour créer des intégrations. Nous indiquerons également au noyau que nous souhaitons utiliser une mémoire stockée qui sera Chroma DB dans notre cas. Notez que nous indiquons également au noyau que cette mémoire doit être persistante.
kernel = sk.Kernel() kernel.add_text_completion_service("openai", OpenAIChatCompletion("gpt-4",api_key)) kernel.add_text_embedding_generation_service("openai-embedding", OpenAITextEmbedding("text-embedding-ada-002", api_key)) # chrome db kernel.register_memory_store(memory_store=ChromaMemoryStore(persist_directory='mymemories2')) print("Made two new services attached to the kernel and made a Chroma memory store that's persistent.")
Dans cet exemple, nous créons un RAG qui peut répondre aux questions sur une analyse SWOT que nous avons créée pour une entreprise de pizza. Donc, pour ce faire, nous prenons l'analyse SWOT, obtenons les intégrations correspondantes et stockons les intégrations correspondantes dans une collection appelée « SWOT » dans la banque de données persistante que nous avons créée à la dernière étape.
strength_questions = ["What unique recipes or ingredients does the pizza shop use?","What are the skills and experience of the staff?","Does the pizza shop have a strong reputation in the local area?","Are there any unique features of the shop or its location that attract customers?", "Does the pizza shop have a strong reputation in the local area?", "Are there any unique features of the shop or its location that attract customers?"] weakness_questions = ["What are the operational challenges of the pizza shop? (eg, slow service, high staff turnover)","Are there financial constraints that limit growth or improvements?","Are there any gaps in the product offering?","Are there customer complaints or negative reviews that need to be addressed?"] opportunities_questions = ["Is there potential for new products or services (eg, catering, delivery)?","Are there under-served customer segments or market areas?","Can new technologies or systems enhance the business operations?","Are there partnerships or local events that can be leveraged for marketing?"] threats_questions = ["Who are the major competitors and what are they offering?","Are there potential negative impacts due to changes in the local area (eg, construction, closure of nearby businesses)?","Are there economic or industry trends that could impact the business negatively (eg, increased ingredient costs)?","Is there any risk due to changes in regulations or legislation (eg, health and safety, employment)?"] strengths = [ "Unique garlic pizza recipe that wins top awards","Owner trained in Sicily at some of the best pizzerias","Strong local reputation","Prime location on university campus" ] weaknesses = [ "High staff turnover","Floods in the area damaged the seating areas that are in need of repair","Absence of popular calzones from menu","Negative reviews from younger demographic for lack of hip ingredients" ] opportunities = [ "Untapped catering potential","Growing local tech startup community","Unexplored online presence and order capabilities","Upcoming annual food fair" ] threats = [ "Competition from cheaper pizza businesses nearby","There's nearby street construction that will impact foot traffic","Rising cost of cheese will increase the cost of pizzas","No immediate local regulatory changes but it's election season" ] print("✅ SWOT analysis for the pizza shop is resident in native memory") memoryCollectionName = "SWOT" # lets put these in memory / vector store async def run_storeinmemory_async(): for i in range(len(strengths)): await kernel.memory.save_information_async(memoryCollectionName, id=f"strength-{i}", text=f"Internal business strength (S in SWOT) that makes customers happy and satisfied Q&A: Q: {strength_questions[i]} A: {strengths[i]}") for i in range(len(weaknesses)): await kernel.memory.save_information_async(memoryCollectionName, id=f"weakness-{i}", text=f"Internal business weakness (W in SWOT) that makes customers unhappy and dissatisfied Q&A: Q: {weakness_questions[i]} A: {weaknesses[i]}") for i in range(len(opportunities)): await kernel.memory.save_information_async(memoryCollectionName, id=f"opportunity-{i}", text=f"External opportunity (O in SWOT) for the business to gain entirely new customers Q&A: Q: {opportunities_questions[i]} A: {opportunities[i]}") for i in range(len(threats)): await kernel.memory.save_information_async(memoryCollectionName, id=f"threat-{i}", text=f"External threat (T in SWOT) to the business that impacts its survival Q&A: Q: {threats_questions[i]} A: {threats[i]}") asyncio.run(run_storeinmemory_async()) print("😶🌫️ Embeddings for SWOT have been generated and stored in vector db")
Maintenant que nous avons les intégrations de nos données stockées dans le magasin de vecteurs Chrome, nous pouvons poser des questions liées au secteur de la pizza et obtenir une réponse.
#ask questions on swot potential_question = "What are the easiest ways to make more money?" counter = 0 async def run_askquestions_async(): memories = await kernel.memory.search_async(memoryCollectionName, potential_question, limit=5, min_relevance_score=0.5) display(f"### ❓ Potential question: {potential_question}") for memory in memories: if counter == 0: related_memory = memory.text counter += 1 print(f" > 🧲 Similarity result {counter}:\n >> ID: {memory.id}\n Text: {memory.text} Relevance: {memory.relevance}\n") asyncio.run(run_askquestions_async())
Il s'agit d'une version extrêmement simplifiée de la façon dont un RAG peut être créé à l'aide du noyau sémantique. Le choix de framework le plus populaire à construire actuellement à l'aide de LLM est langchain et nous avons déjà vu comment créer un RAG à l'aide de langchain. Bien que Langchain soit plus populaire à mesure que de plus en plus d'entreprises créent des outils, il y aura des outils plus sophistiqués et j'ai découvert que Semantic Kernel possède quelques fonctionnalités spéciales qui le distinguent.
C'est tout pour le jour 18 des 100 jours d'IA.
J'écris une newsletter intitulée Above Average dans laquelle je parle des idées de second ordre derrière tout ce qui se passe dans la grande technologie. Si vous êtes dans la technologie et que vous ne voulez pas être dans la moyenne, abonnez-vous .
Suivez-moi sur Twitter , LinkedIn ou HackerNoon pour les dernières mises à jour sur 100 jours d'IA ou ajoutez cette page à vos favoris . Si vous êtes dans le domaine de la technologie, vous pourriez être intéressé à rejoindre ma communauté de professionnels de la technologie ici .