Доработка: 1. Завершить vectorstore.py: реализовать load_documents (чан
This commit is contained in:
@@ -1,12 +1,10 @@
|
|||||||
import os
|
import os
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from langchain_ollama import OllamaLLM, OllamaEmbeddings
|
from langchain_ollama import OllamaLLM
|
||||||
from langchain_chroma import Chroma
|
|
||||||
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
|
||||||
from langchain_community.document_loaders import DirectoryLoader, TextLoader, UnstructuredMarkdownLoader
|
|
||||||
from langchain.tools import Tool
|
|
||||||
from langchain_community.tools.tavily_search import TavilySearchResults
|
|
||||||
from langchain.agents import initialize_agent, AgentType
|
from langchain.agents import initialize_agent, AgentType
|
||||||
|
from langchain_community.tools.tavily_search import TavilySearchResults
|
||||||
|
from langchain.tools import tool
|
||||||
|
from vectorstore import get_vectorstore
|
||||||
|
|
||||||
# Load environment variables
|
# Load environment variables
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
@@ -20,74 +18,25 @@ DOCUMENTS_DIR = "./documents"
|
|||||||
EMBEDDING_MODEL = "nomic-embed-text"
|
EMBEDDING_MODEL = "nomic-embed-text"
|
||||||
LLM_MODEL = "llama3"
|
LLM_MODEL = "llama3"
|
||||||
|
|
||||||
def setup_vectorstore():
|
# Initialize or load vectorstore
|
||||||
"""Initialize or load ChromaDB vectorstore with Ollama embeddings."""
|
vectorstore = get_vectorstore()
|
||||||
embeddings = OllamaEmbeddings(model=EMBEDDING_MODEL)
|
|
||||||
|
|
||||||
if os.path.exists(PERSIST_DIRECTORY) and os.listdir(PERSIST_DIRECTORY):
|
|
||||||
vectorstore = Chroma(
|
|
||||||
persist_directory=PERSIST_DIRECTORY,
|
|
||||||
embedding_function=embeddings
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
# Load and process documents
|
|
||||||
loader = DirectoryLoader(
|
|
||||||
DOCUMENTS_DIR,
|
|
||||||
glob="**/*",
|
|
||||||
loader_cls=lambda path: TextLoader(path, encoding="utf-8") if path.endswith(".txt")
|
|
||||||
else UnstructuredMarkdownLoader(path) if path.endswith(".md")
|
|
||||||
else None,
|
|
||||||
show_progress=True,
|
|
||||||
use_multithreading=True
|
|
||||||
)
|
|
||||||
documents = loader.load()
|
|
||||||
|
|
||||||
text_splitter = RecursiveCharacterTextSplitter(
|
|
||||||
chunk_size=1000,
|
|
||||||
chunk_overlap=200,
|
|
||||||
length_function=len
|
|
||||||
)
|
|
||||||
texts = text_splitter.split_documents(documents)
|
|
||||||
|
|
||||||
vectorstore = Chroma.from_documents(
|
|
||||||
documents=texts,
|
|
||||||
embedding=embeddings,
|
|
||||||
persist_directory=PERSIST_DIRECTORY
|
|
||||||
)
|
|
||||||
vectorstore.persist()
|
|
||||||
|
|
||||||
return vectorstore
|
|
||||||
|
|
||||||
# Initialize vectorstore
|
|
||||||
vectorstore = setup_vectorstore()
|
|
||||||
|
|
||||||
# Define tools
|
# Define tools
|
||||||
|
@tool
|
||||||
def search_local_kb(query: str) -> str:
|
def search_local_kb(query: str) -> str:
|
||||||
"""Search local knowledge base using ChromaDB."""
|
"""Search local knowledge base using ChromaDB."""
|
||||||
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
|
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
|
||||||
docs = retriever.get_relevant_documents(query)
|
docs = retriever.get_relevant_documents(query)
|
||||||
return "\n\n".join([doc.page_content for doc in docs])
|
return "\n\n".join([doc.page_content for doc in docs])
|
||||||
|
|
||||||
|
@tool
|
||||||
def web_search(query: str) -> str:
|
def web_search(query: str) -> str:
|
||||||
"""Search the web using Tavily."""
|
"""Search the web using Tavily."""
|
||||||
search = TavilySearchResults(tavily_api_key=TAVILY_API_KEY, max_results=3)
|
search = TavilySearchResults(tavily_api_key=TAVILY_API_KEY, max_results=3)
|
||||||
results = search.run(query)
|
results = search.run(query)
|
||||||
return "\n\n".join([result["content"] for result in results])
|
return "\n\n".join([result["content"] for result in results])
|
||||||
|
|
||||||
# Create LangChain tools
|
tools = [search_local_kb, web_search]
|
||||||
local_tool = Tool(
|
|
||||||
name="search_local_kb",
|
|
||||||
func=search_local_kb,
|
|
||||||
description="Useful for answering questions about local documents stored in the knowledge base."
|
|
||||||
)
|
|
||||||
|
|
||||||
web_tool = Tool(
|
|
||||||
name="web_search",
|
|
||||||
func=web_search,
|
|
||||||
description="Useful for answering questions about current events, news, or general knowledge from the internet."
|
|
||||||
)
|
|
||||||
|
|
||||||
tools = [local_tool, web_tool]
|
|
||||||
|
|
||||||
# Initialize LLM
|
# Initialize LLM
|
||||||
llm = OllamaLLM(model=LLM_MODEL)
|
llm = OllamaLLM(model=LLM_MODEL)
|
||||||
|
|||||||
Reference in New Issue
Block a user