首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2025-09-11 langchain学习-02 用langchain对大语言模型做自定义集成

2025-09-11 langchain学习-02 用langchain对大语言模型做自定义集成

原创
作者头像
用户11830194
发布2025-09-11 10:39:27
发布2025-09-11 10:39:27
3190
举报
文章被收录于专栏:langchainlangchain

为了后续方便对系统进行调试,需要使用langchain对大语言模型做自定义集成

这里使用智谱清言的ChatGLM作为例子

需要导入的包

代码语言:python
复制
import os
from langchain.llms.base import LLM
from langchain_core.callbacks.manager import CallbackManagerForLLMRun
from langchain_core.outputs import GenerationChunk
from typing import Any,List,Iterator,Optional
from zhipuai import ZhipuAI
  • zhipuai是智谱清言的SDK,用于创建与大模型对话的客户端实例,后续的API调用,发送问题,接收回答,都通过这个客户端进行。
  • LLM是langchain中所有语言模型类的父类,作为语言模型的标准。
  • CallbackManagerForLLMRun是可选的高级工具,用于在模型运行的各个阶段(开始、过程、结束、出错)执行一些例如记录日志、更新界面等操作。
  • GenerationChunk用于将数据包装成标准数据,_stream方法中,每次yield一小块流式数据时,不能直接给出一个裸字符串,要使用GenerationChunk包装后再yield。Gemini给出了一个奇妙比喻:GenerationChunk像一个标准信封。当你要寄一封很长的信(流式输出),邮局要求你把每一页信纸(每一小块文本)都分别装在一个标准信封里投递,而不是直接扔一堆散装的信纸。
  • typing是Python标准的“标签工具包”,不影响代码运行,极大增加代码的可读性:
  1. Any:表示“可以是任何类型”。
  2. List:表示“这是一个列表”。
  3. Iterator:表示“这是一个可以逐个产出数据的迭代器”(用在_stream的返回值上)。
  4. Optional:表示“这个参数可以是指定的类型,也可以是None(空值)”。

读取环境变量中的API Key

代码语言:python
复制
zhipu_api_key=os.getenv("ZHIPU_API_KEY")

定义自己的大语言模型类

代码语言:python
复制
class ChatGLM3(LLM):
  client:ZhipuAI=None

  def __init__(self,api_key:str=zhipu_api_key,**kwargs):
    super().__init__(**kwargs)
    self.client=ZhipuAI(api_key=api_key)

  @property
  def _llm_type(self)->str:
    return "ChatGLM3"
  
  def _call(
      self,
      prompt:str,
      stop:Optional[List[str]]=None,
      run_manager:Optional[CallbackManagerForLLMRun]=None,
      **kwargs:Any
  )->str:
    history=kwargs.get("history",[])
    messages=history+[{"role":"user","content":prompt}]
    respone=self.client.chat.completions.create(
      model='glm-3-turbo',
      messages=messages
    )
    result=respone.choices[0].message.content
    return result
  
  def _stream(
      self,
      prompt:str,
      stop:Optional[List[str]]=None,
      run_manager:Optional[CallbackManagerForLLMRun]=None,
      **kwargs:Any
  )->Iterator[GenerationChunk]:
    history=kwargs.get("history",[])
    messages=history+[{"role":"user","content":prompt}]
    respone=self.client.chat.completions.create(
      model='glm-3-turbo',
      messages=messages,
      stream=True
    )
    for chunk in respone:
      result=chunk.choices[0].delta.content
      yield GenerationChunk(text=result)

标准的自定义大语言模型类包含四个函数:

  1. 初始化函数,初始化LLM客户端
  2. 大语言模型类型函数,返回大语言模型的类型
  3. 非流式输出函数,使用invoke()调用,一次性返回模型的回答
  4. 流式输出函数,使用stream()调用,分次给出模型的回答

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需要导入的包
  • 读取环境变量中的API Key
  • 定义自己的大语言模型类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档