llm_knowledge_base / multiQuery_prompt.py
allinaigc's picture
Upload 35 files
b2e325f verified
"""
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