LangGraph--Agent常见的模式1(增强型,提示链)
智能体的常见模式一般和框架无关,我们也可以自己写代码实现,但是使用框架可以更好、更快的实现这些模式,而且数据流容易观察,下面就开始
增强型 LLM
#llm
from langchain_deepseek import ChatDeepSeek
import osllm = ChatDeepSeek(model="deepseek-chat",api_key=DEEPSEEK_API_KEY,#base_url="https://api.deepseek.com",#temperature=0.0
)
# 结构化输出
from pydantic import BaseModel, Field
class SearchQuery(BaseModel):search_query: str=Field(None, description="优化的网络搜索查询")justification:str = Field(None,justification="为什么这个查询与用户的请求相关")# 为LLM增加结构化输出的模式
structured_llm = llm.with_structured_output(SearchQuery)
# 调用增强型语言模型
output = structured_llm.invoke("Calcium CT 评分和高胆固醇有什么关系?中文回答")
print(output.search_query)
print(output.justification)
Calcium CT score 和高胆固醇 关系
查找关于冠状动脉钙化评分(Calcium CT score)与高胆固醇之间关系的科学研究和医学资料。
# 定义工具
def multiply(a:int,b:int)->int:return a*b
# 增强LLM(大型语言模型)的工具
llm_with_tools = llm.bind_tools([multiply])
# 触发大语言模型调用工具
msg = llm_with_tools.invoke("5乘6等于多少?")
#msg.tool_calls
print(msg.tool_calls)
[{'name': 'multiply', 'args': {'a': 5, 'b': 6}, 'id': 'call_0_bab7595e-99ef-40a5-8463-03bb77dfb58a', 'type': 'tool_call'}]
提示链
将任务分解为多个LLM调用具有益处。
from typing_extensions import TypedDict
# 定义Graph的状态
class State(TypedDict):topic:str # 笑话主题joke:str # 笑话improved_joke:str # 提升后的笑话final_joke:str # 最终笑话# 定义生成笑话节点
def generate_joke(state:State):""" 第一个大模型调用生成初始笑话"""msg = llm.invoke(f"写一个关于{state["topic"]}的简短笑话")return {"joke":msg.content}def improve_joke(state:State):"""第二个大模型提升笑话"""msg = llm.invoke(f"通过增加文字游戏使这个笑话更幽默: {state["joke"]}")return {"imporved_joke": msg.content}def final_joke(state:State):"""第三个模型完成最终笑话"""msg = llm.invoke(f"给这个笑话增加一个令人惊讶的转折:{state[improve_joke]}")return {"final_joke": msg.content}# 条件边函数,用于检查笑话是否有笑点
def check_punchline(state:State):"""检查笑话是否有笑点的门函数"""# 简单核对即可,笑话是否饱和"?" 或者"!"if "?" in state["joke"] or "!" in state["joke"]:return "Pass"return "Fail"
from langgraph.graph import StateGraph, START,END
from IPython.display import Image, display# 构建工作流
workflow = StateGraph(State)# 添加节点
workflow.add_node("generate_joke",generate_joke)
workflow.add_node("improve_joke",improve_joke)
workflow.add_node("sucess_joke",final_joke)# 为节点添加边
workflow.add_edge(START, "generate_joke")
workflow.add_conditional_edges("generate_joke",check_punchline,{"Pass":"improve_joke","Fail":END})
workflow.add_edge("improve_joke","sucess_joke")
workflow.add_edge("sucess_joke",END)chain = workflow.compile()
display(Image(chain.get_graph().draw_mermaid_png()))
state = chain.invoke({"topic":"狗"})
print("Initial joke:")
print(state["joke"])
print("\n--- --- ---\n")
if "improved_joke" in state:print("Improved joke:")print(state["improved_joke"])print("\n--- --- ---\n")print("Final joke:")print(state["sucess_joke"])
else:print("Joke failed quality gate - no punchline detected!")
Initial joke:
当然!这里有一个关于狗狗的简短笑话:---**主人**:我的狗真是个天才!我教它“装死”,它一学就会!
**朋友**:哇,怎么做到的?
**主人**:简单,我举起玩具枪“砰”一声,它就躺下了。
**朋友**:那……后来呢?
**主人**:后来它把我家沙发咬烂了,因为“复活”没教。 (笑点:狗狗只学了一半技能,结果“戏精”附体😂) --- 需要更冷或更可爱的版本吗? 😄--- --- ---Joke failed quality gate - no punchline detected!