news 2026/5/16 0:34:14

用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/5/11 20:15:15

Web自动化测试教程

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、自动化测试基本介绍1、自动化测试概述:什么是自动化测试?一般说来所有能替代人工测试的方式都属于自动化测试,即通过工具和…

作者头像 李华
网站建设 2026/5/1 1:59:08

艾体宝方案 | 身份与访问管理(IAM)如何强化企业合规性

简介本文基于 IBM《2024 年数据泄露成本报告》揭示的全球数据安全现状,系统阐述了身份与访问管理(IAM)在企业合规管理中的核心价值。文章首先剖析了合规与 IAM 的紧密关联,指出 IAM 是实现高水准责任追溯、应对动态合规需求的关键…

作者头像 李华
网站建设 2026/5/1 22:10:33

实战蓝图:从诊断到闭环的GEO五步法操作体系

理解了GEO的“为什么”,下一步是关键且具体的“怎么做”。本文将系统拆解一套经过验证的、可落地的GEO实战框架,即“诊断、策略、生成、投放、迭代”五步闭环体系。 一、第一步:全景诊断 —— 摸清AI眼中的品牌现状 盲目优化等于资源浪费。…

作者头像 李华
网站建设 2026/5/13 8:45:22

mise 安装及使用指南

介绍mise(发音同 “mice”)是一款用 Rust 编写的高性能多运行时版本管理器,它能够帮助开发者在单个工具中统一管理多种编程语言和工具的版本。核心价值多语言统一管理:支持 Node.js、Python、Ruby、Go、Java、Rust 等多种语言和工…

作者头像 李华
网站建设 2026/5/14 15:00:35

好写作AI:当AI能写论文了,老师您到底在教什么、考什么?

当学生的论文查重率1%,文笔优美、格式规范,但被问到“你的核心论点是怎么想出来的”时却支支吾吾——老师,您是否也开始怀疑,自己批改的究竟是一份作业,还是AI的“产品使用报告”?尊敬的老师们,…

作者头像 李华