目录

背景

参考

实现

调用


背景

在公司有大模型可以通过 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)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐