目录
背景
参考
实现
调用
背景
在公司有大模型可以通过 api 方式调用,想使用 langchain 框架调用,langchina 已经封装好大部分模型了,但自己公司的模型不支持,想使用,相当于自定义模型
参考
Custom Chat Model | 🦜️🔗 LangChain
官方文档说,_generate, _llm_type 两个方法是必须的
之前一直使用通义,所以参考了他的写法,langchain 中调用通义的代码:
from langchain_community.llms import Tongyi
参考 Tongyi 类实现了一下
实现
由于这里是演示,所以假如我公司的模型的通义,langchain又不支持,我需要自定义来在langchian中使用
from langchain_core.language_models.llms import BaseLLM
from langchain_core.outputs import Generation, GenerationChunk, LLMResult
from langchain_core.callbacks import (
AsyncCallbackManagerForLLMRun,
CallbackManagerForLLMRun,
)
from typing import (
Any,
AsyncIterable,
AsyncIterator,
Callable,
Dict,
Iterable,
Iterator,
List,
Mapping,
Optional,
Tuple,
TypeVar,
)
class CusotomLLM(BaseLLM):
model_name: str = 'test_model'
@property
def _llm_type(self) -> str:
"""Return type of llm."""
return "test_model"
def _generate(
self,
prompts: List[str],
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> LLMResult:
generations = []
for prompt in prompts:
generations.append(
[Generation(**self.generations_text(prompt))]
)
return LLMResult(
generations=generations,
llm_output={
"model_name": self.model_name,
},
)
def generations_text(self, prompt):
import random
from http import HTTPStatus
from dashscope import Generation
messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': prompt}]
response = Generation.call(model="qwen-turbo",
messages=messages,
# 设置随机数种子seed,如果没有设置,则随机数种子默认为1234
seed=random.randint(1, 10000),
# 将输出设置为"message"格式
result_format='message')
if response.status_code == HTTPStatus.OK:
return {'text': response['output']['choices'][0]['message']['content']}
else:
return {'text': ('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
))}
_generate:重写了这个方法
generations_text:自定义方法,也就是调用自己公司api逻辑的代码,可以这样理解,这里我是演示,调用通义的代码是从官网扣下来的
调用
import os
from dotenv import load_dotenv
from langchain_community.llms import Tongyi
load_dotenv('key.env') # 指定加载 env 文件
key = os.getenv('DASHSCOPE_API_KEY') # 获得指定环境变量
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"] # 获得指定环境变量
# model = Tongyi(temperature=1)
# 自定义模型
from text import CusotomLLM
model = CusotomLLM()
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
def base_llm_chain(model, prompt, **kwargs):
"""
https://python.langchain.com/docs/modules/model_io/prompts/composition/#string-prompt-composition
基础链,带有变量的 prompt ,model 两个组成链
:param model: llm
:param prompt: prompt 其中的变量是用 {} 括起来的
:param kwargs: prompt 中的变量
:return:
"""
prompt = PromptTemplate.from_template(prompt)
chain = LLMChain(llm=model, prompt=prompt)
res = chain.run(kwargs)
return res
prompt = """介绍你自己"""
res = base_llm_chain(model, prompt)
print(res)