目录
LangChain框架 Loader 、Vectorstores、Chain 应用-CSDN博客
另外一篇关于LangChain框架的应用
(Prompts)提示作用
作用:控制大语言模型(LLM)的输入,通过模板化指令引导模型生成更精准的输出。
关键功能:
结构化输入:将变量动态插入预定义的文本模板(如:
"写一首关于{topic}的诗"
)标准化输出:通过指令约束模型返回格式(如JSON、列表等)
上下文管理:整合示例(Few-shot)、系统消息等提升效果
典型工作流:
提示模板 → 代理接收 → 决策调用工具 → 整合结果 → 返回最终输出
Prompts 常见操作
基础 PromptTemplate 使用
from langchain.prompts import PromptTemplate
# 创建简单提示模板
template = "请用{language}写一个关于{topic}的函数"
prompt = PromptTemplate(
input_variables=["language", "topic"],
template=template
)
# 格式化提示
formatted_prompt = prompt.format(language="Python", topic="快速排序")
print(formatted_prompt)
########运行结果############
请用Python写一个关于快速排序的函数
Few-shot 提示模板
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
# 准备示例
examples = [
{"input": "高兴", "output": "笑容满面"},
{"input": "悲伤", "output": "泪流满面"}
]
# 创建单个示例模板
example_template = """
输入: {input}
输出: {output}"""
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template=example_template
)
# 创建Few-shot模板
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="将以下情感转换为成语描述:",
suffix="输入: {adjective}\n输出:",
input_variables=["adjective"]
)
print(few_shot_prompt.format(adjective="愤怒"))
################运行结果#######################
将以下情感转换为成语描述:
输入: 高兴
输出: 笑容满面
输入: 悲伤
输出: 泪流满面
输入: 愤怒
输出:
ChatPromptTemplate (对话提示模板)
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.schema import SystemMessage
# 创建聊天提示模板
chat_prompt = ChatPromptTemplate.from_messages([
SystemMessage(content="你是一个有帮助的AI助手"),
HumanMessagePromptTemplate.from_template("{user_input}")
])
formatted_chat = chat_prompt.format_messages(user_input="你好!")
print(formatted_chat)
################运行结果########################
[SystemMessage(content='你是一个有帮助的AI助手', additional_kwargs={}, response_metadata={}), HumanMessage(content='你好!', additional_kwargs={}, response_metadata={})]
(Agents)代理作用
作用:让LLM自主调用工具(Tools)完成复杂任务,实现动态决策和自动化流程。
关键功能:
工具集成:连接搜索API、计算器、数据库等外部工具
任务编排:自动决定何时调用哪个工具(如先搜索再计算)
多步骤推理:通过循环迭代解决需要多步操作的问题
Agents 常见操作
基础 Agent 使用
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain.llms import Ollama
# 初始化工具和LLM
llm = Ollama(temperature=0,model='qwen')
tools = load_tools(["serpapi","llm-math"], llm=llm)
# 创建代理
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 执行任务
agent.run("目前特斯拉的股价是多少?如果是100股,总价值是多少美元?")
自定义工具 Agent
from langchain.agents import tool
from langchain.agents import AgentType, initialize_agent
from langchain.llms import Ollama
# 定义自定义工具
@tool
def get_word_length(word: str) -> int:
"""返回单词的长度"""
return len(word)
# 初始化
llm = Ollama(temperature=0,model='qwen3')
tools = [get_word_length]
# 创建代理
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 使用代理
agent.run("单词'hello'的长度是多少?")
##################运行结果#####################
<think>
好的,用户问的是单词'hello'的长度是多少。我需要用提供的工具来解决这个问题。首先,我应该调用get_word_length工具,参数是'hello'。然后工具会返回这个单词的长度。我只需要把结果返回给用户就可以了。
</think>
Thought: 我需要确定单词'hello'的长度。可以使用get_word_length工具来获取这个信息。
Action: get_word_length
Action Input: hello
Observation: 5
Thought:<think>
Final Answer: 单词'hello'的长度是5。
高级应用示例
带记忆的对话代理
from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.llms import Ollama
from langchain.memory import ConversationBufferMemory
# 初始化带记忆的代理
llm = Ollama(temperature=0,model='qwen')
tools = load_tools(["llm-math"], llm=llm)
memory = ConversationBufferMemory(memory_key="chat_history")
agent = initialize_agent(
tools,
llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True
)
# 多轮对话
agent.run("3的平方是多少?")
agent.run("再加上7等于多少?")
###############运行结果#########################
Thought: Do I need to use a tool? Yes
Action: the action to take, should be one of [Calculator] ]
Action Input:
Observation: the action to take, should be one of [Calculator] ] is not a valid tool, try one of [Calculator].
Thought:Do I need to use a tool? No
AI: 3的平方是9.
```
> Finished chain.
> Entering new AgentExecutor chain...
AI: 再加上7等于14.
使用本地模型的代理
from langchain_community.llms import Ollama
from langchain.agents import tool, AgentType
from langchain.agents import initialize_agent
# 使用本地Ollama模型
llm = Ollama(model="qwen")
# 定义简单工具
@tool
def word_counter(text: str) -> int:
"""计算文本中的单词数量"""
return len(text.split())
# 创建代理
agent = initialize_agent(
[word_counter],
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
agent.run("数一数这句话有多少个单词: 'LangChain是一个强大的AI开发框架'")
############运行的结果#################
我应该使用word_counter()工具来计算文本中的单词数量。
Action: word_counter
Action Input: 'LangChain是一个强大的AI开发框架'
Observation: 1
Thought:根据观察结果,一句话只有一个单词。
Final Answer: 一句话只有一个单词。
结构化输出代理
from langchain.llms import Ollama
from langchain_core.tools import tool
from langchain.prompts import PromptTemplate
from langchain.agents import initialize_agent, AgentType
from langchain_community.llms import Ollama
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from typing import Any, Dict
import json
# 1. 定义更简单的输出结构
response_schemas = [
ResponseSchema(name="summary", description="文章的简要总结"),
ResponseSchema(name="keywords", type="list", description="提取的关键词列表"),
ResponseSchema(name="sentiment", description="情感分析结果,只能是positive/neutral/negative")
]
# 2. 创建自定义解析器处理Ollama输出
class OllamaOutputParser(StructuredOutputParser):
def parse(self, text: str) -> Dict[str, Any]:
try:
# 尝试从输出中提取JSON部分
start = text.find('{')
end = text.rfind('}') + 1
json_str = text[start:end]
return json.loads(json_str)
except Exception as e:
# 如果解析失败,返回默认结构
return {
"summary": "无法生成摘要",
"keywords": [],
"sentiment": "neutral"
}
output_parser = OllamaOutputParser.from_response_schemas(response_schemas)
# 3. 修改提示模板确保JSON格式输出
ANALYSIS_PROMPT = """请严格按以下要求分析文本:
文本:{text}
输出要求:
1. 必须使用JSON格式
2. 包含以下字段:
- summary: 50字以内摘要
- keywords: 3-5个关键词列表
- sentiment: 情感倾向(positive/neutral/negative)
返回的JSON必须用```json包裹:
```json
{{你的JSON输出}}
```"""
# 4. 创建工具
@tool
def analyze_text(text: str) -> Dict[str, Any]:
"""分析文本并返回结构化结果"""
prompt_template = PromptTemplate(
template=ANALYSIS_PROMPT,
input_variables=["text"],
partial_variables={
"format_instructions": output_parser.get_format_instructions()
}
)
formatted_prompt = prompt_template.format(text=text)
llm = Ollama(model="qwen3", temperature=0)
result = llm(formatted_prompt)
try:
return output_parser.parse(result)
except Exception as e:
print(f"解析失败: {e}")
return {
"summary": text[:50] + "...",
"keywords": ["LangChain"],
"sentiment": "neutral"
}
# 5. 创建并运行代理
agent = initialize_agent(
[analyze_text],
Ollama(model="qwen3", temperature=0),
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
handle_parsing_errors=True # 关键:处理解析错误
)
text = "LangChain是一个用于开发语言模型应用的框架。它简化了与LLMs的交互过程,提供了模块化组件,可以快速开发AI模型应用。"
result = agent.run(f"分析这段文本: {text}")
print(result)
################运行结果##################################
<think>
好的,我现在需要分析用户提供的关于LangChain的文本。首先,用户的问题是要分析这段文本,所以我要使用analyze_text工具。让我先仔细阅读一下文本内容。
文本内容是:“LangChain是一个用于开发语言模型应用的框架。它简化了与LLMs的交互过程,提供了模块化组件,可以快速开发AI模型应用。” 看起来这段文字在介绍LangChain的功能和优势。我需要确定用户的需求是什么,可能他们想了解LangChain的核心功能、它如何简化开发过程,或者它的主要特点。
接下来,我应该调用analyze_text工具来处理这段文本。工具会返回结构化的结果,比如关键词、主题、重要信息等。我需要确保输入的文本正确无误,然后等待工具的分析结果。根据返回的观察结果,我可以提取关键点,比如框架的用途、简化交互的过程、模块化组件以及快速开发应用的优势。最后,将这些信息整理成一个清晰、简洁的最终答案,回答用户的问题。
</think>
Thought: 我需要使用analyze_text工具来分析提供的文本内容。
Action: analyze_text
Action Input: LangChain是一个用于开发语言模型应用的框架。它简化了与LLMs的交互过程,提供了模块化组件,可以快速开发AI模型应用。
Observation: {'summary': 'LangChain是开发语言模型应用的框架,简化LLM交互,提供模块化组件以快速构建AI应用。', 'keywords': ['LangChain', '语言模型应用', 'LLMs交互', '模块化组件', 'AI应用开发'], 'sentiment': 'neutral'}
Thought:<think>
</think>
Final Answer: 这段文本介绍了LangChain是一个用于开发语言模型应用的框架,其核心功能包括简化与大型语言模型(LLMs)的交互过程,并通过模块化组件实现快速开发AI模型应用。关键词有LangChain、语言模型应用、LLMs交互、模块化组件和AI应用开发,整体语气中性。
> Finished chain.
这段文本介绍了LangChain是一个用于开发语言模型应用的框架,其核心功能包括简化与大型语言模型(LLMs)的交互过程,并通过模块化组件实现快速开发AI模型应用。关键词有LangChain、语言模型应用、LLMs交互、模块化组件和AI应用开发,整体语气中性。