🦜️🔗 LangChain .NET
⚡ 通过可组合性构建LLM应用程序 ⚡
LangChain的C#实现。我们尽量在抽象概念上与原始版本保持一致,但也对新实体持开放态度。
虽然SemanticKernel很好,我们会尽可能使用它,但我们认为它有许多局限性,并且基于微软技术。 我们的立场是提供最大可选择的可用选项,并且愿意在单个实现中使用第三方库。
我想说明:
- 我一个人可能无法取得重大进展,所以我的目标是团结C#开发者的力量,创建LangChain的C#版本,并控制最终项目的质量
- 我会尽量在24小时内接受任何Pull Request(当然,这取决于具体情况,但我会尽力)
- 我也在寻找开发者加入核心团队。我会尽可能赞助他们,并分享收到的任何资金。
- 我也会在Discord上对与项目相关的任何问题做出相当快速的回应
使用方法
你可以使用我们的wiki来开始:https://github.com/tryAGI/LangChain/wiki
如果wiki中包含未更新的代码,你随时可以查看相关测试
另外,请查看示例了解使用示例或测试。
// 从零开始运行的价格(创建嵌入和请求LLM):0.015美元
// 如果数据库已存在,重新运行的价格:0.0004美元
// 依赖项:LangChain, LangChain.Databases.Sqlite, LangChain.DocumentLoaders.Pdf
// 初始化模型
var provider = new OpenAiProvider(
Environment.GetEnvironmentVariable("OPENAI_API_KEY") ??
throw new InconclusiveException("OPENAI_API_KEY未设置"));
var llm = new OpenAiLatestFastChatModel(provider);
var embeddingModel = new TextEmbeddingV3SmallModel(provider);
// 从哈利·波特书籍PDF创建向量数据库
using var vectorDatabase = new SqLiteVectorDatabase(dataSource: "vectors.db");
var vectorCollection = await vectorDatabase.AddDocumentsFromAsync<PdfPigPdfLoader>(
embeddingModel, // 用于将文本转换为嵌入
dimensions: 1536, // 对于TextEmbeddingV3SmallModel应为1536
dataSource: DataSource.FromUrl("https://canonburyprimaryschool.co.uk/wp-content/uploads/2016/01/Joanne-K.-Rowling-Harry-Potter-Book-1-Harry-Potter-and-the-Philosophers-Stone-EnglishOnlineClub.com_.pdf"),
collectionName: "harrypotter", // 可以省略,如果你想有多个集合则使用
textSplitter: null); // 默认为CharacterTextSplitter(ChunkSize = 4000, ChunkOverlap = 200)
// 现在我们有两种方法:使用异步方法或使用链
// 1. 异步方法
// 为问题找到相似的文档
const string question = "谁在喝独角兽的血?";
var similarDocuments = await vectorCollection.GetSimilarDocuments(embeddingModel, question, amount: 5);
// 使用相似文档和LLM回答问题
var answer = await llm.GenerateAsync(
$"""
使用以下上下文片段来回答最后的问题。
如果答案不在上下文中,就说你不知道,不要试图编造答案。
尽可能简短地回答。
{similarDocuments.AsString()}
问题:{question}
有帮助的答案:
""", cancellationToken: CancellationToken.None).ConfigureAwait(false);
Console.WriteLine($"LLM回答:{answer}"); // 披着斗篷的身影。
// 2. 链
var promptTemplate =
@"使用以下上下文片段来回答最后的问题。如果答案不在上下文中,就说你不知道,不要试图编造答案。尽可能简短地回答。始终在你的回答中引用上下文。
{context}
问题:{text}
有帮助的答案:";
var chain =
Set("谁在喝独角兽的血?") // 设置问题(默认键是"text")
| RetrieveSimilarDocuments(vectorCollection, embeddingModel, amount: 5) // 获取5个最相似的文档
| CombineDocuments(outputKey: "context") // 将文档组合在一起并放入上下文
| Template(promptTemplate) // 用它们的值替换提示中的上下文和问题
| LLM(llm.UseConsoleForDebug()); // 将结果发送给语言模型
var chainAnswer = await chain.RunAsync("text", CancellationToken.None); // 获取链结果
Console.WriteLine("链回答:"+ chainAnswer); // 打印结果
Console.WriteLine($"LLM使用情况:{llm.Usage}"); // 打印使用情况和价格
Console.WriteLine($"嵌入模型使用情况:{embeddingModel.Usage}"); // 打印使用情况和价格
特色项目
- LangChainChat - 允许你运行基于Blazor项目的聊天,使用LangChain.Serve和任何支持的本地或付费模型
贡献者
支持
错误报告优先地址: https://github.com/tryAGI/LangChain/issues
想法和一般问题优先地址: https://github.com/tryAGI/LangChain/discussions
Discord: https://discord.gg/Ca2xhfBf3v
法律信息和版权
本项目基于MIT许可证授权。我们在可预见的未来不打算更改此项目的许可证,但组织内基于此项目的其他项目可能使用不同的许可证。 部分文档基于dotnet/docs仓库的文档,采用CC BY 4.0许可证, 其中的代码示例已更改为使用本项目的代码示例。
致谢
本项目得到了JetBrains通过开源支持计划的支持。