-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Replies: 1 comment · 13 replies
-
Beta Was this translation helpful? Give feedback.
All reactions
-
To resolve the issue of missing from langchain_core.callbacks.manager import CallbackManagerForLLMRun, AsyncCallbackManagerForLLMRun
from langchain_core.language_models import BaseLanguageModel
from langchain_core.messages import AIMessage, BaseMessage
from langchain_core.outputs.generation import GenerationChunk
from langchain.schema import LLMResult
from langchain_core.runnables import Runnable
from typing import Optional, List, Any, Sequence, Dict Here is the updated code with the correct imports: from openai import OpenAI
from langchain_core.language_models import BaseLanguageModel
from langchain_core.messages import AIMessage, BaseMessage
from langchain_core.callbacks.manager import CallbackManagerForLLMRun, AsyncCallbackManagerForLLMRun
from langchain_core.outputs.generation import GenerationChunk
from langchain.schema import LLMResult
from langchain_core.runnables import Runnable
from typing import Optional, List, Any, Sequence, Dict
# Point to the local server (Llama3 served on LM Studio locally)
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")
# LocalModel class
class LocalModel(BaseLanguageModel):
def __init__(self, client):
self.client = client
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> str:
history = [
{"role": "system", "content": "You are an intelligent assistant."},
{"role": "user", "content": prompt},
]
completion = self.client.chat.completions.create(
model="crusoeai/Llama-3-8B-Instruct-262k-GGUF",
messages=history,
temperature=0.7,
stream=False, # Use stream=True for streaming responses
)
return completion.choices[0].message["content"]
async def _acall(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> str:
return await run_in_executor(
None,
self._call,
prompt,
stop,
run_manager.get_sync() if run_manager else None,
**kwargs,
)
def generate_prompt(
self,
prompts: List[str],
callbacks: Optional[List[Callbacks]] = None,
tags: Optional[List[str]] = None,
metadata: Optional[Dict[str, Any]] = None,
run_name: Optional[str] = None,
**kwargs: Any,
) -> LLMResult:
generations = [[GenerationChunk(text="Generated response for: " + prompt)] for prompt in prompts]
return LLMResult(generations=generations)
async def agenerate_prompt(
self,
prompts: List[str],
callbacks: Optional[List[Callbacks]] = None,
tags: Optional[List[str]] = None,
metadata: Optional[Dict[str, Any]] = None,
run_name: Optional[str] = None,
**kwargs: Any,
) -> LLMResult:
generations = [[GenerationChunk(text="Generated response for: " + prompt)] for prompt in prompts]
return LLMResult(generations=generations)
def predict(
self, text: str, *, stop: Optional[Sequence[str]] = None, **kwargs: Any
) -> str:
return self._call(text, stop=list(stop) if stop else None, **kwargs)
async def apredict(
self, text: str, *, stop: Optional[Sequence[str]] = None, **kwargs: Any
) -> str:
return await self._acall(text, stop=list(stop) if stop else None, **kwargs)
def predict_messages(
self,
messages: List[BaseMessage],
*,
stop: Optional[Sequence[str]] = None,
**kwargs: Any,
) -> BaseMessage:
text = get_buffer_string(messages)
content = self._call(text, stop=list(stop) if stop else None, **kwargs)
return AIMessage(content=content)
async def apredict_messages(
self,
messages: List[BaseMessage],
*,
stop: Optional[Sequence[str]] = None,
**kwargs: Any,
) -> BaseMessage:
text = get_buffer_string(messages)
content = await self._acall(text, stop=list(stop) if stop else None, **kwargs)
return AIMessage(content=content)
def invoke(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> str:
return self._call(prompt, stop, run_manager, **kwargs)
# Instantiate your custom local LLM
local_model = LocalModel(client=client)
# Ensure your custom LLM is wrapped as a Runnable
local_model_runnable = Runnable(local_model)
# Create the LLMChain using the custom local LLM
chain = load_qa_chain(local_model_runnable, chain_type="stuff")
# Usage
query = "What is this collection of PDFs about?"
docs = docsearch.similarity_search(query)
print(chain.run(input_documents=docs, question=query)) This should resolve the import issues for |
Beta Was this translation helpful? Give feedback.
All reactions
-
This is the latest code I am using
This gives an error that : |
Beta Was this translation helpful? Give feedback.
All reactions
-
To resolve the Here is how you can modify the def generate_prompt(
self,
prompts: List[str],
callbacks: Optional[List[BaseCallbackHandler]] = None,
tags: Optional[List[str]] = None,
metadata: Optional[Dict[str, Any]] = None,
run_name: Optional[str] = None,
**kwargs: Any,
) -> LLMResult:
# Remove callbacks from kwargs if it exists
kwargs.pop('callbacks', None)
generations = [[GenerationChunk(text="Generated response for: " + prompt)] for prompt in prompts]
return LLMResult(generations=generations)
async def agenerate_prompt(
self,
prompts: List[str],
callbacks: Optional[List[BaseCallbackHandler]] = None,
tags: Optional[List[str]] = None,
metadata: Optional[Dict[str, Any]] = None,
run_name: Optional[str] = None,
**kwargs: Any,
) -> LLMResult:
# Remove callbacks from kwargs if it exists
kwargs.pop('callbacks', None)
generations = [[GenerationChunk(text="Generated response for: " + prompt)] for prompt in prompts]
return LLMResult(generations=generations) By using Here is the updated code with these changes: from typing import List, Optional, Dict, Any, Sequence
from pydantic import BaseModel
from langchain_core.language_models import BaseLanguageModel
from langchain_core.messages import AIMessage, BaseMessage
from langchain_core.outputs.generation import GenerationChunk
from langchain.schema import LLMResult
from langchain.callbacks.base import BaseCallbackHandler
from langchain_core.runnables import Runnable
from langchain.chains.question_answering import load_qa_chain
from PyPDF2 import PdfReader
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import FAISS
from openai import OpenAI
#----------------------------------------------------------------------------------------------------
pdf_paths = [r"pdf1", r"pdf2"] # List your PDF paths here
all_texts = []
metadata = []
for pdf_path in pdf_paths:
reader = PdfReader(pdf_path)
raw_text = ""
for page in reader.pages:
text = page.extract_text()
if text:
raw_text += text
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=1200,
chunk_overlap=250,
length_function=len,
)
texts = text_splitter.split_text(raw_text)
all_texts.extend(texts)
metadata.extend([{"source": pdf_path}] * len(texts))
embeddings = OpenAIEmbeddings()
docsearch = FAISS.from_texts(all_texts, embeddings, metadatas=metadata)
# chain = load_qa_chain(OpenAI(), chain_type="stuff")
#----------------------------------------------------------------------------------------------------
# Point to the local server (Llama3 served on LM Studio locally)
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")
# LocalModel class
class LocalModel(BaseLanguageModel):
client: Any
class Config:
arbitrary_types_allowed = True # Allow arbitrary types
def __init__(self, client):
super().__init__()
self.client = client
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[BaseCallbackHandler] = None,
**kwargs: Any,
) -> str:
history = [
{"role": "system", "content": "You are an intelligent assistant."},
{"role": "user", "content": prompt},
]
completion = self.client.chat.completions.create(
model="crusoeai/Llama-3-8B-Instruct-262k-GGUF",
messages=history,
temperature=0.7,
stream=False, # Use stream=True for streaming responses
)
return completion.choices[0].message["content"]
async def _acall(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[BaseCallbackHandler] = None,
**kwargs: Any,
) -> str:
return await run_in_executor(
None,
self._call,
prompt,
stop,
run_manager.get_sync() if run_manager else None,
**kwargs,
)
def generate_prompt(
self,
prompts: List[str],
callbacks: Optional[List[BaseCallbackHandler]] = None,
tags: Optional[List[str]] = None,
metadata: Optional[Dict[str, Any]] = None,
run_name: Optional[str] = None,
**kwargs: Any,
) -> LLMResult:
# Remove callbacks from kwargs if it exists
kwargs.pop('callbacks', None)
generations = [[GenerationChunk(text="Generated response for: " + prompt)] for prompt in prompts]
return LLMResult(generations=generations)
async def agenerate_prompt(
self,
prompts: List[str],
callbacks: Optional[List[BaseCallbackHandler]] = None,
tags: Optional[List[str]] = None,
metadata: Optional[Dict[str, Any]] = None,
run_name: Optional[str] = None,
**kwargs: Any,
) -> LLMResult:
# Remove callbacks from kwargs if it exists
kwargs.pop('callbacks', None)
generations = [[GenerationChunk(text="Generated response for: " + prompt)] for prompt in prompts]
return LLMResult(generations=generations)
def predict(
self, text: str, *, stop: Optional[Sequence[str]] = None, **kwargs: Any
) -> str:
return self._call(text, stop=list(stop) if stop else None, **kwargs)
async def apredict(
self, text: str, *, stop: Optional[Sequence[str]] = None, **kwargs: Any
) -> str:
return await self._acall(text, stop=list(stop) if stop else None, **kwargs)
def predict_messages(
self,
messages: List[BaseMessage],
*,
stop: Optional[Sequence[str]] = None,
**kwargs: Any,
) -> BaseMessage:
text = get_buffer_string(messages)
content = self._call(text, stop=list(stop) if stop else None, **kwargs)
return AIMessage(content=content)
async def apredict_messages(
self,
messages: List[BaseMessage],
*,
stop: Optional[Sequence[str]] = None,
**kwargs: Any,
) -> BaseMessage:
text = get_buffer_string(messages)
content = await self._acall(text, stop=list(stop) if stop else None, **kwargs)
return AIMessage(content=content)
def invoke(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[BaseCallbackHandler] = None,
**kwargs: Any,
) -> str:
return self._call(prompt, stop, run_manager, **kwargs)
print("---------------1--------------")
local_model = LocalModel(client=client)
print("---------------2--------------")
# Create the LLMChain using the custom local LLM
chain = load_qa_chain(local_model, chain_type="stuff")
print("---------------4--------------")
# Usage
query = "What is this collection of PDFs about?"
docs = docsearch.similarity_search(query)
inputs = {
"input_documents": docs,
"question": query
}
print(chain.invoke(inputs))
print("---------------5--------------") This should resolve the |
Beta Was this translation helpful? Give feedback.
All reactions
-
@dosu
|
Beta Was this translation helpful? Give feedback.
All reactions
-
To resolve the Here is how you can modify the def generate_prompt(
self,
prompts: List[str],
callbacks: Optional[List[BaseCallbackHandler]] = None,
tags: Optional[List[str]] = None,
metadata: Optional[Dict[str, Any]] = None,
run_name: Optional[str] = None,
**kwargs: Any,
) -> LLMResult:
# Remove callbacks from kwargs if it exists
kwargs.pop('callbacks', None)
generations = [[GenerationChunk(text="Generated response for: " + prompt)] for prompt in prompts]
return LLMResult(generations=generations)
async def agenerate_prompt(
self,
prompts: List[str],
callbacks: Optional[List[BaseCallbackHandler]] = None,
tags: Optional[List[str]] = None,
metadata: Optional[Dict[str, Any]] = None,
run_name: Optional[str] = None,
**kwargs: Any,
) -> LLMResult:
# Remove callbacks from kwargs if it exists
kwargs.pop('callbacks', None)
generations = [[GenerationChunk(text="Generated response for: " + prompt)] for prompt in prompts]
return LLMResult(generations=generations) Here is the updated code with these changes: from typing import List, Optional, Dict, Any, Sequence
from pydantic import BaseModel
from langchain_core.language_models import BaseLanguageModel
from langchain_core.messages import AIMessage, BaseMessage
from langchain_core.outputs.generation import GenerationChunk
from langchain.schema import LLMResult
from langchain.callbacks.base import BaseCallbackHandler
from langchain_core.runnables import Runnable
from langchain.chains.question_answering import load_qa_chain
from PyPDF2 import PdfReader
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import FAISS
from openai import OpenAI
#----------------------------------------------------------------------------------------------------
pdf_paths = [r"pdf1", r"pdf2"] # List your PDF paths here
all_texts = []
metadata = []
for pdf_path in pdf_paths:
reader = PdfReader(pdf_path)
raw_text = ""
for page in reader.pages:
text = page.extract_text()
if text:
raw_text += text
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=1200,
chunk_overlap=250,
length_function=len,
)
texts = text_splitter.split_text(raw_text)
all_texts.extend(texts)
metadata.extend([{"source": pdf_path}] * len(texts))
embeddings = OpenAIEmbeddings()
docsearch = FAISS.from_texts(all_texts, embeddings, metadatas=metadata)
# chain = load_qa_chain(OpenAI(), chain_type="stuff")
#----------------------------------------------------------------------------------------------------
# Point to the local server (Llama3 served on LM Studio locally)
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")
# LocalModel class
class LocalModel(BaseLanguageModel):
client: Any
class Config:
arbitrary_types_allowed = True # Allow arbitrary types
def __init__(self, client):
super().__init__()
self.client = client
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[BaseCallbackHandler] = None,
**kwargs: Any,
) -> str:
history = [
{"role": "system", "content": "You are an intelligent assistant."},
{"role": "user", "content": prompt},
]
completion = self.client.chat.completions.create(
model="crusoeai/Llama-3-8B-Instruct-262k-GGUF",
messages=history,
temperature=0.7,
stream=False, # Use stream=True for streaming responses
)
return completion.choices[0].message["content"]
async def _acall(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[BaseCallbackHandler] = None,
**kwargs: Any,
) -> str:
return await run_in_executor(
None,
self._call,
prompt,
stop,
run_manager.get_sync() if run_manager else None,
**kwargs,
)
def generate_prompt(
self,
prompts: List[str],
callbacks: Optional[List[BaseCallbackHandler]] = None,
tags: Optional[List[str]] = None,
metadata: Optional[Dict[str, Any]] = None,
run_name: Optional[str] = None,
**kwargs: Any,
) -> LLMResult:
# Remove callbacks from kwargs if it exists
kwargs.pop('callbacks', None)
generations = [[GenerationChunk(text="Generated response for: " + prompt)] for prompt in prompts]
return LLMResult(generations=generations)
async def agenerate_prompt(
self,
prompts: List[str],
callbacks: Optional[List[BaseCallbackHandler]] = None,
tags: Optional[List[str]] = None,
metadata: Optional[Dict[str, Any]] = None,
run_name: Optional[str] = None,
**kwargs: Any,
) -> LLMResult:
# Remove callbacks from kwargs if it exists
kwargs.pop('callbacks', None)
generations = [[GenerationChunk(text="Generated response for: " + prompt)] for prompt in prompts]
return LLMResult(generations=generations)
def predict(
self, text: str, *, stop: Optional[Sequence[str]] = None, **kwargs: Any
) -> str:
return self._call(text, stop=list(stop) if stop else None, **kwargs)
async def apredict(
self, text: str, *, stop: Optional[Sequence[str]] = None, **kwargs: Any
) -> str:
return await self._acall(text, stop=list(stop) if stop else None, **kwargs)
def predict_messages(
self,
messages: List[BaseMessage],
*,
stop: Optional[Sequence[str]] = None,
**kwargs: Any,
) -> BaseMessage:
text = get_buffer_string(messages)
content = self._call(text, stop=list(stop) if stop else None, **kwargs)
return AIMessage(content=content)
async def apredict_messages(
self,
messages: List[BaseMessage],
*,
stop: Optional[Sequence[str]] = None,
**kwargs: Any,
) -> BaseMessage:
text = get_buffer_string(messages)
content = await self._acall(text, stop=list(stop) if stop else None, **kwargs)
return AIMessage(content=content)
def invoke(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[BaseCallbackHandler] = None,
**kwargs: Any,
) -> str:
return self._call(prompt, stop, run_manager, **kwargs)
print("---------------1--------------")
local_model = LocalModel(client=client)
print("---------------2--------------")
# Create the LLMChain using the custom local LLM
chain = load_qa_chain(local_model, chain_type="stuff")
print("---------------4--------------")
# Usage
query = "What is this collection of PDFs about?"
docs = docsearch.similarity_search(query)
inputs = {
"input_documents": docs,
"question": query
}
print(chain.invoke(inputs))
print("---------------5--------------") This should resolve the |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Checked other resources
Commit to Help
Example Code
chain = load_qa_chain(local_llm, chain_type="stuff") #Issue arise here
#usage
query = "What is this collection of PDFs about?"
docs = docsearch.similarity_search(query)
print(chain.run(input_documents=docs, question=query))
{
"model": "TheBloke/dolphin-2.2.1-mistral-7B-GGUF",
"api_type": "openai",
"base_url": "http://localhost:1234/v1",
"api_key": "lm-studio"
}
Beta Was this translation helpful? Give feedback.
All reactions