news 2026/4/15 13:38:48

用langchain写个示例代码调用它的特色功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用langchain写个示例代码调用它的特色功能

当然可以!下面是一个完整的 Python 实例,使用 LangChain(v0.2+ / v1.x 兼容)演示其六大核心特色功能:

  • ✅ 模块化组件(Prompt + LLM + OutputParser)
  • ✅ 外部数据集成(RAG:加载本地文档 + 向量检索)
  • ✅ 记忆(Memory:多轮对话上下文)
  • ✅ 链(Chain:声明式 LCEL 流水线)
  • ✅ 代理(Agent:调用工具执行动作)
  • ✅ 回调(Callback:打印日志)

💡 假设你已安装必要依赖:

pip install langchain langchain-openai langchain-community faiss-cpu pypdf

🧪 完整代码示例:带记忆、知识库和工具的智能客服

import os from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import FAISS from langchain.chains import create_history_aware_retriever, create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.messages import HumanMessage, AIMessage from langchain.memory import ConversationBufferMemory from langchain.agents import Tool, initialize_agent, AgentType from langchain.callbacks import StdOutCallbackHandler # === 1. 设置大模型(Model I/O)=== llm = ChatOpenAI( model="gpt-4o-mini", temperature=0.3, api_key=os.getenv("OPENAI_API_KEY") # 请设置环境变量 ) # === 2. 加载外部知识(RAG 数据连接)=== # 假设当前目录有 `faq.pdf`(可替换为任意 PDF/文本) loader = PyPDFLoader("faq.pdf") docs = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) splits = text_splitter.split_documents(docs) vectorstore = FAISS.from_documents(splits, OpenAIEmbeddings()) retriever = vectorstore.as_retriever() # === 3. 构建带记忆的检索问答链(Chain + Memory)=== prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个客服助手。请基于以下上下文回答问题:\n{context}"), MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}") ]) document_chain = create_stuff_documents_chain(llm, prompt) retriever_chain = create_history_aware_retriever(llm, retriever, ChatPromptTemplate.from_messages([ MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}"), ("human", "根据对话历史,生成一个搜索查询以查找相关信息。") ]) ) qa_chain = create_retrieval_chain(retriever_chain, document_chain) # === 4. 定义工具(Tools for Agent)=== def send_email(to: str, content: str) -> str: # 模拟发邮件(实际可调用 SMTP 或 API) return f"✅ 邮件已发送至 {to},内容:{content[:30]}..." email_tool = Tool( name="send_email", func=send_email, description="当用户要求发送邮件时使用,参数:to(邮箱地址),content(邮件内容)" ) # === 5. 初始化带工具的 Agent(Agents)=== agent = initialize_agent( tools=[email_tool], llm=llm, agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, verbose=True, memory=ConversationBufferMemory(memory_key="chat_history", return_messages=True), handle_parsing_errors=True ) # === 6. 回调处理器(Callbacks)=== handler = StdOutCallbackHandler() # === 7. 模拟用户交互 === chat_history = [] def ask_question(user_input: str): global chat_history # 先尝试用 RAG 知识库回答 try: response = qa_chain.invoke({ "input": user_input, "chat_history": chat_history }) answer = response["answer"] chat_history.extend([HumanMessage(content=user_input), AIMessage(content=answer)]) print(f"🤖 (知识库): {answer}\n") except Exception as e: answer = None # 如果知识库无法回答,交给 Agent 决策是否调用工具 if not answer or "不知道" in answer or "无法回答" in answer: print("🔄 转交 Agent 处理...") agent_response = agent.run(user_input, callbacks=[handler]) chat_history.append(HumanMessage(content=user_input)) chat_history.append(AIMessage(content=agent_response)) print(f"🤖 (Agent): {agent_response}\n") # === 8. 测试对话 === if __name__ == "__main__": # 示例:先问知识库问题,再要求发邮件 ask_question("你们的退货政策是什么?") # 从 faq.pdf 中检索 ask_question("请把刚才的回答发到 user@example.com") # 触发 send_email 工具

🔍 功能亮点说明:

表格

特性代码体现
模块化ChatPromptTemplate+StrOutputParser+FAISS各司其职
RAGPyPDFLoader+FAISS构建私有知识库
记忆chat_history传递上下文,支持多轮问答
链(LCEL)create_retrieval_chain是典型 Chain 编排
Agent + Toolsinitialize_agent+ 自定义send_email工具
回调StdOutCallbackHandler()打印执行过程

📝 使用前准备:

  1. 设置 OpenAI API Key:export OPENAI_API_KEY='your-key'
  2. 准备一个faq.pdf文件(或修改代码加载其他文档)
  3. 首次运行会下载 embedding 模型(约 500MB)

这个例子展示了 LangChain 如何将知识检索、对话记忆、工具调用无缝融合,构建一个接近生产级的智能应用。你可以在此基础上扩展数据库查询、Web 搜索、多模态等能力。需要更简化的版本或特定场景(如纯代码生成、Excel 分析),也可以告诉我!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 23:27:25

核电站反应堆数字孪生 + 大模型:安全状态监测与风险预警技术

点赞、关注、收藏,不迷路 核电站反应堆作为核电装备的核心核心,是集高温高压、强放射性、多物理场耦合、运行工况复杂于一体的精密系统,其安全稳定运行直接关系到核电项目的生产安全与周边生态安全。传统反应堆安全状态监测与风险预警模式存在…

作者头像 李华
网站建设 2026/4/13 11:47:43

直流电机速度单闭环控制系统:Matlab/Simulink 仿真与实现

直流电机速度单闭环控制系统(电机为传递函数建模) matlab/simulink 仿真模型设计报告 在控制系统领域,直流电机的速度控制是一个经典且重要的课题。今天咱们就来讲讲基于传递函数建模的直流电机速度单闭环控制系统,并用 Matlab/S…

作者头像 李华
网站建设 2026/4/9 9:42:14

优化SEO效果的长尾关键词策略与应用分享

在优化SEO效果的长尾关键词策略中,内容概要扮演着引导读者理解的关键角色。通过对长尾关键词的分析与阐释,读者能够明确其重要性以及在实际应用中的具体策略。本段将概述长尾关键词如何在提高网站流量和排名方面发挥作用,并简要介绍选择与应用…

作者头像 李华
网站建设 2026/3/13 12:09:28

10410_基于Springboot的文化旅游宣传网站

1、项目包含项目源码、项目文档、数据库脚本、软件工具等资料;带你从零开始部署运行本套系统。2、项目介绍以甘南藏族自治州为例,其丰富的自然遗产与人文景观构成了独特的旅游生态体系,年接待游客量突破千万人次的背景下,旅游管理…

作者头像 李华
网站建设 2026/4/13 23:32:22

计算机毕业设计springboot高校师范生实习管理小程序 基于SpringBoot的高校师范生教育实习过程管理与协同平台 SpringBoot框架下的师范生教学实践移动化管理信息系统

计算机毕业设计springboot高校师范生实习管理小程序 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 在教育数字化转型持续深化的背景下,师范生教育实习作为连接理论…

作者头像 李华