{"id":92,"date":"2025-04-18T08:14:00","date_gmt":"2025-04-18T08:14:00","guid":{"rendered":"https:\/\/ia-ai.se\/dev\/?p=92"},"modified":"2025-04-24T08:35:16","modified_gmt":"2025-04-24T08:35:16","slug":"hur-bygger-jag-en-egen-chattbot-med-rag","status":"publish","type":"post","link":"https:\/\/ia-ai.se\/dev\/2025\/04\/18\/hur-bygger-jag-en-egen-chattbot-med-rag\/","title":{"rendered":"Hur bygger jag en chattbot?"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Bygg din egen chattbot med Ollama och LangChain<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Att bygga en chattbot kan verka som en stor utmaning, men med r\u00e4tt verktyg och lite v\u00e4gledning kan du skapa en kraftfull och anv\u00e4ndbar bott. I den h\u00e4r guiden kommer vi att anv\u00e4nda Ollama och LangChain f\u00f6r att bygga en RAG assistent som kan h\u00e4mta och bearbeta information fr\u00e5n en webbshop.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Verktyg och installation<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6r att komma ig\u00e5ng beh\u00f6ver vi n\u00e5gra verktyg och bibliotek. H\u00e4r \u00e4r vad vi kommer att anv\u00e4nda:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Scrapy<\/strong>: Ett kraftfullt ramverk f\u00f6r att extrahera data fr\u00e5n webbplatser.<\/li>\n\n\n\n<li><strong>MySQL<\/strong>: En databas f\u00f6r att lagra webbsidor och deras inneh\u00e5ll.<\/li>\n\n\n\n<li><strong>LangChain<\/strong>: Ett bibliotek f\u00f6r att hantera dokument och embeddings.<\/li>\n\n\n\n<li><strong>Ollama<\/strong>: F\u00f6r att skapa embeddings och hantera chattmodeller.<\/li>\n\n\n\n<li><strong>ChromaDB<\/strong>: F\u00f6r att lagra och h\u00e4mta embeddings.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Steg 1: Ladda ner inneh\u00e5ll fr\u00e5n en webbsida<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Vi b\u00f6rjar med att skapa en Scrapy-spindel f\u00f6r att h\u00e4mta inneh\u00e5ll fr\u00e5n en webbsida. H\u00e4r \u00e4r en enkel spindel som laddar ner sidor fr\u00e5n en specifik dom\u00e4n och sparar dem i en MySQL-databas.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class MySpider(scrapy.Spider):\n    name = \"site\"\n    start_urls = &#91;\"https:\/\/din-butik.se\/\"]\n    allowed_domains = &#91;\"din-butik.se\"]\n\n    def parse(self, response):\n        url = response.url\n        text = BeautifulSoup(response.text, 'html.parser').get_text(separator=' ', strip=True)\n        self.save_page(url, text)\n\n        links = response.css('a::attr(href)').getall()\n        for link in links:\n            if link.startswith('\/') or self.allowed_domains&#91;0] in link:\n                yield response.follow(link, callback=self.parse)<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Steg 2: Skapa vektordatabas<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Efter att vi har h\u00e4mtat inneh\u00e5llet fr\u00e5n webbsidorna, beh\u00f6ver vi skapa en vektordatabas med hj\u00e4lp av LangChain. Detta g\u00f6r vi genom att dela upp texten i mindre delar och skapa embeddings.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>documents = &#91;Document(page_content=row&#91;\"html\"], metadata={\"source\": row&#91;\"url\"]}) for row in rows]\ntext_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=0)\nall_splits = text_splitter.split_documents(documents)\n\nvectorstore = Chroma.from_documents(\n    documents=all_splits,\n    embedding=OllamaEmbeddings(),\n    persist_directory=\".\/chroma_db\"\n)<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Steg 3: Hantera fr\u00e5gor och svar<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Nu n\u00e4r vi har v\u00e5r vektordatabas, kan vi anv\u00e4nda den f\u00f6r att hantera fr\u00e5gor. Vi anv\u00e4nder en RAG-modell f\u00f6r att generera svar baserat p\u00e5 den information vi har samlat in.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RAG_TEMPLATE = \"\"\"\nDu \u00e4r en s\u00e4ljare f\u00f6r v\u00e5r webbutik. Anv\u00e4nd endast informationen fr\u00e5n &lt;RAG_information&gt; och &lt;history&gt; f\u00f6r att svara.\n&lt;RAG_information&gt;{context}&lt;\/RAG_information&gt;\n&lt;history&gt;{context}&lt;\/history&gt;\nSvara p\u00e5 f\u00f6rljande fr\u00e5ga: {question}\"\"\"\n\nrag_prompt = ChatPromptTemplate.from_template(RAG_TEMPLATE)\n\nchain = (\n    RunnablePassthrough.assign(context=lambda input: format_docs(input&#91;\"context\"]))\n    | rag_prompt\n    | ChatOllama(model=\"llama3.2:latest\")\n    | StrOutputParser()\n)\n\nquestion = \"Har du n\u00e5gonting med gurkmeja?\"\ndocs = vectorstore.similarity_search(question, k=10)\nresponse = chain.run({\"context\": docs, \"question\": question})\nprint(response)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Och d\u00e4r har du det! Din egen chattbot som kan h\u00e4mta och bearbeta information fr\u00e5n webbsidor. Genom att anv\u00e4nda Ollama och LangChain har vi skapat en kraftfull l\u00f6sning f\u00f6r att hantera fr\u00e5gor och ge relevanta svar. Lycka till med ditt projekt!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bygg din egen chattbot med Ollama och LangChain Att bygga en chattbot kan verka som en stor utmaning, men med r\u00e4tt verktyg och lite v\u00e4gledning kan du skapa en kraftfull och anv\u00e4ndbar bott. I den h\u00e4r guiden kommer vi att anv\u00e4nda Ollama och LangChain f\u00f6r att bygga en RAG assistent som kan h\u00e4mta och bearbeta [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-92","post","type-post","status-publish","format-standard","hentry","category-ia-ai"],"_links":{"self":[{"href":"https:\/\/ia-ai.se\/dev\/wp-json\/wp\/v2\/posts\/92","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ia-ai.se\/dev\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ia-ai.se\/dev\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ia-ai.se\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ia-ai.se\/dev\/wp-json\/wp\/v2\/comments?post=92"}],"version-history":[{"count":4,"href":"https:\/\/ia-ai.se\/dev\/wp-json\/wp\/v2\/posts\/92\/revisions"}],"predecessor-version":[{"id":114,"href":"https:\/\/ia-ai.se\/dev\/wp-json\/wp\/v2\/posts\/92\/revisions\/114"}],"wp:attachment":[{"href":"https:\/\/ia-ai.se\/dev\/wp-json\/wp\/v2\/media?parent=92"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ia-ai.se\/dev\/wp-json\/wp\/v2\/categories?post=92"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ia-ai.se\/dev\/wp-json\/wp\/v2\/tags?post=92"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}