LangGraph 第一章 llm格式化输出

基于图对话案例baseChatNode

from typing import TypedDict, Annotated
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages


class State(TypedDict):
    messages: Annotated[list, add_messages]

def chatbot_node(state: State) -> list:
    return {
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": "Here's an image:",
                        "cache_control": {"type": "ephemeral"},
                    },
                    {
                        "type": "image",
                        "source": {
                            "type": "base64",
                            "media_type": "image/jpeg",
                            "data": "1234",
                        },
                    },
                ],
            },
        ],
    }

builder = StateGraph(State)
builder.add_node("chatbot", chatbot_node)
builder.set_entry_point("chatbot")
builder.set_finish_point("chatbot")
graph = builder.compile()

def stream_graph_updates(user_input: str):
    for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):
        print("Event:", event)
        for attr in event:
            value = event[attr]
            print("Value:", value)
            print("Assistant:", value["messages"][-1][ "content"])
while True:
    try:
        user_input = input("User: ")
        if user_input.lower() in ["quit", "exit", "q"]:
            print("Goodbye!")
            break
        stream_graph_updates(user_input)
    except:
        # fallback if input() is not available
        user_input = "What do you know about LangGraph?"
        print("User: " + user_input)
        stream_graph_updates(user_input)
        break

如何格式化输出内容

继承BaseModel定义结构


class QuestionTemp(BaseModel):
    stem: str = Field(
        description="题目题干"
    )
    options: List[str] = Field(
        description="题目选项"
    )
    solve: List[str] = Field(
        description="解答"
    )

完整代码

from typing import Annotated, List, Literal

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
from pydantic import Field
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
OPENAI_API_KEY= "lm-studio"
OPENAI_MODEL_NAME = "qwen2.5-3b-instruct"
OPENAI_BASE_URL="http://localhost:9999/v1"
llm = ChatOpenAI(
    openai_api_key=OPENAI_API_KEY,
    model_name=OPENAI_MODEL_NAME,
    openai_api_base=OPENAI_BASE_URL,
    temperature=1
)

class QuestionOption(BaseModel):
    option: str = Field(
        description="选项[A,B,C,D]"
    )
    content: str = Field(
        description="选项内容"
    )
class QuestionTemp(BaseModel):
    stem: str = Field(
        description="题目题干"
    )
    options: List[str] = Field(
        description="题目选项"
    )
    solve: List[str] = Field(
        description="解答"
    )
print(QuestionTemp.model_json_schema())
evaluator = llm.with_structured_output(QuestionTemp)
messages = [
                SystemMessage(
                    content="你是一个高等数学老师,你需要根据用户的问题,生成题目,题目需要包含题干,选项,解答,格式化输出。"
                ),
                HumanMessage(
                    content="请生成10道2023年的高等数学题目,题目需要包含题干,选项,解答,格式化输出。"
                )
            ]
contents = evaluator.invoke(messages)
print("文档",contents)

输出 

{'properties': {'stem': {'description': '题目题干', 'title': 'Stem', 'type': 'string'}, 'options': {'description': '题目选项', 'items': {'type': 'string'}, 'title': 'Options', 'type': 'array'}, 'solve': {'description': '解答', 'items': {'type': 'string'}, 'title': 'Solve', 'type': 'array'}}, 'required': ['stem', 'options', 'solve'], 'title': 'QuestionTemp', 'type': 'object'}


——————————————————————————————————————————————————————————————————————————————————————
文档 stem='若\x0crac{π}{4}≤θ<\x0crac{5π}{6},则函数f(θ)=\x0crac{1+sinθ-cos^2θ}{cos^2θ-1}-3tanθ的值域是?' options=['[-3, 1]', '[1, +∞)', '(-4, -1)', '[-4, -1]'] solve=['f(θ)=\x0crac{1+sinθ-cos^2θ}{cos^2θ-1}-3tanθ=\x0crac{sinθ-(1-sin^{2}θ)}{cos^2θ-1}-3\times \x0crac {sinθ}{cosθ}=-3\times \x0crac {sinθ}{cosθ}$\n\n若取t=tanθ,则有$f(θ)=-3t$。\n又由于$\x0crac{π}{4}≤θ<\x0crac{5π}{6},则-2<-tanθ≤-\x0crac{\root {}\thinspace {} \x08rack {1}}{3}$\n故:$-6<-3\times tanθ≤3$。', '答案是:[-4, -1]']

### 如何使大型语言模型以格式化的方式输出内容 为了实现LLM格式化输出,可以通过设计特定提示词来引导模型按照期望的形式生成文本。这不仅限于简单的文本结构,还可以包括表格、列表以及代码片段等形式。 对于希望获得结构化的输出结果,比如JSON或XML格式的数据时,在构建提示语句时应明确指定所需的输出格式[^1]。例如: ```json { "instruction": "请将下面的信息转换成JSON格式。", "input": "姓名:张三 年龄:30 职业:工程师", "output": { "name": "张三", "age": 30, "occupation": "工程师" } } ``` 当目标是创建有序或无序列表时,则可以在提示中给出具体的例子作为指导[^2]。如下所示: - **无序列表** ```plaintext 将下列项目转为Markdown风格的无序列表: 苹果 香蕉 橙子 输出: - 苹果 - 香蕉 - 橙子 ``` - **有序列表** ```plaintext 把这些水果按字母顺序排列并用编号列出: 樱桃 李子 柠檬 输出: 1. 樱桃 2. 柠檬 3. 李子 ``` 另外,如果目的是让LLM返回编程代码,那么应当指明所使用的编程语言,并提供必要的上下文信息以便更好地理解需求。这里有一个Python函数定义的例子: ```python def calculate_area(radius): """给定半径计算圆面积""" pi = 3.14159 area = pi * (radius ** 2) return round(area, 2) print(calculate_area(5)) ``` 通过这种方式,可以有效地控制和定制来自LLM的内容呈现形式,从而满足不同应用场景下的特殊要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值