ifnot os.getenv("GOOGLE_API_KEY"): os.environ["GOOGLE_API_KEY"] = getpass.getpass("Enter your Google API Key: ")
from langchain_community.document_loaders import UnstructuredMarkdownLoader, PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_google_genai import GoogleGenerativeAIEmbeddings
import faiss from langchain_community.vectorstores import FAISS from langchain_community.docstore.in_memory import InMemoryDocstore
from langchain_core.documents import Document from langchain_core.runnables import chain
for document in retriever.invoke("What was Nike's revenue in 2023?"): print("--------------------------------") print(f"文档内容: {document.page_content}")
上述代码能构建基本的语义搜索引擎,但是在部分的语句搜索上表现不佳:例如 "What was Nike's revenue in 2023?" 这个问题,能检索到相关文档;但是 "When was Nike incorporated?"这个问题,搜索结果相关性不佳。在官方文档演示示例中,返回的结果中直接包含了 “revenue” 关键词,但是实践后获取的文档中并没有对应关键词。 就结果而言,models/embedding-001 这款嵌入模型,最大 token 为 2048,返回的向量维度为 768,处理能力优秀。但是实际表现可能与官方演示存在偏差。
阶段总结
说实话,LangChain 的学习曲线有点陡峭,尤其是 StateGraph 的概念和实现方式。StateGraph 通过节点和函数的映射来处理状态流转,这种方式在复杂应用中非常有用,但也需要对数据流转有清晰的理解。 但是,LangChain 作为一个快速 LLM 应用开发框架,对于 AI 服务的封装有些过度,导致开发者对于 AI 服务的自定义能力和控制能力受限,像是使用非主流 AI 服务时,可能需要手动封装一些接口,或者使用 runnable 接口来实现自定义的调用方式。
***记于 2025/7/10:***目前还是不打算深入研究 LangChain,其内部的实现过于复杂,并且目前热门的开源项目多不以 LangChain 为基础。还是先以研究各种开源项目使用 AI 的方式为主,再决定是否深入研究 LangChain。