LangChain+LLM实战---模拟实现假的LLM
代码实现
from typing import Any, List, Mapping, Optional
from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.llms.base import LLM
import re
class TfboyLLM(LLM):
@property
def _llm_type(self) -> str:
return "custom"
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
) -> str:
print("问题:", prompt)
pattern = re.compile(r'^.*(\d+[*/+-]\d+).*$')
match = pattern.search(prompt)
if match:
result = eval(match.group(1))
elif "?" in prompt:
rep_args = {"我": "你", "你": "我", "吗": "", "?": "!"}
result = [(rep_args[c] if c in rep_args else c) for c in list(prompt)]
result = ''.join(result)
else:
result = "很抱歉,请换一种问法。比如:1+1等于几"
return result
@property
def _identifying_params(self) -> Mapping[str, Any]:
return {}
代码说明
TfboyLLM
继承了langchain.llms.base
的LLM
类。需要实现它的两个方法:
_call
: 主要的处理方法,对传来的prompt
问题分析,给他return
一个答案。_identifying_params
: 说明LLM
类中的参数和数值。本例中没有类的成员变量。其实关键
_call
中实现的逻辑:
- 收到
prompt
先打印出来。- 对问题正则匹配,规则为:[数字]+[运算符]+[数字]。匹配到,返回计算结果。匹配不到继续执行。
- 判断有没有[?]。如果有,则对文本中字符进行替换,规则为:我->你, 你->我, 吗->"", ?->!。
- 如果都不符合,就返回:“很抱歉,请换一种问法。比如:1+1等于几”。
构建完了之后,调用这个
TfboyLLM
也很简单,和调用OpenAI一样。
- llm = TfboyLLM()
- print("答案:",llm("我能问你问题吗?"))
输出结果
问题: 巴拉巴拉咕嘎咕嘎
-- 很抱歉,请换一种问法。比如:1+1等于几
问题: 我能问你问题吗?
-- 你能问我问题!
问题: 189+981是多少
-- 990
问题: 你能和我结婚吗?
-- 我能和你结婚!
问题: 开玩笑?
-- 开玩笑!