
文章目录环境准备3、新建python文件rag_demo代码4、运行结果环境准备python #3.111、卸载依赖(避免冲突)pipinstalllangchain0.3.0 langchain-core0.3.0 langchain-community0.3.0 langchain-huggingface0.1.0 chromadb sentence-transformers torch transformers2、安装依赖pip install langchain0.3.0langchain-core0.3.0langchain-community0.3.0langchain-huggingface0.1.0chromadb sentence-transformers torch transformers3、新建python文件rag_demo代码importosimportsysfromtypingimportDict,Any# --- 1. 导入最新 LangChain 组件 (v0.3) ---fromlangchain_core.documentsimportDocumentfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.runnablesimportRunnablePassthrough,RunnableLambda# 向量库与嵌入fromlangchain_community.vectorstoresimportChromafromlangchain_huggingfaceimportHuggingFaceEmbeddings# 文本分割fromlangchain_text_splittersimportCharacterTextSplitter# --- 2. 配置模型 ---EMBED_MODEL_NAMEBAAI/bge-small-zh-v1.5defmock_llm_func(input_data:Dict[str,Any])-str: 模拟 LLM 函数。 注意在 Chain 中经过 prompt 后输入通常是 ChatPromptValue。 为了兼容我们这里直接处理原始字典数据在 prompt 之前拦截或者调整链结构。 【修正策略】我们将模拟逻辑放在 prompt 格式化之后解析 messages。 但更简单的做法是不让 prompt 输出 ChatPromptValue而是直接输出字符串给模拟函数 或者让模拟函数能够处理 messages。 这里采用最通用的方式接收 messages 并提取用户问题上下文。 # input_data 在这里实际上是 ChatPromptValue 转换后的 messages 列表 (如果使用了 to_messages)# 或者如果是 RunnableLambda 直接接在 prompt 后它收到的是 ChatPromptValue# 为了演示简单我们改变链的结构# 不在 prompt 后直接接 lambda而是构造一个完整的字符串提示词给 lambdareturnf[模拟AI回答] 基于信息{input_data.get(context,无)}回答 {input_data.get(question,)}: LangChain 已成功运行defmain():print( 正在初始化 LangChain 0.3 (修复版)...)# --- A. 准备数据 ---raw_texts[LangChain 是一个用于开发由语言模型驱动的应用程序的框架。,Python 3.11 带来了显著的性能提升特别是对于异步操作。,LangChain 0.3 版本进行了重大的架构重构将社区集成移入了 langchain-community 包。,HuggingFace 提供了数千种免费的预训练模型包括嵌入模型和生成模型。,RAG (检索增强生成) 技术通过结合外部知识库来提高大模型的准确性。]documents[Document(page_contenttext)fortextinraw_texts]# --- B. 文本分割 ---text_splitterCharacterTextSplitter(chunk_size100,chunk_overlap0)splitstext_splitter.split_documents(documents)# --- C. 初始化嵌入模型 ---print(f⏳ 加载嵌入模型:{EMBED_MODEL_NAME}...)try:embeddingsHuggingFaceEmbeddings(model_nameEMBED_MODEL_NAME,model_kwargs{device:cpu},encode_kwargs{normalize_embeddings:True})exceptExceptionase:print(f❌ 模型加载失败:{e})return# --- D. 构建向量存储 ---vectorstoreChroma.from_documents(documentssplits,embeddingembeddings)retrievervectorstore.as_retriever(search_kwargs{k:2})# --- E. 定义提示词模板 ---template基于以下已知信息回答问题。 已知信息: {context} 问题: {question} 回答:promptChatPromptTemplate.from_template(template)# --- F. 【关键修复】构建链 ---# 错误原因之前是Prompt 输出 ChatPromptValue - Lambda (期望 dict)# 修复方法使用 RunnableLambda 处理 dict 输入并在 Prompt 之前完成上下文组装# 或者让 Lambda 处理 messages。# 方案我们手动组装字符串传给模拟函数绕过 ChatPromptValue 的复杂性# 这样最适合“模拟”场景不需要真正的 Message 对象defformat_docs(docs):return\n\n.join([d.page_contentfordindocs])defsimple_mock_chain(input_dict): 完全手动的模拟链不依赖 ChatPromptTemplate 的复杂对象 确保在没有任何 API Key 的情况下绝对可运行。 contextinput_dict[context]questioninput_dict[question]full_promptf基于以下已知信息回答问题。\n已知信息:{context}\n问题:{question}\n回答:# 模拟 LLM 思考returnf AI 回复: 根据资料 {context[:20]}..., 关于 {question} 的答案是LangChain 流程跑通了# 构建正确的链# 1. 检索文档并格式化为字符串# 2. 将 context 和 question 组装成字典# 3. 传入我们的模拟函数retrieval_chain({context:retriever|format_docs,question:RunnablePassthrough()}|RunnableLambda(simple_mock_chain))# --- G. 执行测试 ---print(\n*50)test_questions[LangChain 是什么,Python 3.11 有什么特点,RAG 技术是如何工作的]forqintest_questions:print(f\n 用户:{q})try:responseretrieval_chain.invoke(q)print(f{response})exceptExceptionase:print(f❌ 出错:{e})importtraceback traceback.print_exc()print(\n*50)print(✅ 演示成功无 ChatPromptValue 错误。)if__name____main__:os.environ[HF_ENDPOINT]https://hf-mirror.comtry:main()exceptKeyboardInterrupt:print(\n 中断。)4、运行结果 正在初始化 LangChain0.3(修复版)... ⏳ 加载嵌入模型: BAAI/bge-small-zh-v1.5... 用户: LangChain 是什么 AI 回复: 根据资料LangChain 是一个用于开发由语言..., 关于LangChain 是什么的答案是LangChain 流程跑通了 用户: Python3.11有什么特点 AI 回复: 根据资料Python 3.11 带来了显著的性能..., 关于Python 3.11 有什么特点的答案是LangChain 流程跑通了 用户: RAG 技术是如何工作的 AI 回复: 根据资料RAG (检索增强生成) 技术通过结合外..., 关于RAG 技术是如何工作的的答案是LangChain 流程跑通了✅ 演示成功无ChatPromptValue错误。