LangChain 入门
什么是 LangChain?
LangChain 是一个用于构建 LLM(大语言模型)应用的 Python/JS 框架,它提供了:
- 标准化接口:统一调用 OpenAI、Anthropic、本地模型等
- 链式组合:将多个组件(Prompt → LLM → 输出解析)串联
- 记忆管理:支持对话历史的短期/长期记忆
- 工具调用:让 LLM 使用外部 API、搜索、计算等工具(Agent)
安装环境
Terminal window pip install langchain# 常见模型 provider(任选其一或多个)pip install langchain-openai # OpenAI GPTpip install langchain-anthropic # Claudepip install langchain-ollama # 本地模型# 其他常用依赖pip install langchain-community # 第三方集成pip install langchainhub # Prompt 模板库
1. Hello LangChain 基础示例
1.1 直接调用
from langchain_ollama import ChatOllamafrom langchain_core.messages import HumanMessage
llm = ChatOllama(model="qwen3:8b", temperature=0.8)response = llm.invoke([HumanMessage(content="你好,请介绍一下自己")])
print(response.content)结果:
你好!我叫通义千问,是通义实验室研发的超大规模语言模型。我的知识和能力来源于大量的文本数据训练,能够帮助用户完成多种任务,比如:
1. **回答问题**:无论是日常疑问还是专业领域的问题,我都可以提供参考答案。2. **创作文字**:包括写故事、写邮件、写剧本、写代码注释等。3. **逻辑推理**:帮助分析问题、解决数学题、编程问题等。4. **多语言支持**:我支持多种语言,包括中文、英文、日文、韩文等。5. **日常交流**:可以进行闲聊、提供建议、分享知识等。
我的目标是成为用户在学习、工作和生活中的智能助手,帮助他们更高效地获取信息和解决问题。如果你有任何问题或需要帮助,随时告诉我!😊1.2 使用 Prompt 模板调用
from langchain_core.prompts import ChatPromptTemplatefrom langchain_ollama import ChatOllama
# 创建模板prompt = ChatPromptTemplate.from_messages([ ("system", "你是一位专业的{role},用中文回答问题。"), ("human", "{question}")])
# 模型llm = ChatOllama(model="qwen3:8b", temperature=0.8)
# 组合成 Chain(管道操作符 |)chain = prompt | llm
# 运行result = chain.invoke({ "role": "Python 导师", "question": "有哪些基础变量?"})
print(result.content)2. 核心组件详解
2.1 Chain(链)
from langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_ollama import ChatOllama
# 模型llm = ChatOllama(model="qwen3:8b", temperature=0.8)
# 完整链条:Prompt -> LLM -> 字符串输出chain = ( ChatPromptTemplate.from_template("用一句话解释{concept}") | llm | StrOutputParser() # 提取纯文本)
output = chain.invoke({"concept": "递归函数"})
print(output)# 递归函数是一种通过调用自身来解决问题的方法,通常包含一个终止条件以防止无限循环。2.1 Memory(记忆)
from langchain.chains import ConversationChainfrom langchain_core.chat_history import InMemoryChatMessageHistoryfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_core.runnables import RunnableWithMessageHistoryfrom langchain_ollama import ChatOllama
# 1. 初始化模型llm = ChatOllama(model="qwen3:8b", temperature=0.8)
# 2. 定义提示模板(使用 MessagesPlaceholder 注入历史)prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个有用的助手。请用中文回答。"), MessagesPlaceholder(variable_name="history"), # 历史消息占位符 ("human", "{input}")])
# 3. 构建基础 chainchain = prompt | llm | StrOutputParser()
# 4. 存储历史会话store = {}
# 创建对话链def get_session_history(session_id: str) -> InMemoryChatMessageHistory: """根据 session_id 获取或创建对话历史""" if session_id not in store: store[session_id] = InMemoryChatMessageHistory() return store[session_id]
# 5. 包装为带历史记录的 Runnableconversation = RunnableWithMessageHistory( chain, get_session_history, input_messages_key="input", # 输入消息的键名 history_messages_key="history" # 历史消息的键名(与 MessagesPlaceholder 对应))
# 6. 使用方式(必须传入 config 指定 session_id)config = {"configurable": {"session_id": "user_123"}}
# 第一次对话response1 = conversation.invoke( {"input": "你好,我叫张三"}, config=config)
# 第二次对话(能记住名字)response2 = conversation.invoke( {"input": "我叫什么名字?"}, config=config)
print(response2)# 你好,张三!我刚刚确认了你的名字,很高兴认识你。有什么我可以帮你的吗?2.3 Agent(代理)
让 LLM 自主决策并使用工具:
from langchain_community.tools.tavily_search import TavilySearchResultsfrom langchain.agents import create_react_agent, AgentExecutorfrom langchain_core.prompts import PromptTemplatefrom langchain_ollama import ChatOllamaimport os
# 设置 Tavily API Key(https://tavily.com 免费注册获取)os.environ["TAVILY_API_KEY"] = "tvly-dev-key"
# 初始化工具(中文描述帮助模型理解工具用途)tools = [ TavilySearchResults( max_results=3, description="搜索引擎,用于查找实时信息、新闻、百科知识等网络内容" )]
# 初始化本地模型llm = ChatOllama(model="qwen3:8b", temperature=0)
# 中文 ReAct 提示模板# 注意:Thought/Action/Action Input/Observation/Final Answer 必须保持英文# 这些是 Agent 的解析标记,改为中文会导致识别失败template = """尽可能回答用户问题。你可以使用以下工具:
{tools}
使用以下格式:
Question: 需要回答的输入问题Thought: 思考应该采取什么行动Action: 要执行的行动,必须是 [{tool_names}] 之一Action Input: 行动的输入(直接的问题或关键词)Observation: 行动执行后的返回结果...(Thought/Action/Action Input/Observation 可以重复多次)Thought: 我现在知道最终答案了Final Answer: 对原始问题的最终回答(用中文回答)
重要提示:当前年份是2026年,如果问题涉及最新事件,必须使用工具搜索,不要依赖预训练知识。
开始回答!
Question: {input}Thought:{agent_scratchpad}"""
# 创建提示模板prompt = PromptTemplate.from_template(template)
# 创建 Agentagent = create_react_agent(llm, tools, prompt)
# 创建执行器agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=False, # 关闭详细日志避免乱码 handle_parsing_errors=True, # 自动处理解析错误 max_iterations=5 # 最多思考5步,防止死循环)
# 运行查询if __name__ == "__main__": question = "2024年春晚节目单?" print(f"问题:{question}") print("-" * 50)
try: response = agent_executor.invoke({"input": question}) print(f"答案:{response['output']}") except Exception as e: print(f"执行出错:{e}")结果如下,展开
问题:2024年春晚节目单?--------------------------------------------------答案:2024年中央广播电视总台春节联欢晚会节目单如下(按实际顺序整理):
**主要节目:**1. **开场节目**《鼓舞龙腾》- 许娣、刘佩琪、苏有朋、陈龙、沙溢、王阳、胡歌、唐嫣、黄轩、辛芷蕾、杨幂、毛晓彤、宋轶、侯雯元、黄曦彦、史仓库、谭金淘、刘影等2. **歌曲**《嘿 少年》- 王凯、陈伟霆、朱一龙3. **相声**《我要不一样》- 岳云鹏、孙越4. **创意年俗秀**《别开生面》- 黑撒乐队、李亮节、白举纲、曾舜晞(特邀乐队:胡歌、唐嫣、辛芷蕾、陈龙)....2.4 完整RAG问答demo
from langchain_community.document_loaders import TextLoaderfrom langchain.text_splitter import CharacterTextSplitterfrom langchain_community.vectorstores import FAISSfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.runnables import RunnablePassthroughfrom langchain_core.output_parsers import StrOutputParserfrom langchain_ollama import ChatOllama, OllamaEmbeddings
# 1. 加载 & 切分(不变)loader = TextLoader("company_manual.txt", encoding="utf-8")
documents = loader.load()text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)texts = text_splitter.split_documents(documents)
# 2. 向量数据库(使用本地 Ollama 嵌入,无需 OpenAI API Key)embeddings = OllamaEmbeddings(model="shaw/dmeta-embedding-zh:latest")vectorstore = FAISS.from_documents(texts, embeddings)
# 3. 构建 LCEL RAG 链retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
template = """基于以下上下文回答问题。如果不知道,就说"根据资料无法确定"。
上下文:{context}
问题:{question}
请用中文回答:"""
prompt = ChatPromptTemplate.from_template(template)
def format_docs(docs): """将检索到的文档格式化为字符串""" return "\n\n".join(f"[来源{i+1}] {doc.page_content}" for i, doc in enumerate(docs))
# 构建链:输入 → 检索+格式化 → 填充模板 → LLM → 输出rag_chain = ( { "context": retriever | format_docs, # 检索并格式化文档 "question": RunnablePassthrough() # 直接传递用户问题 } | prompt | ChatOllama(model="qwen3:8b") | StrOutputParser())
# 4. 提问(新版用 invoke,不再传字典)result = rag_chain.invoke("公司的年假政策是什么?")print(result)
# 5. 如需查看来源(手动获取)docs = retriever.invoke("公司的年假政策是什么?")print("\n参考片段:")for i, doc in enumerate(docs, 1): print(f"{i}. {doc.page_content[:100]}...")结果如下,展开
公司的年假政策如下:
1. **年假天数**根据入职年限确定: - 入职满1年不满3年:每年5天带薪年假 - 入职满3年不满5年:每年7天带薪年假 - 入职满5年不满10年:每年10天带薪年假 - 入职满10年以上:每年15天带薪年假
2. **年假使用规则**: - 年假可累积至次年3月31日前使用,逾期清零。 - 申请年假需提前3个工作日通过OA系统提交申请,并经直接上级审批后方可休假。
3. **其他假期**按国家规定执行: - **婚假**:3天,晚婚者可享受15天(含周末)。 - **产假**:158天(含国家规定的98天基础产假和60天延长产假)。 - **男员工陪产假**:15天。
(依据来源1)
参考片段:1. 【科技有限公司员工手册】
第一章:考勤与休假制度
1.1 工作时间公司实行弹性工作制,核心工作时间为上午10:00至下午4:00。标准工作时长为每日8小时,每周40小时。上班时间可在上午8:3...2. 6.1 办公区域管理- 办公位保持整洁,下班时关闭电脑和显示器- 会议室使用后恢复原状,白板擦拭干净- 茶水间禁止讨论涉密信息- 访客需在前台登记并由员工全程陪同
6.2 着装要求周一至周...3. 第三章:报销与财务制度
3.1 差旅报销标准国内出差住宿标准:- 一线城市(北上广深):每晚不超过500元- 二线城市:每晚不超过400元- 三线城市:每晚不超过300元
交通标准:- ...