import json
from langchain.llms.base import LLM
from transformers import AutoTokenizer, AutoModel, AutoConfig
from typing import List, Optional
class ChatGLM4(LLM):
max_token: int = 8192
do_sample: bool = True
temperature: float = 0.8
modelPath = "/home/cmcc/server/model/chatglm3-6b"
top_p = 0.8
tokenizer: object = AutoTokenizer.from_pretrained(modelPath, trust_remote_code=True)
model: object = None
history: List = []
def __init__(self):
super().__init__()
print("--------------------------------")
self.model = AutoModel.from_pretrained(self.modelPath, trust_remote_code=True).half().cuda().eval()
@property
def _llm_type(self) -> str:
return "ChatGLM4"
def _call(self, prompt: str, history: List = [], stop: Optional[List[str]] = ["<|user|>"]):
if history is None:
history = history
history.append({"role": "user", "content": prompt})
response, history = self.model.chat(self.tokenizer, prompt, history=history)
return response
from langchain.chains import LLMChain, RetrievalQA
from langchain_community.document_loaders import TextLoader
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores.faiss import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain_text_splitters import RecursiveCharacterTextSplitter
from glm聊天客服 import ChatGLM4
embedding_model_dict = {
"bge-large-zh-v1.5":"/home/cmcc/server/file/embFile/bge-large-zh-v1.5",
"ebge-m3":"BAAI/bge-m3",
"text2vec":"BAAI/text2vec-large-chinese",
"text2vec2":"uer/sbert-base-chinese-nli",
"text2vec3":"shibing624/text2vec-base-chinese"
}
def load_embedding_model(model_name="bge-large-zh-v1.5"):
encode_kwargs = {"normalize_embeddings": False}
model_kwargs = {"device": "cuda:0"}
return HuggingFaceEmbeddings(
model_name = embedding_model_dict[model_name],
model_kwargs = model_kwargs,
encode_kwargs = encode_kwargs
)
embedding = load_embedding_model("bge-large-zh-v1.5")
llm = ChatGLM4()
loader = TextLoader("/home/cmcc/server/file/测试文档.txt", encoding="utf-8")
doc = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=3000, chunk_overlap=400)
docs = text_splitter.split_documents(doc)
docsearch = FAISS.from_documents(docs, embedding)
retriever = docsearch.as_retriever()
template = """只根据以下情境回答问题:
{context}
问题: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# model = ChatOpenAI()
output_parser = StrOutputParser()
setup_and_retrieval = RunnableParallel(
{"context": retriever, "question": RunnablePassthrough()}
)
chain = setup_and_retrieval | prompt | llm | output_parser
response = chain.invoke("小明和小红是什么关系")
print(response)