Ollama + Langchain
Local llm์ ์ฑ๋ฅ์ด ๋๋ ์ด ์ข์์ง๋ฉฐ ์ด์ ๋ 8b์ด์์ ๋ชจ๋ธ ์ ๋๋ฉด ํ๊ตญ์ด instruction์ด ์๋์ด CoT๋ฅผ ํ ์ ์๊ฒ ๋์๋ค. ๊ฐ๋จํ ์์ ๋ฅผ ํตํด ์ด๋ฆฌ๋ก ์ ๋ฆฌ๋ก ํ๋ LLM์ ์ด๋ป๊ฒ ์ ์ดํ๋ ์ง ์์๋ณด์.
1. Ollama cpp ๋ชจ๋ธ ์ค ์ต๊ทผ์ ๊ณต๊ฐ๋ Gemma2 ์ฌ์ฉ
gemma2 ๋ชจ๋ธ ์ค ๊ธฐ๋ณธ ๋ชจ๋ธ์ 9b ๋ชจ๋ธ๋ก google์์ ๋ง๋ gemma์ ๋ฒ์ 2์ธ open source llm์ด๋ค. ํ๊ตญ์ด๋ ์ํด์ ๋ช ์๋๋ ํ๊ตญ์ด ์คํ Foundation ๋ชจ๋ธ์ด๋ค. google ๋ชจ๋ธ์ ํน์ง์ด Markdown์ผ๋ก output์ ๋ฐ์ ์ํ๋ ํํ๋ก ๋ ๋๊ฒ ๊ฐ๊ณตํด ๋ฐ์ ์์๋ค.
from langchain_community.llms import Ollama
ollama = Ollama(model="gemma2:latest",temperature=0, verbose=True)
2. Langchain์ BooleanOutputParser
Langchain์ Outputparser๋ฅผ ํตํด Prompt์ ๋ต๋ณ Type์ ์ง์ ํ ์ ์๋ค.
class BooleanOutputParser(BaseOutputParser[bool]):
"""Parse the output of an LLM call to a boolean."""
true_val: str = "YES"
"""The string value that should be parsed as True."""
false_val: str = "NO"
"""The string value that should be parsed as False."""
def parse(self, text: str) -> bool:
"""Parse the output of an LLM call to a boolean.
Args:
text: output of a language model
Returns:
boolean
"""
regexp = rf"\b({self.true_val}|{self.false_val})\b"
truthy = {
val.upper()
for val in re.findall(regexp, text, flags=re.IGNORECASE | re.MULTILINE)
}
if self.true_val.upper() in truthy:
if self.false_val.upper() in truthy:
raise ValueError(
f"Ambiguous response. Both {self.true_val} and {self.false_val} "
f"in received: {text}."
)
return True
elif self.false_val.upper() in truthy:
if self.true_val.upper() in truthy:
raise ValueError(
f"Ambiguous response. Both {self.true_val} and {self.false_val} "
f"in received: {text}."
)
return False
raise ValueError(
f"BooleanOutputParser expected output value to include either "
f"{self.true_val} or {self.false_val}. Received {text}."
)
@property
def _type(self) -> str:
"""Snake-case string identifier for an output parser type."""
return "boolean_output_parser"
Parser์ Class๋ฅผ ๋ณด๋ฉด Yesy / No๊ฐ prompt ๊ฒฐ๊ณผ์ ์์ผ๋ฉด boolean์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ฟ ์ค๋ค. Booleanparser๋ผ๊ณ ๋ต๋ณ์ True / False๋ก ๋ฐ๊ฒ ํ๋ฉด ์๋๋ค..
Result
๋ด๊ฐ ๋ฐ์ ์คํธ ๋ฉ์ธ์ง๋ฅผ ์ง์ ํ ์คํธ ํด๋ณด์๋ค. ์๋ While loop๋ฅผ ์ฌ์ฉํด llm์ด ์๋ชป๋ ๋ต๋ณ์ผ๋ก Booleanparser๊ฐ Error๋๋ ๊ฒ์ ๋ฐฉ์งํ ์์๋ค. ollama๋ฅผ ํตํด llm์ ์ฝ๊ฒ ์ธํผ๋ฐ์คํ๊ณ langchain์ผ๋ก ๋ด๊ฐ ์ํ๋ output์ผ๋ก ํจ์ํ ํ ์ ์์ด ๋ง์ ๊ฒ์ ์๋ํ ํ ์์๋ค.
๋ณต์กํ์ง๋ง ์ค์ํ์ง ์์ ๊ฒ๋ค์ ๋์์ผ๋ก ํ์ฉํ๊ธธ ์ถ์ฒํ๋ค. ๊ทธ ์ด์ ๋ GPT-4, SOTA LLM ๋ชจ๋ธ๋ 100% ์ผ๊ด๋๊ณ ์ ํํ ๋ต๋ณ์ ๋ด์ง ์๋๋ค.
from langchain_community.llms import Ollama
from langchain.output_parsers import BooleanOutputParser
from langchain_core.prompts import PromptTemplate
prompt = PromptTemplate(
template=
"Following are the questions to determine if the message is spam or not.\n"
"Does this message contain words such as stock, share price, investment, profit, surge, buy, sell?\n"
"Does this message guarantee high returns or promise quick investment profits?\n"
"Does this message urge immediate buying or investment?\n"
"Is this message sent from an untrusted source or using a suspicious email address?\n"
"Does this message contain spam-like phrases such as 'urgent', 'exclusive', 'guaranteed profit', 'insider information'\n?"
"If you think this message is one of the spam messages, please answer `Yes`.\n"
"If you think this message is not a spam message, please answer `No`.\n"
"{message}",
input_variables=["message"],
partial_variables={"format_instructions": format_instructions},
)
ollama = Ollama(model="gemma2:latest",temperature=0, verbose=True)
chain = (
prompt | ollama | BooleanOutputParser()
)
text = """
[Web๋ฐ์ ]
Chat GPT AI๊ฐ ์ถ์ฒํ๋ ์ฃผ์ ์ ์ ์ ๋ต์ ์ฐธ์ฌํ์ธ์.
ํฌ์ ์ฌ์ ์ ์์ํ๊ณ ์ถ์ผ์๋ค๋ฉด ์๋ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ
๋งค์ 5 ๊ฐ! ์ข
๋ชฉ๊ณผ ์ฃผ์ ์ ๋ฌธ ์ ์ ์ ๋ต์ ๋ฌด๋ฃ๋ก ๋ฐ์๋ณด์ธ์.
https://band.us/n/a
์ ํฌ๋ ๋ฐ ๋
๋ง์ ‘’1227%‘’ ๋ผ๋ ๋๋ผ์ด ์์ต์ ์ป์์ต๋๋ค. ์ด๊ฒ์ ์ซ์๊ฐ ์๋๋ผ ์ ํฌ๊ฐ ํฌ์ ์ ์ฌ๋ ฅ์ ๋ํ ๊ฐ๋ ฅํ ๋ฏฟ์๊ณผ ์ฝ์ ์
๋๋ค.
์ฌ๋ฌ๋ถ๋ค์ด ์ ๋ฌธ ์ ์ผ๋ก ์ฃผ์ ํฌ์๋ฅผ ํ ์ ์๋๋ก ์ต์ ๋คํด ๋์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
"""
result = chain.invoke(text)
result # True
์์ผ๋ก ์คํธ ์๋ ์ ๊ณ ๋ฐฐ์น๋ฅผ ๋ง๋ค ๊ณํ์ด๋ค.
'๐ ๏ธ Tools' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Jupyterhub] ๊ณ์ ์์ฑ ์ค๋ฅ (0) | 2024.08.15 |
---|---|
[Gemini] gemini calculate Tokenize in Locally (0) | 2024.07.06 |
[OpenAI] ๋ชจ๋ธ๋ณ ์ง์ ์ค๋จ ์์ ๋ ์ง, Model deprecations (0) | 2024.06.15 |
[draw.io] sql๋ฌธ ๊ฐ์ ธ์ค๊ธฐ (0) | 2024.06.03 |
[crewAI] Multi-agent Custormer Support Automation (3) (0) | 2024.05.25 |