Spaces:
Sleeping
Sleeping
import os | |
import shutil | |
os.environ["COHERE_API_KEY"] = "XmuSA1m4EJwHAvjzM5FqRRWKZcmbZVmUlQgztaUJ" | |
from dotenv import load_dotenv | |
from langchain.chains import ConversationalRetrievalChain | |
from langchain.text_splitter import CharacterTextSplitter | |
from langchain_community.document_loaders import PyPDFLoader | |
from langchain_community.document_loaders import Docx2txtLoader | |
from langchain_community.document_loaders import UnstructuredPDFLoader | |
from langchain_community.document_loaders import TextLoader | |
from langchain_community.document_loaders import UnstructuredFileIOLoader | |
from langchain_community.document_loaders import UnstructuredPowerPointLoader | |
from langchain_community.document_loaders import UnstructuredCSVLoader | |
from langchain_community.document_loaders import UnstructuredExcelLoader | |
from langchain_community.document_loaders import UnstructuredMarkdownLoader | |
from langchain_community.document_loaders import JSONLoader | |
from langchain_community.vectorstores import Chroma | |
from langchain_community.document_loaders.csv_loader import CSVLoader | |
from langchain_openai import ChatOpenAI | |
from langchain_openai import OpenAIEmbeddings | |
from langchain_community.document_loaders import UnstructuredXMLLoader | |
from langchain_community.document_loaders import UnstructuredHTMLLoader | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
from langchain.chains import RetrievalQA | |
import os | |
import google.generativeai as genai | |
import re | |
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever | |
from langchain_cohere import CohereRerank | |
from langchain_community.llms import Cohere | |
import pandas as pd | |
import json | |
def process_json_file(file_path): | |
""" | |
Hàm này đọc một file JSON và xử lý các loại JSON khác nhau trong đó. | |
Trả về một list chứa tất cả các đối tượng JSON trong file. | |
""" | |
json_data = [] | |
with open(file_path, 'r') as file: | |
for line in file: | |
try: | |
data = json.loads(line) | |
json_data.append(data) | |
except json.JSONDecodeError: | |
try: | |
data = json.loads(line[:-1]) | |
json_data.append(data) | |
except json.JSONDecodeError as e: | |
print(f"Error decoding JSON: {e}") | |
return json_data | |
from groq import Groq | |
client = Groq( | |
api_key="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", | |
) | |
# Cấu hình Google API | |
os.environ["COHERE_API_KEY"] = "6H7ZPI4aDoGFcELYJ0KLdVYTqcbzN4wvvUcIBSLl" | |
genai.configure(api_key="AIzaSyB3j7vAOJBL4MnWPk8VJJM1Yg33YTZEBv0") | |
os.environ["GOOGLE_API_KEY"] = "AIzaSyB3j7vAOJBL4MnWPk8VJJM1Yg33YTZEBv0" | |
# Mô hình embedding | |
from langchain_google_genai import GoogleGenerativeAIEmbeddings | |
embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001") | |
def extract_file_names(text): | |
# Sử dụng biểu thức chính quy để tìm các cụm từ kết hợp có dạng "tênfile.đuôifile" | |
file_names = re.findall(r'\b(\w+\.\w+)\b', text) | |
return file_names | |
def extract_multi_metadata_content(texts, tests): | |
extracted_content = "" | |
for idx, test in enumerate(tests): | |
temp_content = "" | |
for x in texts: | |
metadata_lower = x.metadata['source'].lower() # Chuyển nội dung metadata về dạng chữ thường | |
if any(term.lower() in metadata_lower for term in test.split()): # Kiểm tra từng phần của test trong metadata_lower | |
temp_content += x.page_content | |
if idx == 0: # Nếu là lần lặp đầu tiên | |
extracted_content += f"Dữ liệu của {test}:\n {temp_content}" | |
else: | |
extracted_content += "\n" + temp_content + "\n" | |
return extracted_content | |
def extract_filename(text): | |
# Tìm các từ tiếp theo sau "file" hoặc "tập tin" trong câu | |
matches = re.findall(r'\b(?:file|tập\s+tin)\s+(\w+)\b', text.lower()) | |
return matches | |
def extract_all_filenames_1(text): | |
all_filenames = [] | |
filenames_1 = extract_file_names(text) | |
filenames_2 = extract_filename(text) | |
all_filenames.extend(filenames_1) | |
all_filenames.extend(filenames_2) | |
return all_filenames | |
def extract_all_filenames(text): | |
# Sử dụng biểu thức chính quy để tìm các cụm từ kết hợp có dạng "tênfile.đuôifile" | |
file_names_1 = re.findall(r'\b(\w+)\.\w+\b', text) | |
# Tìm các từ tiếp theo sau "file" hoặc "tập tin" trong câu | |
file_names_2 = re.findall(r'\b(?:file|tập\s+tin)\s+(\w+)\b', text.lower()) | |
# Gộp danh sách các tên tệp lại thành một danh sách duy nhất | |
all_filenames = file_names_1 + file_names_2 | |
# Tạo một danh sách để lưu trữ các tên tệp duy nhất | |
unique_filenames = [] | |
seen_filenames = set() # Tập hợp để kiểm tra tên tệp đã xuất hiện | |
for filename in all_filenames: | |
lowercase_filename = filename.lower() | |
# Nếu tên tệp chưa xuất hiện trong tập hợp đã thấy, thêm vào danh sách duy nhất và tập hợp đã thấy | |
if lowercase_filename not in seen_filenames: | |
unique_filenames.append(filename) | |
seen_filenames.add(lowercase_filename) | |
return unique_filenames | |
def find_matching_files_in_docs(unique_filenames): | |
folder_path = "/code/temp" # Thay đổi đường dẫn tùy thuộc vào thư mục mà bạn lưu trữ các tệp | |
matching_files = [] | |
seen_filenames = set() # Tập hợp để kiểm tra các tên tệp đã xuất hiện | |
for filename in unique_filenames: | |
for root, dirs, files in os.walk(folder_path): | |
for file in files: | |
if filename.lower() in file.lower(): | |
if file.lower() not in seen_filenames: | |
matching_files.append(file) | |
seen_filenames.add(file.lower()) | |
break # Nếu tìm thấy một tệp trùng, chuyển sang tên tệp tiếp theo | |
return matching_files | |
def find_matching_files_in_docs_12_id(text,id): | |
folder_path = f"/code/temp/{id}" | |
# Tạo danh sách để lưu trữ các từ cần tra trong thư mục docs và trong câu truy vấn | |
search_terms = [] | |
search_terms_old = [] | |
matching_index = [] | |
search_origin = re.findall(r'\b\w+\.\w+\b|\b\w+\b', text) | |
# Tạo danh sách để lưu trữ các từ cần tìm kiếm, không tách các từ có đuôi file | |
search_terms_origin = [] | |
for word in search_origin: | |
# Kiểm tra xem từ có đuôi file không | |
if '.' in word: | |
search_terms_origin.append(word) | |
else: | |
# Nếu từ không có đuôi file, tách thành các từ riêng lẻ | |
search_terms_origin.extend(re.findall(r'\b\w+\b', word)) | |
# Tìm tất cả các cụm từ có dạng "tênfile.đuôifile" trong câu và thêm chúng vào danh sách tìm kiếm | |
file_names_with_extension = re.findall(r'\b\w+\.\w+\b|\b\w+\b', text.lower()) | |
file_names_with_extension_old = re.findall(r'\b(\w+\.\w+)\b', text) | |
for file_name in search_terms_origin: | |
# Kiểm tra xem tên tệp có chứa đuôi file không | |
if "." in file_name: | |
term_position = search_terms_origin.index(file_name) | |
search_terms_old.append(file_name) | |
for file_name in file_names_with_extension_old: | |
# Kiểm tra xem tên tệp có chứa đuôi file không | |
if "." in file_name: | |
search_terms_old.append(file_name) | |
for file_name in file_names_with_extension: | |
# Kiểm tra xem tên tệp có chứa đuôi file không | |
search_terms.append(file_name) | |
# Tạo biến tạm thời để lưu trữ câu truy vấn sau khi đã loại bỏ các từ tên file.đuôi file | |
clean_text_old = text | |
clean_text = text.lower() | |
for term in search_terms_old: | |
clean_text_old = clean_text_old.replace(term, '') | |
for term in search_terms: | |
clean_text = clean_text.replace(term, '') | |
# Tách câu đã xóa các từ tên file.đuôi file thành các từ riêng lẻ và thêm chúng vào danh sách tìm kiếm | |
words = re.findall(r'\b\w+\.\w+\b|\b\w+\b', text) | |
#search_terms.extend(words) | |
words_old = re.findall(r'\b\w+\b', clean_text_old) | |
search_terms_old.extend(words_old) | |
# Tạo danh sách để duy trì thứ tự của tệp và từ được tìm thấy | |
# Tạo tập hợp để lưu trữ các tệp trùng lặp (nếu có) | |
matching_files = set() | |
matching_files_old = set() | |
# Tìm các tệp trong thư mục "docs" mà có từ trong danh sách tìm kiếm | |
for root, dirs, files in os.walk(folder_path): | |
for file in files: | |
for term in search_terms: | |
if term.lower() in file.lower(): | |
term_position = search_terms.index(term) | |
term_value = search_terms_origin[term_position] | |
matching_files.add(file) | |
matching_index.append(term_position) | |
break # Dừng việc so sánh nếu đã tìm thấy tệp phù hợp | |
matching_files_old1 = [] | |
matching_index.sort() | |
for x in matching_index: | |
matching_files_old1.append(search_terms_origin[x]) | |
return matching_files,matching_files_old1 | |
def find_matching_files_in_docs_12(text): | |
# Thư mục "docs" | |
folder_path = "/code/temp" | |
# Tạo danh sách để lưu trữ các từ cần tra trong thư mục docs và trong câu truy vấn | |
search_terms = [] | |
search_terms_old = [] | |
matching_index = [] | |
search_origin = re.findall(r'\b\w+\.\w+\b|\b\w+\b', text) | |
# Tạo danh sách để lưu trữ các từ cần tìm kiếm, không tách các từ có đuôi file | |
search_terms_origin = [] | |
for word in search_origin: | |
# Kiểm tra xem từ có đuôi file không | |
if '.' in word: | |
search_terms_origin.append(word) | |
else: | |
# Nếu từ không có đuôi file, tách thành các từ riêng lẻ | |
search_terms_origin.extend(re.findall(r'\b\w+\b', word)) | |
# Tìm tất cả các cụm từ có dạng "tênfile.đuôifile" trong câu và thêm chúng vào danh sách tìm kiếm | |
file_names_with_extension = re.findall(r'\b\w+\.\w+\b|\b\w+\b', text.lower()) | |
file_names_with_extension_old = re.findall(r'\b(\w+\.\w+)\b', text) | |
for file_name in search_terms_origin: | |
# Kiểm tra xem tên tệp có chứa đuôi file không | |
if "." in file_name: | |
term_position = search_terms_origin.index(file_name) | |
search_terms_old.append(file_name) | |
for file_name in file_names_with_extension_old: | |
# Kiểm tra xem tên tệp có chứa đuôi file không | |
if "." in file_name: | |
search_terms_old.append(file_name) | |
for file_name in file_names_with_extension: | |
# Kiểm tra xem tên tệp có chứa đuôi file không | |
search_terms.append(file_name) | |
# Tạo biến tạm thời để lưu trữ câu truy vấn sau khi đã loại bỏ các từ tên file.đuôi file | |
clean_text_old = text | |
clean_text = text.lower() | |
for term in search_terms_old: | |
clean_text_old = clean_text_old.replace(term, '') | |
for term in search_terms: | |
clean_text = clean_text.replace(term, '') | |
# Tách câu đã xóa các từ tên file.đuôi file thành các từ riêng lẻ và thêm chúng vào danh sách tìm kiếm | |
words = re.findall(r'\b\w+\.\w+\b|\b\w+\b', text) | |
#search_terms.extend(words) | |
words_old = re.findall(r'\b\w+\b', clean_text_old) | |
search_terms_old.extend(words_old) | |
# Tạo danh sách để duy trì thứ tự của tệp và từ được tìm thấy | |
# Tạo tập hợp để lưu trữ các tệp trùng lặp (nếu có) | |
matching_files = set() | |
matching_files_old = set() | |
# Tìm các tệp trong thư mục "docs" mà có từ trong danh sách tìm kiếm | |
for root, dirs, files in os.walk(folder_path): | |
for file in files: | |
for term in search_terms: | |
if term.lower() in file.lower(): | |
term_position = search_terms.index(term) | |
term_value = search_terms_origin[term_position] | |
matching_files.add(file) | |
matching_index.append(term_position) | |
break # Dừng việc so sánh nếu đã tìm thấy tệp phù hợp | |
matching_files_old1 = [] | |
matching_index.sort() | |
for x in matching_index: | |
matching_files_old1.append(search_terms_origin[x]) | |
return matching_files,matching_files_old1 | |
def separate_csv_xlsx(files_list): | |
list_csv = [] | |
list_other = [] | |
for file in files_list: | |
if file.endswith('.csv') or file.endswith('.xlsx'): | |
list_csv.append(file) | |
else: | |
list_other.append(file) | |
return list_csv, list_other | |
def convert_xlsx_to_csv(xlsx_file_path, csv_file_path): | |
# Read the XLSX file | |
df = pd.read_excel(xlsx_file_path) | |
df.to_csv(csv_file_path, index=False) | |
def save_list_CSV_id(file_list,id): | |
text = "" # Khởi tạo biến text ở đây để lưu toàn bộ nội dung từ tất cả các tệp | |
for x in file_list: | |
if x.endswith('.xlsx'): | |
old = f"/code/temp/{id}/{x}" | |
new = old.replace(".xlsx", ".csv") | |
convert_xlsx_to_csv(old, new) | |
x = x.replace(".xlsx", ".csv") # Cập nhật giá trị của x thành tên file CSV mới | |
loader1 = CSVLoader(f"/code/temp/{id}/{x}") | |
print(x) | |
docs1 = loader1.load() | |
text += f"Dữ liệu file {x}:\n" # Thêm dòng chữ trước nội dung từ mỗi tệp | |
for z in docs1: | |
text += z.page_content + "\n" # Thêm "\n" để tạo xuống hàng | |
return text | |
def save_list_CSV(file_list): | |
text = "" # Khởi tạo biến text ở đây để lưu toàn bộ nội dung từ tất cả các tệp | |
for x in file_list: | |
if x.endswith('.xlsx'): | |
old = f"/code/temp/{x}" | |
new = old.replace(".xlsx", ".csv") | |
convert_xlsx_to_csv(old, new) | |
x = x.replace(".xlsx", ".csv") # Cập nhật giá trị của x thành tên file CSV mới | |
loader1 = CSVLoader(f"/code/temp/{x}") | |
print(x) | |
docs1 = loader1.load() | |
text += f"Dữ liệu file {x}:\n" # Thêm dòng chữ trước nội dung từ mỗi tệp | |
for z in docs1: | |
text += z.page_content + "\n" # Thêm "\n" để tạo xuống hàng | |
return text | |
def extract_query(query,text_alls): | |
keyword = find_matching_files_in_docs_12(query) | |
list_csv, list_other = separate_csv_xlsx(keyword) | |
test_csv = save_list_CSV(list_csv) | |
my_set = set(list_other) | |
text_document = extract_multi_metadata_content(text_alls,my_set) | |
test_all = test_csv + text_document | |
return test_all | |
def chat_gemini(query,text_merge): | |
prompt = f"Dựa vào nội dung sau:{text_merge}. Hãy trả lời câu hỏi sau đây: {query}" | |
# Set up the model | |
generation_config = { | |
"temperature": 0.0, | |
"top_p": 0.0, | |
"top_k": 0, | |
"max_output_tokens": 8192, | |
} | |
safety_settings = [ | |
{ | |
"category": "HARM_CATEGORY_HARASSMENT", | |
"threshold": "BLOCK_MEDIUM_AND_ABOVE" | |
}, | |
{ | |
"category": "HARM_CATEGORY_HATE_SPEECH", | |
"threshold": "BLOCK_MEDIUM_AND_ABOVE" | |
}, | |
{ | |
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", | |
"threshold": "BLOCK_MEDIUM_AND_ABOVE" | |
}, | |
{ | |
"category": "HARM_CATEGORY_DANGEROUS_CONTENT", | |
"threshold": "BLOCK_MEDIUM_AND_ABOVE" | |
}, | |
] | |
model = genai.GenerativeModel(model_name="gemini-1.5-pro-latest", | |
generation_config=generation_config, | |
safety_settings=safety_settings) | |
convo = model.start_chat(history=[]) | |
convo.send_message(f"{prompt}") | |
answer = convo.last.text | |
return answer | |
def extract_content_between_keywords(query, keywords): | |
contents = {} | |
num_keywords = len(keywords) | |
keyword_positions = [] | |
for i in range(num_keywords): | |
keyword = keywords[i] | |
# Xác định vị trí của từ khóa trong câu truy vấn | |
keyword_position = query.find(keyword) | |
keyword_positions.append(keyword_position) | |
# Nếu từ khóa không tồn tại trong câu truy vấn, bỏ qua | |
if keyword_position == -1: | |
continue | |
# Tìm vị trí của từ khóa tiếp theo sau từ khóa hiện tại | |
next_keyword_position = len(query) | |
for j in range(i + 1, num_keywords): | |
next_keyword = keywords[j] | |
next_keyword_position = query.find(next_keyword) | |
if next_keyword_position != -1: | |
break | |
# Trích xuất nội dung trước từ khóa đầu tiên | |
if i == 0: | |
content_before = query[:keyword_position].strip() | |
else: | |
content_before = query[keyword_positions[i-1] + len(keywords[i-1]):keyword_position].strip() | |
# Trích xuất nội dung sau từ khóa cuối cùng | |
if i == num_keywords - 1: | |
content_after = query[keyword_position + len(keyword):].strip() | |
else: | |
content_after = query[keyword_position + len(keyword):next_keyword_position].strip() | |
# Ghép từ khóa với nội dung trước và sau để tạo thành câu hoàn chỉnh | |
content = f"{content_before} {keyword} {content_after}" | |
# Lưu câu hoàn chỉnh vào từ điển | |
contents[keyword] = content | |
return contents | |
def merge_files(file_set, file_list): | |
"""Hàm này ghép lại các tên file dựa trên điều kiện đã cho.""" | |
merged_files = {} | |
# Ghép lại các tên file từ file_list | |
for file_name in file_list: | |
name = file_name.split('.')[0] | |
for f in file_set: | |
if name in f: | |
merged_files[name] = f | |
break | |
return merged_files | |
def replace_keys_with_values(original_dict, replacement_dict): | |
""" | |
Thay thế các key trong original_dict bằng các giá trị tương ứng từ replacement_dict. | |
Tham số: | |
- original_dict: Từ điển gốc cần thay đổi. | |
- replacement_dict: Từ điển chứa các cặp key-value sẽ được sử dụng để thay thế key trong original_dict. | |
Trả về: | |
- new_dict: Từ điển mới sau khi thực hiện thay đổi. | |
""" | |
new_dict = {} | |
for key, value in original_dict.items(): | |
if key in replacement_dict: | |
new_key = replacement_dict[key] | |
new_dict[new_key] = value | |
else: | |
new_dict[key] = value | |
return new_dict | |
def aws1_csv(new_dict_csv): | |
text = "" | |
query_all = "" | |
for key, value in new_dict_csv.items(): | |
print(key,value) | |
query = value | |
query_all += value | |
keyword = [] | |
keyword.append(key) | |
print(keyword) | |
test = save_list_CSV(keyword) | |
text += test | |
return text,query_all | |
def aws1_csv_id(new_dict_csv,id): | |
text = "" | |
query_all = "" | |
for key, value in new_dict_csv.items(): | |
print(key,value) | |
query = value | |
query_all += value | |
keyword = [] | |
keyword.append(key) | |
print(keyword) | |
test = save_list_CSV_id(keyword,id) | |
text += test | |
return text,query_all | |
def aws1(new_dict,text_alls): | |
text = "" | |
query_all = "" | |
for key, value in new_dict.items(): | |
query = value | |
query_all += value | |
keyword,keyword2=find_matching_files_in_docs_12(query) | |
print(value) | |
print(keyword) | |
data= extract_multi_metadata_content(text_alls,keyword) | |
#Phân chia dữ liệu này lại và rerank | |
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=2200, chunk_overlap=400) | |
texts_data = text_splitter.split_text(data) | |
persist_directory = f'{key}' | |
vectordb = Chroma.from_texts(texts_data, | |
embedding=embeddings, | |
persist_directory=persist_directory) | |
k_1 = round(len(texts_data)) | |
retriever = vectordb.as_retriever(search_kwargs={f"k":k_1}) | |
llm = Cohere(temperature=0) | |
compressor = CohereRerank() | |
compression_retriever = ContextualCompressionRetriever( | |
base_compressor=compressor, base_retriever=retriever | |
) | |
compressed_docs = compression_retriever.get_relevant_documents( | |
f"{query}" | |
) | |
text += "Dữ liệu file" + f"{key}" | |
i =0 | |
for x in compressed_docs: | |
text += x.page_content | |
i= i +1 | |
return text,query_all | |
from groq import Groq | |
def get_chat_completion(prompt_query): | |
try: | |
chat_completion = client.chat.completions.create( | |
# | |
# Required parameters | |
# | |
messages=[ | |
{ | |
"role": "system", | |
"content": "Bạn là một trợ lý trung thưc, trả lời dựa trên nội dung tài liệu được cung cấp. Chỉ trả lời liên quan đến câu hỏi một cách đầy đủ chính xác, không bỏ sót thông tin." | |
}, | |
{ | |
"role": "user", | |
"content": f"{prompt_query}", | |
} | |
], | |
# The language model which will generate the completion. | |
model="llama3-70b-8192", | |
temperature=0.0, | |
# The maximum number of tokens to generate. Requests can use up to | |
# 2048 tokens shared between prompt and completion. | |
max_tokens=9000, | |
# Controls diversity via nucleus sampling: 0.5 means half of all | |
# likelihood-weighted options are considered. | |
#top_p=1, | |
# A stop sequence is a predefined or user-specified text string that | |
# signals an AI to stop generating content, ensuring its responses | |
# remain focused and concise. Examples include punctuation marks and | |
# markers like "[end]". | |
stop=None, | |
# If set, partial message deltas will be sent. | |
stream=False, | |
) | |
return chat_completion.choices[0].message.content | |
except Exception as error: | |
# Handle the RateLimitError here | |
#print("Rate limit reached. Please try again later.") | |
#print("Error message:", error.message) | |
return False | |
# Print the completion returned by the LLM. | |
def initialize_generative_model(prompt): | |
# Set up the model generation configuration | |
generation_config = { | |
"temperature": 0.0, | |
"top_p": 0.0, | |
"top_k": 0, | |
"max_output_tokens": 8192, | |
} | |
# Define safety settings | |
safety_settings = [ | |
{ | |
"category": "HARM_CATEGORY_HARASSMENT", | |
"threshold": "BLOCK_MEDIUM_AND_ABOVE" | |
}, | |
{ | |
"category": "HARM_CATEGORY_HATE_SPEECH", | |
"threshold": "BLOCK_MEDIUM_AND_ABOVE" | |
}, | |
{ | |
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", | |
"threshold": "BLOCK_MEDIUM_AND_ABOVE" | |
}, | |
{ | |
"category": "HARM_CATEGORY_DANGEROUS_CONTENT", | |
"threshold": "BLOCK_MEDIUM_AND_ABOVE" | |
}, | |
] | |
# Initialize the generative model | |
model = genai.GenerativeModel(model_name="gemini-1.5-pro-latest", | |
generation_config=generation_config, | |
safety_settings=safety_settings) | |
# Start a conversation | |
convo = model.start_chat(history=[]) | |
# Send the prompt | |
convo.send_message(prompt) | |
# Return the last response | |
return convo.last.text | |
# Example usage: | |
def question_answer(question): | |
completion = get_chat_completion(question) | |
if completion: | |
return completion | |
else: | |
answer = initialize_generative_model(question) | |
return answer | |
def aws1_all_id(new_dict,text_alls,id): | |
answer = "" | |
os.environ["COHERE_API_KEY"] = "ENvwSoOlorjRZvVkgmdRsAGCJKJdsNDHXx1sypFG" | |
for key, value in new_dict.items(): | |
query = value | |
keyword,keyword2=find_matching_files_in_docs_12_id(query,id) | |
print(value) | |
print(keyword) | |
data= extract_multi_metadata_content(text_alls,keyword) | |
#Phân chia dữ liệu này lại và rerank | |
text_splitter = CharacterTextSplitter(chunk_size=2200, chunk_overlap=1500) | |
texts_data = text_splitter.split_text(data) | |
persist_directory = f"/code/temp/{id}/vector_db/{key}" | |
vectordb_query = Chroma.from_texts(texts_data, | |
embedding=embeddings, | |
persist_directory=persist_directory | |
) | |
k_1 = len(texts_data) | |
retriever = vectordb_query.as_retriever(search_kwargs={f"k":k_1}) | |
llm = Cohere(temperature=0) | |
compressor = CohereRerank(top_n=3) | |
compression_retriever = ContextualCompressionRetriever( | |
base_compressor=compressor, base_retriever=retriever | |
) | |
compressed_docs = compression_retriever.get_relevant_documents( | |
f"{query}" | |
) | |
text = "" | |
text += "Dữ liệu file" + f"{key}" | |
i =0 | |
for x in compressed_docs: | |
text += x.page_content | |
i= i +1 | |
prompt_document = f"Dựa vào nội dung sau:{text}. Hãy trả lời câu hỏi sau đây: {query}. Mà không thay đổi nội dung mà mình đã cung cấp" | |
answer_for = question_answer(prompt_document) | |
answer += answer_for + "\n" | |
shutil.rmtree(persist_directory) | |
return answer | |
def aws1_all(new_dict,text_alls): | |
answer = "" | |
for key, value in new_dict.items(): | |
query = value | |
keyword,keyword2=find_matching_files_in_docs_12(query) | |
print(value) | |
print(keyword) | |
data= extract_multi_metadata_content(text_alls,keyword) | |
#Phân chia dữ liệu này lại và rerank | |
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=2200, chunk_overlap=400) | |
texts_data = text_splitter.split_text(data) | |
persist_directory = f'{key}' | |
vectordb = Chroma.from_texts(texts_data, | |
embedding=embeddings, | |
persist_directory=persist_directory) | |
k_1 = round(len(texts_data)) | |
retriever = vectordb.as_retriever(search_kwargs={f"k":k_1}) | |
llm = Cohere(temperature=0) | |
compressor = CohereRerank() | |
compression_retriever = ContextualCompressionRetriever( | |
base_compressor=compressor, base_retriever=retriever | |
) | |
compressed_docs = compression_retriever.get_relevant_documents( | |
f"{query}" | |
) | |
text = "" | |
text += "Dữ liệu file" + f"{key}" | |
i =0 | |
for x in compressed_docs: | |
text += x.page_content | |
i= i +1 | |
prompt_document = f"Dựa vào nội dung sau:{text}. Hãy trả lời câu hỏi sau đây: {query}. Mà không thay đổi, chỉnh sửa nội dung mà mình đã cung cấp" | |
answer_for = question_answer(prompt_document) | |
answer += answer_for + "\n" | |
return answer | |
def question_answer_all_query_v1(query,text_alls): | |
keyword1,key_words_old=find_matching_files_in_docs_12(query) | |
list_keywords2 = list(key_words_old) | |
contents1 = extract_content_between_keywords(query, list_keywords2) | |
merged_result = merge_files(keyword1,list_keywords2) | |
original_dict = contents1 | |
# Từ điển replacement | |
replacement_dict = merged_result | |
new_dict = replace_keys_with_values(original_dict, replacement_dict) | |
files_to_remove = [filename for filename in new_dict.keys() if filename.endswith('.xlsx') or filename.endswith('.csv')] | |
removed_files = {} | |
for filename in files_to_remove: | |
removed_files[filename] = new_dict[filename] | |
# Xóa các tệp khỏi new_dict | |
for filename in files_to_remove: | |
new_dict.pop(filename) | |
test_csv = "" | |
text_csv,query_csv = aws1_csv(removed_files) | |
prompt_csv = "" | |
answer_csv = "" | |
if test_csv: | |
prompt_csv = f"Dựa vào nội dung sau: {text_csv}. Hãy trả lời câu hỏi sau đây: {query_csv}.Bằng tiếng Việt" | |
answer_csv = question_answer(prompt_csv) | |
answer_document = aws1_all(new_dict,text_alls) | |
answer_all = answer_document + answer_csv | |
return answer_all | |
def check_both_empty(matching_files, matching_files_old): | |
""" | |
Kiểm tra nếu cả hai biến đều rỗng. | |
Args: | |
- matching_files: Danh sách các tệp phù hợp mới. | |
- matching_files_old: Danh sách các tệp phù hợp cũ. | |
Returns: | |
- True nếu cả hai biến đều rỗng, False nếu không. | |
""" | |
return not matching_files and not matching_files_old | |
def question_answer_all_query(query): | |
keyword1,key_words_old=find_matching_files_in_docs_12(query) | |
list_keywords2 = list(key_words_old) | |
contents1 = extract_content_between_keywords(query, list_keywords2) | |
merged_result = merge_files(keyword1,list_keywords2) | |
original_dict = contents1 | |
# Từ điển replacement | |
replacement_dict = merged_result | |
new_dict = replace_keys_with_values(original_dict, replacement_dict) | |
files_to_remove = [filename for filename in new_dict.keys() if filename.endswith('.xlsx') or filename.endswith('.csv')] | |
removed_files = {} | |
for filename in files_to_remove: | |
removed_files[filename] = new_dict[filename] | |
# Xóa các tệp khỏi new_dict | |
for filename in files_to_remove: | |
new_dict.pop(filename) | |
text_document, query_document = aws1(new_dict) | |
test_csv = "" | |
text_csv,query_csv = aws1_csv(removed_files) | |
if test_csv: | |
prompt_csv = f"Dựa vào nội dung sau: {text_csv}. Hãy trả lời câu hỏi sau đây: {query_csv}.Bằng tiếng Việt" | |
prompt_document = f"Dựa vào nội dung sau: {text_document}. Hãy trả lời câu hỏi sau đây: {query_document}. Bằng tiếng Việt" | |
answer_document = question_answer(prompt_document) | |
answer_csv = question_answer(prompt_csv) | |
answer_all = answer_document + answer_csv | |
return answer_all | |
def extract_data(): | |
documents = [] | |
# Load dữ liệu các file từ thư mục docs | |
for file in os.listdir("/code/temp"): | |
if file.endswith(".pdf"): | |
pdf_path = "/code/temp/" + file | |
loader = UnstructuredPDFLoader(pdf_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.docx') or file.endswith('.doc'): | |
doc_path = "/code/temp/" + file | |
loader = Docx2txtLoader(doc_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.txt'): | |
txt_path = "/code/temp/" + file | |
loader = TextLoader(txt_path,encoding="utf8") | |
documents.extend(loader.load()) | |
elif file.endswith('.pptx'): | |
ppt_path = "/code/temp/" + file | |
loader = UnstructuredPowerPointLoader(ppt_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.csv'): | |
csv_path = "/code/temp/" + file | |
loader = UnstructuredCSVLoader(csv_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.xlsx'): | |
excel_path = "/code/temp/" + file | |
loader = UnstructuredExcelLoader(excel_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.xml'): | |
xml_path = "/code/temp/" + file | |
loader = UnstructuredXMLLoader(xml_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.html'): | |
html_path = "/code/temp/" + file | |
loader = UnstructuredHTMLLoader(html_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.json'): | |
json_path = "/code/temp/" + file | |
loader = JSONLoader(json_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.md'): | |
json_path = "/code/temp/" + file | |
loader = UnstructuredMarkdownLoader(json_path) | |
documents.extend(loader.load()) | |
#Phân chia dữ liệu | |
text_splitter = CharacterTextSplitter(chunk_size=2200, chunk_overlap=1500) | |
texts= text_splitter.split_documents(documents) | |
text_all = texts | |
return text_all | |
def extract_data2(id): | |
documents = [] | |
# Load dữ liệu các file từ thư mục docs | |
for file in os.listdir(f"/code/temp/{id}"): | |
if file.endswith(".pdf"): | |
pdf_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredPDFLoader(pdf_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.docx') or file.endswith('.doc'): | |
doc_path = f"/code/temp/{id}/" + file | |
loader = Docx2txtLoader(doc_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.txt'): | |
txt_path = f"/code/temp/{id}/" + file | |
loader = TextLoader(txt_path,encoding="utf8") | |
documents.extend(loader.load()) | |
elif file.endswith('.pptx'): | |
ppt_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredPowerPointLoader(ppt_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.csv'): | |
csv_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredCSVLoader(csv_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.xlsx'): | |
excel_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredExcelLoader(excel_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.xml'): | |
xml_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredXMLLoader(xml_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.html'): | |
html_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredHTMLLoader(html_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.json'): | |
json_path = f"/code/temp/{id}/" + file | |
loader = TextLoader(json_path) | |
documents.extend(loader.load()) | |
elif file.endswith('.md'): | |
json_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredMarkdownLoader(json_path) | |
documents.extend(loader.load()) | |
#Phân chia dữ liệu | |
text_splitter = CharacterTextSplitter(chunk_size=2200, chunk_overlap=1500) | |
texts= text_splitter.split_documents(documents) | |
text_all = texts | |
return text_all | |
def question_answer_all_query_v1_id(query,text_alls,id): | |
keyword1,key_words_old=find_matching_files_in_docs_12_id(query,id) | |
list_keywords2 = list(key_words_old) | |
contents1 = extract_content_between_keywords(query, list_keywords2) | |
merged_result = merge_files(keyword1,list_keywords2) | |
original_dict = contents1 | |
# Từ điển replacement | |
replacement_dict = merged_result | |
new_dict = replace_keys_with_values(original_dict, replacement_dict) | |
files_to_remove = [filename for filename in new_dict.keys() if filename.endswith('.xlsx') or filename.endswith('.csv')] | |
removed_files = {} | |
for filename in files_to_remove: | |
removed_files[filename] = new_dict[filename] | |
# Xóa các tệp khỏi new_dict | |
for filename in files_to_remove: | |
new_dict.pop(filename) | |
test_csv = "" | |
text_csv,query_csv = aws1_csv_id(removed_files,id) | |
prompt_csv = "" | |
answer_csv = "" | |
if test_csv: | |
prompt_csv = f"Dựa vào nội dung sau: {text_csv}. Hãy trả lời câu hỏi sau đây: {query_csv}.Bằng tiếng Việt" | |
answer_csv = question_answer(prompt_csv) | |
answer_document = aws1_all_id(new_dict,text_alls,id) | |
answer_all = answer_document + answer_csv | |
return answer_all | |
from typing import List, Optional | |
from langchain_core.pydantic_v1 import BaseModel, Field | |
class Search(BaseModel): | |
queries: List[str] = Field( | |
..., | |
description="Truy vấn riêng biệt để tìm kiếm, giữ nguyên ý chính câu hỏi riêng biệt", | |
) | |
"sk-proj-TbTRQKKJPb7PEoIBJ6e7T3BlbkFJbdz7Qxsv3JJ7BFcmN2jf" | |
openai_key = "sk" + "-proj-TbTRQKKJPb7PEoIBJ6e7T3BlbkFJbdz7Qxsv3JJ7BFcmN2jf" | |
os.environ["OPENAI_API_KEY"] = "sk-proj-TbTRQKKJPb7PEoIBJ6e7T3BlbkFJbdz7Qxsv3JJ7BFcmN2jf" | |
from langchain_core.output_parsers.openai_tools import PydanticToolsParser | |
from langchain_core.prompts import ChatPromptTemplate | |
from langchain_core.runnables import RunnablePassthrough | |
from langchain_openai import ChatOpenAI | |
def query_analyzer(query): | |
output_parser = PydanticToolsParser(tools=[Search]) | |
system = """Bạn có khả năng đưa ra các truy vấn tìm kiếm chính xác để lấy thông tin giúp trả lời các yêu cầu của người dùng. Các truy vấn của bạn phải chính xác, không được bỏ ngắn rút gọn. | |
Nếu bạn cần tra cứu hai hoặc nhiều thông tin riêng biệt, bạn có thể làm điều đó!. Trả lời câu hỏi bằng tiếng Việt(Vietnamese), không được dùng ngôn ngữ khác""" | |
prompt = ChatPromptTemplate.from_messages( | |
[ | |
("system", system), | |
("human", "{question}"), | |
] | |
) | |
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0.0) | |
structured_llm = llm.with_structured_output(Search) | |
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm | |
text = query_analyzer.invoke(query) | |
return text | |
def handle_query_upgrade_keyword(query_all,text_all,id,chat_history): | |
answer_all = "" | |
os.environ["COHERE_API_KEY"] = "RWIrMiF184xBmOAAvodxCxExefwEAYSn7yEOmbk1" | |
prompt_history = f"Dựa vào nội dung lịch sử câu hỏi sau:{chat_history}. Hãy trả lời câu hỏi sau đây: {query_all}. Mà không thay đổi, chỉnh sửa nội dung mà mình đã cung cấp" | |
answer_history = "Câu trả lời sau khi xem qua lịch sử chat:" + question_answer(prompt_history) | |
answer_all += answer_history | |
# Xử lý multiquery: | |
# test = query_analyzer.invoke(f"{query_all}") | |
test = query_analyzer(query_all) | |
test_string = str(test) | |
matches = re.findall(r"'([^']*)'", test_string) | |
# Xử lý dữ liệu | |
# text_all = extract_data2(id) | |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=4500, chunk_overlap=2500) | |
texts = text_splitter.split_documents(text_all) | |
vectordb = Chroma.from_documents(documents=texts, | |
embedding=embeddings) | |
# Thiết lập số k cần truy vấn | |
k = len(texts) | |
retriever = vectordb.as_retriever(search_kwargs={"k":k}) | |
llm = Cohere(temperature=0) | |
compressor = CohereRerank(top_n=5,model="rerank-english-v2.0") | |
compression_retriever = ContextualCompressionRetriever( | |
base_compressor=compressor, base_retriever=retriever | |
) | |
for x in matches: | |
query = x | |
keyword,key_words_old = find_matching_files_in_docs_12_id(query,id) | |
file_list = keyword | |
if file_list: | |
list_keywords2 = list(key_words_old) | |
contents1 = extract_content_between_keywords(query, list_keywords2) | |
merged_result = merge_files(keyword,list_keywords2) | |
original_dict = contents1 | |
# Từ điển replacement | |
replacement_dict = merged_result | |
new_dict = replace_keys_with_values(original_dict, replacement_dict) | |
files_to_remove = [filename for filename in new_dict.keys() if filename.endswith('.xlsx') or filename.endswith('.csv')] | |
removed_files = {} | |
for filename in files_to_remove: | |
removed_files[filename] = new_dict[filename] | |
# Xóa các tệp khỏi new_dict | |
for filename in files_to_remove: | |
new_dict.pop(filename) | |
test_csv = "" | |
text_csv,query_csv = aws1_csv_id(removed_files,id) | |
prompt_csv = "" | |
answer_csv = "" | |
if test_csv: | |
prompt_csv = f"Dựa vào nội dung sau: {text_csv}. Hãy trả lời câu hỏi sau đây: {query_csv}.Bằng tiếng Việt" | |
answer_csv = question_answer(prompt_csv) | |
# text_document, query_document = aws1_all_id(new_dict,text_all,id) | |
# # answer_document = sf.aws1_all(new_dict,text_alls,id) | |
# prompt_document = f"Dựa vào nội dung sau: {text_document}. Hãy trả lời câu hỏi sau đây: {query_document}. Bằng tiếng Việt" | |
answer_document = aws1_all_id(new_dict,text_all,id) | |
answer_all1 = answer_document + answer_csv | |
answer_all += answer_all1 | |
else: | |
compressed_docs = compression_retriever.get_relevant_documents(f"{query}") | |
relevance_score_float = float(compressed_docs[0].metadata['relevance_score']) | |
if relevance_score_float <= 0.82: | |
documents1 = [] | |
for file in os.listdir(f"/code/temp/{id}"): | |
if file.endswith('.csv'): | |
csv_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredCSVLoader(csv_path) | |
documents1.extend(loader.load()) | |
elif file.endswith('.xlsx'): | |
excel_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredExcelLoader(excel_path) | |
documents1.extend(loader.load()) | |
text_splitter_csv = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=2200, chunk_overlap=1500) | |
texts_csv= text_splitter_csv.split_documents(documents1) | |
vectordb_csv = Chroma.from_documents(documents=texts_csv, | |
embedding=embeddings,persist_directory=f'./demoaaa') | |
# Thiết lập số k cần truy vấn | |
k = len(texts_csv) | |
retriever_csv = vectordb_csv.as_retriever(search_kwargs={"k":k}) | |
llm = Cohere(temperature=0) | |
compressor_csv = CohereRerank(top_n=3,model="rerank-english-v2.0") | |
compression_retriever_csv = ContextualCompressionRetriever( | |
base_compressor=compressor_csv, base_retriever=retriever_csv | |
) | |
compressed_docs_csv = compression_retriever_csv.get_relevant_documents(f"{query}") | |
file_path = compressed_docs_csv[0].metadata['source'] | |
print(file_path) | |
if file_path.endswith('.xlsx'): | |
new = file_path.replace(".xlsx", ".csv") | |
convert_xlsx_to_csv(file_path, new) | |
loader1 = CSVLoader(new) | |
else: | |
loader1 = CSVLoader(file_path) | |
docs1 = loader1.load() | |
text = " " # Thêm dòng chữ trước nội dung từ mỗi tệp | |
for z in docs1: | |
text += z.page_content + "\n" | |
prompt_csv = f"Dựa vào nội dung sau: {text}. Hãy trả lời câu hỏi sau đây: {query}. Bằng tiếng Việt" | |
answer_csv = question_answer(prompt_csv) | |
answer_all += answer_csv | |
else: | |
file_path = compressed_docs[0].metadata['source'] | |
if file_path.endswith(".pdf"): | |
loader = UnstructuredPDFLoader(file_path) | |
elif file_path.endswith('.docx') or file_path.endswith('doc'): | |
loader = Docx2txtLoader(file_path) | |
elif file_path.endswith('.txt'): | |
loader = TextLoader(file_path,encoding="utf8") | |
elif file_path.endswith('.pptx'): | |
loader = UnstructuredPowerPointLoader(file_path) | |
elif file_path.endswith('.xml'): | |
loader = UnstructuredXMLLoader(file_path) | |
elif file_path.endswith('.html'): | |
loader = UnstructuredHTMLLoader(file_path) | |
elif file_path.endswith('.json'): | |
loader = JSONLoader(file_path) | |
elif file_path.endswith('.md'): | |
loader = UnstructuredMarkdownLoader(file_path) | |
elif file_path.endswith('.xlsx'): | |
file_path_new = file_path.replace(".xlsx", ".csv") | |
convert_xlsx_to_csv(file_path,file_path_new) | |
loader = CSVLoader(file_path_new) | |
elif file_path.endswith('.csv'): | |
loader = CSVLoader(file_path) | |
text_splitter = CharacterTextSplitter(chunk_size=3200, chunk_overlap=1500) | |
texts= text_splitter.split_documents(loader.load()) | |
vectordb_file = Chroma.from_documents(texts,embeddings) | |
k_1 = len(texts) | |
retriever_file = vectordb_file.as_retriever(search_kwargs={f"k":k_1}) | |
llm = Cohere(temperature=0) | |
compressor_file = CohereRerank(top_n=5,model="rerank-english-v2.0") | |
compression_retriever_file = ContextualCompressionRetriever( | |
base_compressor=compressor_file, base_retriever=retriever_file | |
) | |
compressed_docs_file = compression_retriever_file.get_relevant_documents(f"{x}") | |
query = x | |
text = "" | |
for x1 in compressed_docs_file: | |
text += x1.page_content | |
prompt = f"Dựa vào nội dung sau:{text}. Hãy trả lời câu hỏi sau đây: {query}. Mà không thay đổi, chỉnh sửa nội dung mà mình đã cung cấp" | |
answer = question_answer(prompt) | |
answer_all += answer | |
prompt1 = f"Dựa vào nội dung sau:{answer_all}. Hãy trả lời câu hỏi sau đây: {query_all}. Mà không thay đổi, chỉnh sửa nội dung mà mình đã cung cấp" | |
answer1 = question_answer(prompt1) | |
return answer1 | |
def handle_query_upgrade_keyword_old(query_all,text_all,id): | |
answer_all = "" | |
os.environ["COHERE_API_KEY"] = "RWIrMiF184xBmOAAvodxCxExefwEAYSn7yEOmbk1" | |
# prompt_history = f"Dựa vào nội dung lịch sử câu hỏi sau:{chat_history}. Hãy trả lời câu hỏi sau đây: {query_all}. Mà không thay đổi, chỉnh sửa nội dung mà mình đã cung cấp" | |
# answer_history = "Câu trả lời sau khi xem qua lịch sử chat:" + question_answer(prompt_history) | |
# answer_all += answer_history | |
# Xử lý multiquery: | |
# test = query_analyzer.invoke(f"{query_all}") | |
test = query_analyzer(query_all) | |
test_string = str(test) | |
matches = re.findall(r"'([^']*)'", test_string) | |
# Xử lý dữ liệu | |
# text_all = extract_data2(id) | |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=4500, chunk_overlap=2500) | |
texts = text_splitter.split_documents(text_all) | |
vectordb = Chroma.from_documents(documents=texts, | |
embedding=embeddings) | |
# Thiết lập số k cần truy vấn | |
k = len(texts) | |
retriever = vectordb.as_retriever(search_kwargs={"k":k}) | |
llm = Cohere(temperature=0) | |
compressor = CohereRerank(top_n=5,model="rerank-english-v2.0") | |
compression_retriever = ContextualCompressionRetriever( | |
base_compressor=compressor, base_retriever=retriever | |
) | |
for x in matches: | |
query = x | |
keyword,key_words_old = find_matching_files_in_docs_12_id(query,id) | |
file_list = keyword | |
if file_list: | |
list_keywords2 = list(key_words_old) | |
contents1 = extract_content_between_keywords(query, list_keywords2) | |
merged_result = merge_files(keyword,list_keywords2) | |
original_dict = contents1 | |
# Từ điển replacement | |
replacement_dict = merged_result | |
new_dict = replace_keys_with_values(original_dict, replacement_dict) | |
files_to_remove = [filename for filename in new_dict.keys() if filename.endswith('.xlsx') or filename.endswith('.csv')] | |
removed_files = {} | |
for filename in files_to_remove: | |
removed_files[filename] = new_dict[filename] | |
# Xóa các tệp khỏi new_dict | |
for filename in files_to_remove: | |
new_dict.pop(filename) | |
test_csv = "" | |
text_csv,query_csv = aws1_csv_id(removed_files,id) | |
prompt_csv = "" | |
answer_csv = "" | |
if test_csv: | |
prompt_csv = f"Dựa vào nội dung sau: {text_csv}. Hãy trả lời câu hỏi sau đây: {query_csv}.Bằng tiếng Việt" | |
answer_csv = question_answer(prompt_csv) | |
# text_document, query_document = aws1_all_id(new_dict,text_all,id) | |
# # answer_document = sf.aws1_all(new_dict,text_alls,id) | |
# prompt_document = f"Dựa vào nội dung sau: {text_document}. Hãy trả lời câu hỏi sau đây: {query_document}. Bằng tiếng Việt" | |
answer_document = aws1_all_id(new_dict,text_all,id) | |
answer_all1 = answer_document + answer_csv | |
answer_all += answer_all1 | |
else: | |
compressed_docs = compression_retriever.get_relevant_documents(f"{query}") | |
relevance_score_float = float(compressed_docs[0].metadata['relevance_score']) | |
if relevance_score_float <= 0.82: | |
documents1 = [] | |
for file in os.listdir(f"/code/temp/{id}"): | |
if file.endswith('.csv'): | |
csv_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredCSVLoader(csv_path) | |
documents1.extend(loader.load()) | |
elif file.endswith('.xlsx'): | |
excel_path = f"/code/temp/{id}/" + file | |
loader = UnstructuredExcelLoader(excel_path) | |
documents1.extend(loader.load()) | |
text_splitter_csv = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=2200, chunk_overlap=1500) | |
texts_csv= text_splitter_csv.split_documents(documents1) | |
vectordb_csv = Chroma.from_documents(documents=texts_csv, | |
embedding=embeddings,persist_directory=f'./demoaaa') | |
# Thiết lập số k cần truy vấn | |
k = len(texts_csv) | |
retriever_csv = vectordb_csv.as_retriever(search_kwargs={"k":k}) | |
llm = Cohere(temperature=0) | |
compressor_csv = CohereRerank(top_n=3,model="rerank-english-v2.0") | |
compression_retriever_csv = ContextualCompressionRetriever( | |
base_compressor=compressor_csv, base_retriever=retriever_csv | |
) | |
compressed_docs_csv = compression_retriever_csv.get_relevant_documents(f"{query}") | |
file_path = compressed_docs_csv[0].metadata['source'] | |
print(file_path) | |
if file_path.endswith('.xlsx'): | |
new = file_path.replace(".xlsx", ".csv") | |
convert_xlsx_to_csv(file_path, new) | |
loader1 = CSVLoader(new) | |
else: | |
loader1 = CSVLoader(file_path) | |
docs1 = loader1.load() | |
text = " " # Thêm dòng chữ trước nội dung từ mỗi tệp | |
for z in docs1: | |
text += z.page_content + "\n" | |
prompt_csv = f"Dựa vào nội dung sau: {text}. Hãy trả lời câu hỏi sau đây: {query}. Bằng tiếng Việt" | |
answer_csv = question_answer(prompt_csv) | |
answer_all += answer_csv | |
else: | |
file_path = compressed_docs[0].metadata['source'] | |
if file_path.endswith(".pdf"): | |
loader = UnstructuredPDFLoader(file_path) | |
elif file_path.endswith('.docx') or file_path.endswith('doc'): | |
loader = Docx2txtLoader(file_path) | |
elif file_path.endswith('.txt'): | |
loader = TextLoader(file_path,encoding="utf8") | |
elif file_path.endswith('.pptx'): | |
loader = UnstructuredPowerPointLoader(file_path) | |
elif file_path.endswith('.xml'): | |
loader = UnstructuredXMLLoader(file_path) | |
elif file_path.endswith('.html'): | |
loader = UnstructuredHTMLLoader(file_path) | |
elif file_path.endswith('.json'): | |
loader = JSONLoader(file_path) | |
elif file_path.endswith('.md'): | |
loader = UnstructuredMarkdownLoader(file_path) | |
elif file_path.endswith('.xlsx'): | |
file_path_new = file_path.replace(".xlsx", ".csv") | |
convert_xlsx_to_csv(file_path,file_path_new) | |
loader = CSVLoader(file_path_new) | |
elif file_path.endswith('.csv'): | |
loader = CSVLoader(file_path) | |
text_splitter = CharacterTextSplitter(chunk_size=3200, chunk_overlap=1500) | |
texts= text_splitter.split_documents(loader.load()) | |
vectordb_file = Chroma.from_documents(texts,embeddings) | |
k_1 = len(texts) | |
retriever_file = vectordb_file.as_retriever(search_kwargs={f"k":k_1}) | |
llm = Cohere(temperature=0) | |
compressor_file = CohereRerank(top_n=5,model="rerank-english-v2.0") | |
compression_retriever_file = ContextualCompressionRetriever( | |
base_compressor=compressor_file, base_retriever=retriever_file | |
) | |
compressed_docs_file = compression_retriever_file.get_relevant_documents(f"{x}") | |
query = x | |
text = "" | |
for x1 in compressed_docs_file: | |
text += x1.page_content | |
prompt = f"Dựa vào nội dung sau:{text}. Hãy trả lời câu hỏi sau đây: {query}. Mà không thay đổi, chỉnh sửa nội dung mà mình đã cung cấp" | |
answer = question_answer(prompt) | |
answer_all += answer | |
prompt1 = f"Dựa vào nội dung sau:{answer_all}. Hãy trả lời câu hỏi sau đây: {query_all}. Mà không thay đổi, chỉnh sửa nội dung mà mình đã cung cấp" | |
answer1 = question_answer(prompt1) | |
return answer1 | |