====== Tavily Search ======
🗂️ [[start|Terug naar start]]
===== Wat is Tavily =====
[[https://tavily.com/|Tavily]] is een zoekmachine die is geoptimaliseerd voor LLMs en RAG. Het is ontworpen om efficiënte, snelle en persistente zoekresultaten te leveren.
Tavily kan ook worden gebruikt om LLMs te helpen bij het genereren van tekst. Dit kan worden gedaan door Tavily te gebruiken om informatie te vinden die de LLM kan gebruiken om zijn antwoord te formuleren.
Hier zijn enkele voorbeelden van hoe Tavily kan worden gebruikt met LangChain:
* **Zoek naar informatie op het web:** Je kunt Tavily gebruiken om informatie te vinden over een bepaald onderwerp. Bijvoorbeeld, je kunt Tavily vragen om informatie te vinden over de geschiedenis van de Verenigde Staten.
* **Zoek naar informatie in je eigen documenten:** Je kunt Tavily gebruiken om informatie te vinden in je eigen documenten. Bijvoorbeeld, je kunt Tavily vragen om informatie te vinden over een bepaald project waar je aan werkt.
* **Zoek naar informatie in je e-mails:** Je kunt Tavily gebruiken om informatie te vinden in je e-mails. Bijvoorbeeld, je kunt Tavily vragen om informatie te vinden over een bepaalde e-mail die je hebt ontvangen.
* **Zoek naar informatie in je notities:** Je kunt Tavily gebruiken om informatie te vinden in je notities. Bijvoorbeeld, je kunt Tavily vragen om informatie te vinden over een bepaald onderwerp dat je hebt genoteerd.
* **Gebruik Tavily om LLMs te helpen bij het genereren van tekst:** Je kunt Tavily gebruiken om informatie te vinden die de LLM kan gebruiken om zijn antwoord te formuleren. Bijvoorbeeld, je kunt Tavily vragen om informatie te vinden over een bepaald onderwerp en vervolgens de LLM vragen om een samenvatting van die informatie te schrijven.
Tavily is een krachtig hulpmiddel dat kan worden gebruikt om LLMs te helpen bij het genereren van tekst. Het kan ook worden gebruikt om informatie te vinden op het web, in je eigen documenten, in je e-mails en in je notities.
===== Links =====
[[https://tavily.com/|Tavily Home]]\\
[[https://docs.tavily.com/docs/python-sdk/tavily-search/getting-started|Tavily documentatie (Tavily)]]\\
[[https://docs.tavily.com/docs/python-sdk/tavily-extract/getting-started|Tavily Extract van opgegeven URLs (Tavily)]]\\
[[https://docs.tavily.com/docs/python-sdk/tavily-search/examples|Tavily Voorbeelden]]\\
[[https://python.langchain.com/docs/integrations/retrievers/tavily/|LangChain: TavilySearchAPIRetriever]]\\
[[https://python.langchain.com/docs/integrations/tools/tavily_search/|LangChain: Tavily Search]]\\
[[https://python.langchain.com/api_reference/community/retrievers/langchain_community.retrievers.tavily_search_api.TavilySearchAPIRetriever.html|LangChain: Tavily API reference]]
----
===== Voorbeeld gebruik Tavily =====
Hieronder een Python Class met 4 verschillende manieren om Tavily search te gebruiken in Python. Tavily is niet gratis maar er is wel een gratis account waarbij je 1000 verzoeken per maand kunt doen. Dit zou genoeg moeten zijn om te testen. Je hebt een Tavily Api-key nodig:
[[https://app.tavily.com/home|Maak hier je API-Key aan]]
Installeer Tavily voor Python //(De integratie leeft in het langchain-community pakket. Maar we moeten ook het tavily-python pakket installeren.)//
pip install langchain-community
pip install tavily-python
🔸 Boven iedere functie //(methode)// is in het commentaar te vinden waar de bron te vinden is //(URL)// met meer informatie over de gebruikte methode\\
🔸 De "tavilyKaal" methode is de basis methode om Tavily te gebruiken in Python zonder toeters en bellen\\
🔸 De "tavilyLangChainNoChain" methode gebruikt Tavilt in de vorm van een retriever zonder daar verder iets mee te doen\\
🔸 De "tavilyLangChainWithChain" methode is hetzelfde als de "tavilyLangChainNoChain" maar in een chain en deze methode genereerd een antwoord met behulp van een LLM\\
🔸 De "tavilyLangChainNoChain" methode steld Tavily als Tool in. Dit is de basis versie welke nog verder uitgewerkt [[https://python.langchain.com/docs/integrations/tools/tavily_search/|is/wordt op deze pagina]]
💡 **Note:** bij zowel de "TavilySearchAPIRetriever" als bij de "TavilySearchResults" methode kunnen URL's worden opgegeven die doorzocht dienen te worden d.m.v. de "include_domains" parameter
from tavily import TavilyClient
from langchain_community.retrievers import TavilySearchAPIRetriever
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
import os
# test diverse zoekmethoden
class Test_2:
def __init__(self):
os.environ["TAVILY_API_KEY"] = st.secrets["TAVILY_API_KEY"]
#https://docs.tavily.com/docs/python-sdk/tavily-search/examples
def tavilyKaal(self, user_query):
client = TavilyClient()
antw = client.search(user_query)
return antw
# TavilySearchAPIRetriever =======================================
# https://python.langchain.com/docs/integrations/retrievers/tavily/
def tavilyLangChainNoChain(self, user_query):
retriever = TavilySearchAPIRetriever(k=3)
antw = retriever.invoke(user_query)
return antw
# https://python.langchain.com/docs/integrations/retrievers/tavily/
def tavilyLangChainWithChain(self, user_query):
retriever = TavilySearchAPIRetriever(k=3)
prompt = ChatPromptTemplate.from_template(
"""Beantwoord de vraag alleen op basis van de gegeven context.
Context: {context}
Question: {question}"""
)
llm = ChatOpenAI(model="gpt-4o-mini")
chain = (
{"context": retriever | self.format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
antw = chain.invoke(user_query)
return antw
# ALS TOOL: TavilySearchResults ==================================
# https://python.langchain.com/docs/integrations/tools/tavily_search/
def tavilyLangChainAlsTool(self, user_query):
tool = TavilySearchResults(
max_results=3,
search_depth="advanced",
include_answer=True,
include_raw_content=True,
include_images=True,
# include_domains=[...],
# exclude_domains=[...],
# name="...", # overwrite default tool name
# description="...", # overwrite default tool description
# args_schema=..., # overwrite default args_schema: BaseModel
)
antw = tool.invoke({"query": user_query})
return antw
# WERKERS ========================================================
def format_docs(self, docs):
return "\n\n".join(doc.page_content for doc in docs)
----
===== ✨ Tavily doorzoekt opgegeven websites =====
from langchain_community.retrievers import TavilySearchAPIRetriever
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
import os
import streamlit as st
import requests # nodig voor foutafhandeling
class Test_2:
def __init__(self):
os.environ["TAVILY_API_KEY"] = st.secrets["TAVILY_API_KEY"]
# https://python.langchain.com/docs/integrations/retrievers/tavily/
def tavilyLangChainWithChain(self, vraag):
try:
retriever = TavilySearchAPIRetriever(
k=3,
include_domains=[
"kwaliteitsysteem.nl/kennisbank",
"catcollectief.nl",
"catvergoedbaar.nl",
"kwaliteitstherapeuten.nl",
"batverzekeringen.nl",
"gatgeschillen.nl",
"gatregisteropleidingen.nl/",
],
)
prompt = ChatPromptTemplate.from_template(
"""Beantwoord de vraag alleen op basis van de gegeven context.
Context: {context}
Question: {question}"""
)
llm = ChatOpenAI(model="gpt-4o-mini")
chain = (
{"context": retriever | self.format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
antw = chain.invoke(vraag)
return antw
except requests.exceptions.HTTPError as e:
print(f"Er is een HTTPError opgetreden: {e}")
return "Er is een fout opgetreden: Invoer moet minimaal uit twee woorden bestaan!"
# WERKER ========================================================
def format_docs(self, docs):
return "\n\n".join(doc.page_content for doc in docs)
----