Source code for rllm.llm.llm_module.langchain_llm
from typing import Callable, Optional, Sequence
from rllm.llm.types import (
LLMMetadata,
ChatMessage,
ChatResponse,
CompletionResponse,
)
from rllm.llm.llm_module.general_llm import LLM
from rllm.llm.parser.base import BaseOutputParser
from rllm.llm.prompt.utils import completion_response_to_chat_response
from langchain_core.language_models import BaseLanguageModel
[docs]
class LangChainLLM(LLM):
"""Adapter for a LangChain LLM.
Examples:
`pip install llama-index-llms-langchain`
```python
from langchain_openai import ChatOpenAI
from rllm.llm.llm_module.langchain import LangChainLLM
llm = LangChainLLM(llm=ChatOpenAI(...))
response_gen = llm.complete("What is the meaning of life?")
```
"""
def __init__(
self,
llm: "BaseLanguageModel",
system_prompt: Optional[str] = None,
messages_to_prompt: Optional[Callable[[Sequence[ChatMessage]], str]] = None,
completion_to_prompt: Optional[Callable[[str], str]] = None,
output_parser: Optional[BaseOutputParser] = None,
) -> None:
self._llm = llm
super().__init__(
system_prompt=system_prompt,
messages_to_prompt=messages_to_prompt,
completion_to_prompt=completion_to_prompt,
output_parser=output_parser,
)
@classmethod
def class_name(cls) -> str:
return "LangChainLLM"
@property
def llm(self) -> "BaseLanguageModel":
return self._llm
@property
def metadata(self) -> LLMMetadata:
from rllm.llm.llm_module.langchain_utils import get_llm_metadata
return get_llm_metadata(self._llm)
[docs]
def chat(self, messages: Sequence[ChatMessage], **kwargs) -> ChatResponse:
from rllm.llm.llm_module.langchain_utils import (
from_lc_messages,
to_lc_messages,
)
if not self.metadata.is_chat_model:
prompt = self.messages_to_prompt(messages)
completion_response = self.complete(prompt, formatted=True, **kwargs)
return completion_response_to_chat_response(completion_response)
lc_messages = to_lc_messages(messages)
lc_message = self._llm.predict_messages(messages=lc_messages, **kwargs)
message = from_lc_messages([lc_message])[0]
return ChatResponse(message=message)
[docs]
def complete(
self, prompt: str, formatted: bool = False, **kwargs
) -> CompletionResponse:
if not formatted:
prompt = self.completion_to_prompt(prompt)
output_str = self._llm.invoke(prompt, **kwargs)
return CompletionResponse(text=output_str)
def embedding(self, inputs):
assert hasattr(self._llm, "embed_documents"), (
"An embedding model should be provided!"
"See https://python.langchain.com/v0.1/docs/integrations/text_embedding/"
) # noqa
if isinstance(inputs, str):
inputs = [inputs]
return self._llm.embed_documents(inputs)