🦜LangChain
约 1365 字大约 5 分钟
2026-03-10
Zero-Shot && Few-Shot
# Zero-Shot
题目:计算 7 × 8(没有示例,直接算。)
# Few-Shot
3 × 4 = 12
5 × 6 = 30
7 × 8 = ?注
Zero-shot:无提示,语言描述任务,依赖模型预训练知识回答
Few-shot:给与模型少量示例,引导模型对齐示例输出结果
Langchain 环境部署
pip install langchain langchain-community langchain-ollama dashscope chromadbRAG
检索增强生成

余弦相似度 不同的维度,不同方向的得分
Embedding Models
01 GLM 模型调用(ChatOpenAI)
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
llm = ChatOpenAI(
model="glm-5",
openai_api_key="xxx",
openai_api_base="https://open.bigmodel.cn/api/paas/v4/",
)
messages = [
SystemMessage(content="你是我的人工智能助手。"),
AIMessage(content="好的。"),
HumanMessage(content="你好,评价一下Hello,World对于编程人的意义,简短说明即可!"),
]
for chunk in llm.stream(messages):
if chunk.content:
print(chunk.content, end="", flush=True)核心点:
invoke()适合一次性返回stream()适合流式输出- 消息可用对象形式,也可用
("role", "content")元组形式
02 向量模型(OllamaEmbeddings)
from langchain_ollama import OllamaEmbeddings
model = OllamaEmbeddings(model="qwen3-embedding:4b")
print(model.embed_query("I like you!"))
print(model.embed_documents(["i", "like", "you"]))核心点:
embed_query:单条文本向量化embed_documents:批量文本向量化
03 提示词模板(PromptTemplate)
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="glm-5",
openai_api_key="xxx",
openai_api_base="https://open.bigmodel.cn/api/paas/v4/",
)
prompt_template = PromptTemplate.from_template(
"我的朋友生了个女儿,他姓{name},你认为取什么名字好听,简单回答。"
)
chain = prompt_template | model
res = chain.invoke(name="张")核心点:
- 模板负责变量插值
|直接拼成链,减少手动拼字符串
04 少样本提示(FewShotPromptTemplate)
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="glm-5",
openai_api_key="xxx",
openai_api_base="https://open.bigmodel.cn/api/paas/v4/",
)
examples = [
{"question": "2+2", "answer": "4"},
{"question": "3+3", "answer": "6"},
]
example_prompt = PromptTemplate.from_template(
"Question: {question}\nAnswer: {answer}"
)
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="Question: {problem}\nAnswer:",
input_variables=["problem"],
)
chain = prompt | model
response = chain.invoke({"problem": "5+5"})核心点:
- 用示例约束输出格式
suffix是真正要回答的问题入口
05 对话模板(ChatPromptTemplate)
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt_template = ChatPromptTemplate.from_messages([
("system", "你是一个有帮助的AI助手"),
MessagesPlaceholder("history"),
("human", "1 + 1 = ?")
])
history = [
("ai", "你好"),
("human", "你好,AI助手!"),
]
messages = prompt_template.invoke({
"history": history
})
print(messages.to_string())核心点:
MessagesPlaceholder("history")用于动态注入历史对话- 适合多轮对话场景
06 字符串解析链(StrOutputParser)
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="gpt-4o-mini",
temperature=0
)
draft_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的写作助手。"),
("human", "请根据下面主题写一段简洁介绍:{topic}")
])
polish_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的文本润色助手。"),
("human", "请将下面这段文字润色得更自然、更通顺:\n\n{text}")
])
parser = StrOutputParser()
draft_chain = draft_prompt | model | parser
final_chain = polish_prompt | model | parser
draft_text = draft_chain.invoke({"topic": "LangChain 是什么"})
final_text = final_chain.invoke({"text": draft_text})核心点:
StrOutputParser直接把模型输出转成纯字符串- 两段链串联时,可先“生成”再“润色”
07 JSON 解析链(JsonOutputParser)
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="gpt-4o-mini",
temperature=0
)
parser = JsonOutputParser()
prompt = ChatPromptTemplate.from_template(
"""
请根据用户输入的信息生成JSON:
{{
"name": "姓名",
"age": 年龄,
"job": "职业"
}}
用户输入:{text}
"""
)
chain = prompt | model | parser
result = chain.invoke({"text": "张三,今年20岁,是一名程序员"})核心点:
JsonOutputParser让输出直接变为结构化对象- 适合后续接接口、数据库或自动化流程
08 向量检索 + 回答(最小 RAG 闭环)
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_ollama import OllamaEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="glm-5",
openai_api_key="xxx",
openai_api_base="https://open.bigmodel.cn/api/paas/v4/",
)
prompt = ChatPromptTemplate.from_messages([
("system", "请根据提供的参考资料回答用户问题。\n参考资料:{context}"),
("human", "问题:{input}")
])
vector_store = InMemoryVectorStore(
embedding=OllamaEmbeddings(model="qwen3-embedding:4b")
)
vector_store.add_texts([
"减肥要控制饮食,多吃蔬菜水果。",
"减脂期间要减少高热量食物摄入。",
"跑步是一种非常好的有氧运动。",
"Hello, World是编程入门的经典示例。",
"Python是一种非常流行的编程语言。"
])
input_text = "怎么减肥?"
docs = vector_store.similarity_search(input_text, k=2)
context = "\n".join([doc.page_content for doc in docs])
chain = prompt | model | StrOutputParser()
result = chain.invoke({
"context": context,
"input": input_text
})核心点:
InMemoryVectorStore适合本地实验和教学- 检索出的
context再喂给模型,就是最小可运行 RAG
09 Runnable 链式检索(RunnablePassthrough)
这一节比上一个 RAG 示例更像 LangChain 的标准写法。重点不是“先查再问”,而是把检索、上下文组装、Prompt、模型、解析器串成一个完整 Runnable。
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_ollama import OllamaEmbeddings
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="glm-5",
openai_api_key="xxx",
openai_api_base="https://open.bigmodel.cn/api/paas/v4/",
)
prompt = ChatPromptTemplate.from_messages(
[
("system", "以我提供的已知参考资料为主,简洁和专业的回答用户问题。参考资料:{context}。"),
("user", "用户提问:{input}"),
]
)
vector_store = InMemoryVectorStore(
embedding=OllamaEmbeddings(model="qwen3-embedding:4b")
)
vector_store.add_texts(
[
"减肥就是要少吃多练",
"在减脂期间吃东西很重要,清淡少油控制卡路里摄入并运动起来",
"跑步是很好的运动哦",
]
)
def format_docs(docs):
return "\n".join(doc.page_content for doc in docs)
retriever = vector_store.as_retriever(search_kwargs={"k": 2})
chain = (
{"input": RunnablePassthrough(), "context": retriever | format_docs}
| prompt
| model
| StrOutputParser()
)
result = chain.invoke("怎么减肥?")
print(result)链路图(Mermaid)
核心点:
RunnablePassthrough()保留原始输入,给prompt的input字段直接复用retriever | format_docs负责把检索结果转成可注入 Prompt 的上下文字符串- 字典并行组装出
input和context后,再整体流向prompt | model | parser
