Bygg din egen chattbot med Ollama och LangChain
Att bygga en chattbot kan verka som en stor utmaning, men med rätt verktyg och lite vägledning kan du skapa en kraftfull och användbar bott. I den här guiden kommer vi att använda Ollama och LangChain för att bygga en RAG assistent som kan hämta och bearbeta information från en webbshop.
Verktyg och installation
För att komma igång behöver vi några verktyg och bibliotek. Här är vad vi kommer att använda:
- Scrapy: Ett kraftfullt ramverk för att extrahera data från webbplatser.
- MySQL: En databas för att lagra webbsidor och deras innehåll.
- LangChain: Ett bibliotek för att hantera dokument och embeddings.
- Ollama: För att skapa embeddings och hantera chattmodeller.
- ChromaDB: För att lagra och hämta embeddings.
Steg 1: Ladda ner innehåll från en webbsida
Vi börjar med att skapa en Scrapy-spindel för att hämta innehåll från en webbsida. Här är en enkel spindel som laddar ner sidor från en specifik domän och sparar dem i en MySQL-databas.
class MySpider(scrapy.Spider):
name = "site"
start_urls = ["https://din-butik.se/"]
allowed_domains = ["din-butik.se"]
def parse(self, response):
url = response.url
text = BeautifulSoup(response.text, 'html.parser').get_text(separator=' ', strip=True)
self.save_page(url, text)
links = response.css('a::attr(href)').getall()
for link in links:
if link.startswith('/') or self.allowed_domains[0] in link:
yield response.follow(link, callback=self.parse)
Steg 2: Skapa vektordatabas
Efter att vi har hämtat innehållet från webbsidorna, behöver vi skapa en vektordatabas med hjälp av LangChain. Detta gör vi genom att dela upp texten i mindre delar och skapa embeddings.
documents = [Document(page_content=row["html"], metadata={"source": row["url"]}) for row in rows]
text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=0)
all_splits = text_splitter.split_documents(documents)
vectorstore = Chroma.from_documents(
documents=all_splits,
embedding=OllamaEmbeddings(),
persist_directory="./chroma_db"
)
Steg 3: Hantera frågor och svar
Nu när vi har vår vektordatabas, kan vi använda den för att hantera frågor. Vi använder en RAG-modell för att generera svar baserat på den information vi har samlat in.
RAG_TEMPLATE = """
Du är en säljare för vår webbutik. Använd endast informationen från <RAG_information> och <history> för att svara.
<RAG_information>{context}</RAG_information>
<history>{context}</history>
Svara på förljande fråga: {question}"""
rag_prompt = ChatPromptTemplate.from_template(RAG_TEMPLATE)
chain = (
RunnablePassthrough.assign(context=lambda input: format_docs(input["context"]))
| rag_prompt
| ChatOllama(model="llama3.2:latest")
| StrOutputParser()
)
question = "Har du någonting med gurkmeja?"
docs = vectorstore.similarity_search(question, k=10)
response = chain.run({"context": docs, "question": question})
print(response)
Och där har du det! Din egen chattbot som kan hämta och bearbeta information från webbsidor. Genom att använda Ollama och LangChain har vi skapat en kraftfull lösning för att hantera frågor och ge relevanta svar. Lycka till med ditt projekt!
