Spaces:
Sleeping
Sleeping
""" | |
1. 目前这个版本是把所有的multiquery当成一个问题提交给大模型。后续可以考虑将每一个问题分别送入大模型,然后得到的多个答案,然后在一并汇总。 | |
""" | |
# # from langchain.document_loaders import UnstructuredFileLoader | |
# print('start the importing of UnstructuredFileLoader') | |
# from langchain_community.document_loaders.unstructured import UnstructuredFileLoader | |
# filepath = "./joeshi_upload.pdf" | |
# loader = UnstructuredFileLoader(filepath) | |
# docs = loader.load() | |
# print('docs now:', docs) | |
# print('langchain loader:',loader) | |
# print('end the importing of UnstructuredFileLoader') | |
from openai import OpenAI | |
import openai | |
import os | |
import rag_source | |
import langchain_KB | |
from langchain.vectorstores import FAISS | |
from langchain.embeddings.openai import OpenAIEmbeddings | |
from langchain_community.document_loaders.unstructured import UnstructuredFileLoader ## new version. | |
from langchain_community.document_loaders import PyPDFLoader | |
from langchain.text_splitter import CharacterTextSplitter | |
from langchain.embeddings.openai import OpenAIEmbeddings | |
from langchain.embeddings.huggingface import HuggingFaceEmbeddings | |
from langchain.vectorstores import FAISS | |
from dotenv import load_dotenv | |
client = OpenAI() | |
load_dotenv() | |
### 设置openai的API key | |
os.environ["OPENAI_API_KEY"] = os.environ['user_token'] | |
openai.api_key = os.environ['user_token'] | |
# loader = UnstructuredFileLoader(filepath) | |
# loader = PyPDFLoader(filepath) | |
# print('langchain loader:',loader) | |
# docs = loader.load() | |
# print('docs now:', docs) | |
## 文本分割 | |
# text_splitter = CharacterTextSplitter(chunk_size=5000, chunk_overlap=200) | |
# docs = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200).split_documents(docs) | |
## 创建向量数据库 | |
# embedding_model_name = 'GanymedeNil/text2vec-large-chinese' | |
# embeddings = HuggingFaceEmbeddings(model_name=embedding_model_name) ## 这里是联网情况下连接huggingface后使用。 | |
# from langchain.embeddings.openai import OpenAIEmbeddings | |
# embeddings = OpenAIEmbeddings(disallowed_special=()) ## 可能需要更新了。 | |
# print('langchain embeddings:', embeddings) | |
# vector_store = FAISS.from_documents(docs, embeddings) | |
# print(vector_store) | |
# vector_store.save_local('./joeshi/faiss_index') ## 将矢量库保存在本地指定目录。 | |
# vector_store = FAISS.load_local('./joeshi/faiss_index', embeddings) | |
### 构建一个multi query的方法来进行大模型查询。可以用chatglm的方法来做, 也可以用openai的方法来做。 | |
def generate_sim_query(orignal_question): | |
similar_query_prompt = f"""你是一个AI语言模型,你的任务是生成4个不同的用户问题版本,以便从向量数据库中检索相关文档。通过生成用户问题多角度的表述,你的目标是帮助用户克服基于距离的相似性搜索的一些局限性。请按以下要求生成替代问题,并用隔行排列这些: | |
1. 使用与原始问题不同的关键词或同义词来重新表述问题。 | |
2. 尝试从不同的角度提问,例如更具体、更抽象或更概括。 | |
3. 考虑问题中隐含的前提或假设,并提出针对这些前提或假设的替代问题。 | |
4. 结合用户可能拥有的背景知识或先前交互的信息,生成更具针对性的问题。 | |
用户的原始问题是: {orignal_question}""" | |
# similar_query_prompt = """You are an AI language model assistant. Your task is to generate five | |
# different versions of the given user question to retrieve relevant documents from a vector | |
# database. By generating multiple perspectives on the user question, your goal is to help | |
# the user overcome some of the limitations of the distance-based similarity search. | |
# Provide these alternative questions separated by newlines. | |
# Original question: {orignal_question}""" ## English version. | |
#### 用大模型来生成相似问。 | |
# response, history = chatglm.model.chat(chatglm.tokenizer, query=similar_query_prompt) ## 从用langchain的自定义方式来做. | |
response = client.chat.completions.create( | |
model="gpt-3.5-turbo-16k", | |
messages=[{"role": "user", "content": f'{similar_query_prompt}'}], | |
stream=False, | |
) | |
## response.choices[0].message.content 才是ChatGPT反馈的返回的str结果。 | |
similar_questions = response.choices[0].message.content.split("\n") ## 将反馈结果切割成一个个问题。 | |
return similar_questions | |
# #### 根据相似问查询,返回查询后的结果以及信息来源。 | |
## 在主程序中会进行大模型的查询,这里应该不需要了。 | |
# def multiQuery_prompt(prompt): | |
# prompt = generate_sim_query(prompt) | |
# docs = vector_store.similarity_search(prompt, k=3) ##NOTE:注意可能新版本这里的k是小写的,之前的版本可能是大写。 | |
# source = rag_source.rag_source(docs) ## get the K reference source of the RAG answer, in a designed format. | |
# return docs, source |