首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2025-09-13 langchain学习-06 输出解析器:csv解析器

2025-09-13 langchain学习-06 输出解析器:csv解析器

原创
作者头像
用户11830194
发布2025-09-13 17:50:52
发布2025-09-13 17:50:52
2250
举报
文章被收录于专栏:langchainlangchain

为了让大模型输出的结果按照某种特定格式输出,可以使用输出解析器

首先把我们前面写好的一个对话模型复制进来

代码语言:python
复制
import os
from zhipuai import ZhipuAI
from typing import Any,Iterator,List,Optional


#对话模型基类
from langchain.chat_models.base import BaseChatModel

#提示词模板
from langchain.prompts.chat import ChatPromptTemplate,MessagesPlaceholder
from langchain.prompts import SystemMessagePromptTemplate,HumanMessagePromptTemplate

#消息种类
from langchain.schema import (
  AIMessage,
  BaseMessage,
  ChatResult,
  ChatGeneration,
  HumanMessage,
  SystemMessage
)

#流式输出返回类型
from langchain.schema.output import ChatGenerationChunk
from langchain.schema.messages import AIMessageChunk

#过程管理
from langchain_core.callbacks.manager import CallbackManagerForLLMRun

#输出解析器
from langchain.output_parsers import CommaSeparatedListOutputParser


zhipu_api_key=os.getenv("ZHIPU_API_KEY")

def Msg2Dict(message:List[BaseMessage])->List[dict]:
  result=[]
  for msg in message:
    if isinstance(msg,AIMessage):
      role="assistant"
    elif isinstance(msg,SystemMessage):
      role="system"
    else:
      role="user"
    result.append({"role":role,"content":msg.content})
  return result

class ChatGLM3(BaseChatModel):
  client:ZhipuAI=None

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

  @property
  def _llm_type(self)->str:
    return "ChatGLM3"

  def _generate(
      self,
      message:List[BaseMessage],
      stop:Optional[List[str]]=None,
      run_manager:Optional[CallbackManagerForLLMRun]=None,
      **kwargs:Any
  )->ChatResult:
    messages=Msg2Dict(message=message)
    response=self.client.chat.completions.create(
      model='glm-3-turbo',
      messages=messages
      **kwargs
    )
    result=response.choices[0].message.content
    return ChatResult(generations=[ChatGeneration(message=AIMessage(result))])
  
  def _stream(
      self,
      message:List[BaseMessage],
      stop:Optional[List[str]]=None,
      run_manager:Optional[CallbackManagerForLLMRun]=None,
      **kwargs:Any
  )->Iterator[ChatGenerationChunk]:
    messages=Msg2Dict(message=message)
    response=self.client.chat.completions.create(
      model='glm-3-turbo',
      messages=messages,
      stream=True,
      **kwargs
    )
    for chunk in response:
      result=chunk.choices[0].delta.content
      yield ChatGenerationChunk(message=AIMessageChunk(content=result))

在此基础上验证csv解析器

代码语言:python
复制
from langchain.output_parser import CommaSeparatedListOutputParser

def main()
    #创建解析器实例
    output_parser=CommaSeparatedListOutputParser()
    #获取格式化指令
    format_instructions=out_parser.get_format_instructions()
    #创建包含格式化指令的提示词模板
    chat_template=ChatPromptTemplate.from_message(
        [
            SystemPromptTemplate.from_template("你是一个提示词生成小助手,可以根据用户输入的主题给出关键词。\n{instructions}"),
            HumanPromptTemplate.from_temolate("以{subject}为主题给出五个关键词")
        ]
    )
    #将格式化指令注入其中
    final_template=chat_template.partial(instructions=format_instructions)
    
    #形成提示词
    Prompt=final_template.format_prompt(subject="RAG技术").to_messages()
    
    #下面放进glm里看看结果
    glm=ChatGLM3()
    
    full_response="
    for chunk in glm.stream(prompt):
        print(chunk.content,end="",Flush=True)
        full_response+=chunk.content
    print()
    print(output_parser.parse(full_response))
    
if __name__=='__main__':
    main()

对比格式化前和格式化后的两种输出

格式化前(上),格式化后(下)
格式化前(上),格式化后(下)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档